目录
1.实战篇第一课
我们将会在本次实战中学习到哪些知识点?
开发模式和环境搭建:
注册接口
1.Lombok
2.开发流程
1.controller层,这个层会指明访问路径和要执行的逻辑:
2.我们把返回结果根据接口文档包装成一个类result,它有code代表成败,message代表返回信息,data代表响应数据
3.service接口和service实现类,实现controller层调用的方法,并且对数据进行加密:
4.Mapper层,使用@select,@Insert等注释在Mapper层实现对数据库的操作:
5.至此三层写完,实现了注册的流程,我们可以使用postman测试api是否可用(测试用的JSON文件另外提供):
2.学习过程中的疑惑:
1.@Controller和@RestController有啥区别
@Controller
@RestController
总结
示例代码
使用 @Controller
使用 @RestController
2. 什么是RESTful web 服务
RESTful Web 服务的特点:
RESTful Web 服务的操作:
示例:
3.@RequestMapping 或 @GetMapping、@PostMapping的区别
@RequestMapping
@GetMapping
@PostMapping
示例
使用 @RequestMapping
使用 @GetMapping 和 @PostMapping
注意事项
4.$和#在Spring中的区别
# 符号
$ 符号
示例
使用 # 符号
使用 $ 符号
总结
1.实战篇第一课
我们将会在本次实战中学习到哪些知识点?
开发模式和环境搭建:
步骤:
1.在xml文件中引入启动依赖,如web、mybatis、MySQL:
2.在yml文件中配置mybatis的参数:
3.创建项目结构和实体类:
4.配置启动类,添加@SpringBootApplication和SpringApplication.run()方法:
注册接口
1.Lombok
为了避免手动编写大量的 getter 和 setter 方法以及构造方法,你可以使用 Lombok 库。Lombok 是一个 Java 库,可以通过注解自动生成 getter、setter、构造方法等。
例如,在类上添加 @Data
注解,Lombok 会自动为类中的所有字段生成 getter 和 setter 方法,以及一个全参构造方法和一个无参构造方法:
@Data
public class User {
private Integer id;//主键ID
private String username;//用户名
private String password;//密码
private String nickname;//昵称
private String email;//邮箱
private String userPic;//用户头像地址
private LocalDateTime createTime;//创建时间
private LocalDateTime updateTime;//更新时间
}
它在编译后的class里面会包含getset方法以及equals,toString等方法:
lombok还有这两个注释,可以让你不用手动去写构造方法。
2.开发流程
对于一个注册模块,思考他的三层架构长什么样?
1.controller层,这个层会指明访问路径和要执行的逻辑:
2.我们把返回结果根据接口文档包装成一个类result,它有code代表成败,message代表返回信息,data代表响应数据
3.service接口和service实现类,实现controller层调用的方法,并且对数据进行加密:
工具类md5,这是一个加密工具类,调用里面的getMd5String()方法可以返回一个加密好的密码
4.Mapper层,使用@select,@Insert等注释在Mapper层实现对数据库的操作:
5.至此三层写完,实现了注册的流程,我们可以使用postman测试api是否可用(测试用的JSON文件另外提供):
测试成功!
2.学习过程中的疑惑:
1.@Controller和@RestController有啥区别
在 Spring MVC 框架中,@Controller
和 @RestController
都是用来创建控制器的注解注解,但它们有一些关键的区别:
@Controller
-
@Controller
是一个通用的控制器注解注解,它主要用于处理传统的 MVC 模型,其中控制器只负责处理请求,返回视图(页面)和模型(数据)。 -
使用
@Controller
时,返回的数据通常通过视图解析器(ViewResolver)解析为具体的页面。 -
它通常与
@RequestMapping
或@GetMapping
、@PostMapping
等注解一起使用来映射请求路径。 -
@Controller
控制器通常返回一个ModelAndView
对象,或者返回一个视图名称让视图解析器决定如何渲染视图。
@RestController
-
@RestController
是@Controller
和@ResponseBody
注解的结合体,用于创建 RESTful web 服务。 -
使用
@RestController
时,Spring MVC 会自动将返回的对象序列化为 JSON 格式(默认使用 Jackson 库),并直接写入 HTTP 响应体中,而不是返回一个视图名称。 -
@RestController
通常用于构建 API 接口,它使得编写 RESTful 服务变得更加简单。 -
它也与
@RequestMapping
或@GetMapping
、@PostMapping
等注解一起使用来映射请求路径。
总结
-
如果你需要返回一个视图(如 JSP 页面),使用
@Controller
。 -
如果你需要返回 JSON 或 XML 格式的数据,使用
@RestController
。
示例代码
使用 @Controller
java复制
@Controller
public class MyController {
@RequestMapping("/hello")
public String sayHello(Model model) {
model.addAttribute("message", "Hello, World!");
return "hello"; // 返回视图名称
}
}
使用 @RestController
java复制
@RestController
public class MyRestController {
@GetMapping("/hello")
public Map<String, Object> sayHello() {
Map<String, Object> map = new HashMap<>();
map.put("message", "Hello, World!");
return map; // 直接返回 JSON 数据
}
}
2. 什么是RESTful web 服务
RESTful Web 服务是一种基于表现层状态转移(Representational State Transfer,简称 REST)原则构建的网络应用程序接口(API)。REST 是由 Roy Fielding 在 2000 年提出的,它是一种设计风格,用于设计网络应用程序,以便它们可以通过标准的 HTTP 方法访问和操作网络资源。
RESTful Web 服务的特点:
-
无状态(Stateless): 每个请求从客户端到服务器必须包含所有必要的信息来理解和处理请求,服务器不会存储任何会话信息。
-
统一接口(Uniform Interface): 通过统一和预定义的接口简化和标准化架构之间的交互。RESTful API 通常使用标准的 HTTP 方法(如 GET、POST、PUT、DELETE)来操作资源。
-
可缓存(Cacheable): 响应可以被标记为可缓存或不可缓存。这可以减少网络通信量,提高响应速度。
-
分层系统(Layered System): 客户端不能通常不能直接知道它是否正在与中间层(如代理服务器、网关或应用服务器)通信,还是直接与最终服务器通信。
-
按需代码(Code on Demand,可选): 服务器可以按需向客户端发送代码(如 JavaScript),以扩展客户端的功能。
-
超文本传输协议(HTTP): RESTful Web 服务通常使用 HTTP 协议来传输数据,这使得它们可以在 Web 浏览器中直接访问。
RESTful Web 服务的操作:
-
GET:请求从服务器检索特定资源。
-
POST:在服务器上创建一个新的资源。
-
PUT:更新服务器上的现有资源或创建一个新资源。
-
DELETE:从服务器删除特定资源。
示例:
假设有一个 RESTful Web 服务用于管理博客文章:
-
GET /articles
:检索所有文章的列表。 -
GET /articles/{id}
:检索特定 ID 的文章。 -
POST /articles
:创建一篇新文章。 -
PUT /articles/{id}
:更新特定 ID 的文章。 -
DELETE /articles/{id}
:删除特定 ID 的文章。
RESTful Web 服务因其简单性、可扩展性和易于维护性而在现代 Web 开发中非常流行。它们使得不同应用程序和服务之间的交互变得更加容易,并且可以轻松地与各种客户端(包括浏览器、移动应用和第三方服务)集成。
3.@RequestMapping 或 @GetMapping、@PostMapping的区别
在 Spring MVC 框架中,@RequestMapping
、@GetMapping
和 @PostMapping
是用于映射 HTTP 请求到处理器方法上的注解(annotations)。这些注解帮助定义了 URL 路径和 HTTP 方法之间的对应关系。
@RequestMapping
@RequestMapping
是一个通用的请求映射注解,它可以映射到任何 HTTP 方法。它是最灵活的映射注解,可以指定路径、方法、参数等。@RequestMapping
可以用于类或方法上。
-
用于方法上:映射特定的 HTTP 请求到一个处理方法。
-
用于类上:为类中的所有方法提供一个共同的基础请求路径。
@GetMapping
@GetMapping
是 @RequestMapping
的一个特化,专门用于映射 HTTP GET 请求。它简化了只处理 GET 请求的方法的定义。
@PostMapping
@PostMapping
也是 @RequestMapping
的一个特化,专门用于映射 HTTP POST 请求。它用于处理需要通过 POST 方法提交数据的场景。
示例
使用 @RequestMapping
java复制
@Controller
public class MyController {
@RequestMapping(value = "/users", method = RequestMethod.GET)
public String listUsers(Model model) {
// 获取用户列表并添加到模型中
model.addAttribute("users", userService.findAll());
return "userList"; // 返回视图名称
}
@RequestMapping(value = "/users", method = RequestMethod.POST)
public String addUser(@ModelAttribute("user") User user) {
// 保存新用户
userService.save(user);
return "redirect:/users"; // 重定向到用户列表
}
}
使用 @GetMapping
和 @PostMapping
java复制
@RestController
public class MyRestController {
@GetMapping("/users")
public List<User> listUsers() {
// 获取用户列表并返回
return userService.findAll();
}
@PostMapping("/users")
public User addUser(@RequestBody User user) {
// 保存新用户并返回
return userService.save(user);
}
}
注意事项
-
返回类型:
@Controller
通常返回视图名称,而@RestController
返回数据(如 JSON)。 -
请求体:
@RequestBody
注解用于将 HTTP 请求体绑定到方法参数上,通常与@PostMapping
一起使用。 -
路径变量:可以使用
{variableName}
语法在路径中定义变量,例如@RequestMapping("/users/{userId}")
。
这些注解使得在 Spring MVC 中处理不同类型的 HTTP 请求变得更加简单和直观。通过合理使用这些注解,可以清晰地定义应用程序的 API 接口。
4.$和#在Spring中的区别
在 Spring 框架中,$
和 #
这两个符号在不同的上下文中有不同的用途,尤其是在 Spring Expression Language(SpEL)和 Bean 属性注入中。
#
符号
在 Spring 中,#
符号通常与 SpEL(Spring Expression Language)一起使用。SpEL 是一种功能强大的表达式语言,它支持在运行时查询和操作对象图。
-
属性访问:使用
#
可以访问对象的属性。例如,#user.name
可以获取user
对象的name
属性。 -
方法调用:使用
#
可以调用对象的方法。例如,#math.max(1, 2)
可以调用math
对象的max
方法。 -
数组和集合访问:使用
#
可以访问数组和集合的元素。例如,#users[0]
可以获取users
集合的第一个元素。
$
符号
在 Spring 中,$
符号通常用于属性占位符,它允许你引用配置文件中的值。
-
配置文件引用:使用
$
可以引用外部配置文件(如application.properties
或application.yml
)中的值。例如,${app.name}
可以引用配置文件中的app.name
属性。 -
环境变量引用:使用
$
也可以引用环境变量。例如,${ENV_VAR}
可以引用名为ENV_VAR
的环境变量。
示例
使用 #
符号
假设你有一个 User
类,并且想要在 Spring 中通过 SpEL 获取 User
对象的 name
属性:
java复制
public class User {
private String name;
// getters and setters
}
@Autowired
private User user;
public String getUserName() {
return user.getName(); // Java 代码直接访问
// 或者使用 SpEL
// return #user.name;
}
使用 $
符号
假设你的 application.properties
文件中有以下配置:
properties复制
app.name=MyApp
你可以在 Spring 应用中这样引用它:
java复制
@Value("${app.name}")
private String appName;
public void printAppName() {
System.out.println(appName); // 输出:MyApp
}
总结
-
#
符号用于 SpEL 中,用于对象图的查询和操作。 -
$
符号用于属性占位符,用于引用配置文件或环境变量中的值。
这两个符号在 Spring 框架中扮演着不同的角色,正确使用它们可以提高代码的灵活性和可维护性。