主要对Spring MVC的核心注解的应用进行了详细讲解,介绍了Controller和RequestMapping注解类型的相关知识。
1.注解式控制器概念
Spring2.5之前,我们都是通过实现框架提供的Controller接口来定义我们的处理器类。
Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类。并且提供了一组强大的注解:
-
@Controller:用于标识是处理器类;
-
@RequestMapping:用于从客户端到控制器的地址映射;
-
@RequestParam:用于客户端参数注入到控制器的数据绑定;
-
@ModelAttribute:请求参数到对象的绑定
Spring3.0以上引入了对RESTfu架构风格的支持(通过@PathVariable注解和一些其他特性来支持),且又引入了更多的注解支持。
@CookieValue:Cookie数据绑定;
@RequestHeader:请求头数据参数绑定;
@RequestBody:将请求Body进行绑定 HttpMessageConverter转换;
@ResponseBody:将返回值作为响应体;
@ExceptionHandler:声明式异常处理器 HttpMessageConverter转换;
@PathVariable:URI模板变量的绑定
之后的spring版本每次升级,都会提供更多的注解帮助程序开发者进行快速开发,提高开发效率。
2.Spring注解版本支持
Spring2.0 开始引入注解:
-
@Required、@Repository(用于dao层)、@Aspect 等注解
spring 2.5,引入大量注解、配合配置文件中的注解(包)扫描:
- @Component、@Service @Controller 相关
spring3.1,引入新的注解,可以不再使用xml配置ioc:
- @Configuration 注册配置类 、@Bean 配置类中的bean注册 @Scope 作用域注解
- @ComponentScan 用来扫描 @Controller @Service @Repository
- @Import 增强,用在配置类上,将@Import中的类直接注册到spring中
- @Autowired、@Qualifier 与@Autowired配合, 指定注入的bean的名称 @Autowired有一个required属性
- @Primary有多个相同类型的bean时,使用@Primary来赋予bean更高的优先级
- @Enable管理第三方Bean 如@EnableScheduling 官方提供的@Enable注解包括@EnableScheduling @EnableAsync @EnablewebMvc,实际上,我们还可以自己去实现、自定义自己的@EnableXxx注解
Spring 4.X,引入:
- @Conditional条件注解 、 @RestController(相当于@Controller+@ResponseBody) @Profile 适用的环境@PropertySource 加载配置文件
Spring5.x
- @Indexed 用来提升性能的注解
3.案例实践:使用注解完成Spring MVC的控制器基本功能
案例说明:通过一个登陆验证的案例,使用Spring MVC注解的方式来实现控制器及其请求路径映射功能,体会注解在Spring MVC开发中的特点。
3.1 配置SpringMVC的核心映射文件springmvc-servlet.xml。
<?xml version="1.0" encoding="UTF-8"?>
<!--增加xmlns:context命名空间及其约束:注解的相关配置 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 开启注解扫描-->
<context:component-scan base-package="com.inspur.action"></context:component-scan>
</beans>
3.2 新建后台登录处理器类LoginController.java。
@Controller
public class LoginController{
@RequestMapping("/loginCheck.action")
public ModelAndView loginCheck(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mav=new ModelAndView();
String name=request.getParameter("userName");
String password=request.getParameter("password");
if("123".equals(password)){
mav.addObject("info", "欢迎你"+name);
mav.setViewName("success.jsp");
}
return mav;
}
}
3.3 新建后台登录界面login.jsp。
<body>
<h3>登录页面</h3>
<form action="/Springmvc_Ch12/loginCheck.action" method="post">
请输入用户名:<input type="text" name="userName"/><br/>
请输入密码:<input type="password" name="password"/><br/>
<input type="submit" value="点击登录"/>
</form>
</body>
3.4 使用注解对请求方式进行匹配处理。
@RequestMapping(value="/test.action",method={RequestMethod.GET})
public String test(){
System.out.println("hello success");
return "success.jsp";
}
4.使用注解完成Spring MVC的参数绑定功能
Spring MVC框架为了提高开发者的开发效率,提供了很多的参数绑定功能,这些功能为开发者节约了大量的重复工作。
4.1 Spring MVC默认支持的参数绑定。
在前面的用户登录案例中,当路径匹配成功后,程序进入具体的业务方法,此时进行登录模拟验证时,我们直接使用了HttpServletRequest request对象进行获取了页面参数值。这里的request对象就是框架默认封装好,供开发者直接使用的对象,除此之外,还有HttpServletResponse对象,HttpSession对象也是比较常用的默认绑定参数对象。
4.2 通过@RequestParam注解,实现类型基本类型和字符串参数值的绑定。
Spring MVC框架为方便实际开发时,大量页面参数值需要通过请求对象传递到后端,使用注解的形式直接将参数数据注入到后端程序中,但必须按照一定的规则才能顺利完成绑定和注入。
<form action="/springMvc01/user/register" method="post">
用户名:<input type="text" name="userName"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="注册">
</form>
@PostMapping("/register")
public Result register(@RequestParam("userName") String username, @RequestParam String password) {
System.out.println(username+": "+password);
return Result.success();
}
4.3 通过@RequestParam注解,实现引用类型参数值的绑定。
在实际开发中,有时从前端页面需要的数据非常杂乱,此时如果将这些数据封装成对象,则在后台接收数据时就相对方便,节约了后台代码的书写量。Spring MVC的参数映射注解同样提供了这样的功能。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer userId;
private String username;
private String password;
}
@PostMapping
public Result addUser(User user) {
// 添加用户
userService.addUser(user);
return Result.success("添加用户成功");
}
5.使用注解完成Spring MVC参数绑定时的类型转换
Spring MVC框架的参数绑定功能,对提高开发效率提供了非常大的帮助,在实际开发中,页面参数都是以字符串的类型传递的,而在后台控制器中,需要的数据类型可能是多种多样的。有些类型必须由程序员进行手动的转换,而有些常见的类型,如字符串类型到int类型的转换,非常常见。为了让程序员把更多的 精力放到业务逻辑上,框架提供了一些类型的转换机制。
5.1 参数类型的自动转换
Spring MVC框架对页面输入的字符串类型数据,如果通过@RequestParam注解需要转换为基本类型数据,则进行自动转换。
5.2 字符串参数与其他非基本类型的转换
Spring MVC框架除了提供对一些简单类型的自动转换之外,针对实际开发中常见的一些非基本类型,如日期类型等,也提供了与字符串类型之间的转换工具。
6.Spring MVC框架中常用的注解及属性配置
6.1 @RequestParam
6.1.1 功能
用于将请求参数区数据映射到功能处理方法的参数上。
例子:public String requestparam1(@RequestParam String username)
①如果请求中包含username参数(如/requestparam1?username=zhang),则自动传入。
②也可以使用@RequestParam("username")明确告诉Spring Web MVC使用username进行入参
6.1.2 主要参数
value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报400错误码;
defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#{systemProperties[‘java.vm.version’]}”。
例子1:public String test(@RequestParam(value="username",required=false) String username)
表示请求中可以没有名字为username的参数,如果没有默认为null,需注意如下几点:
①原子类型:必须有值,否则抛出异常,如果允许空值请使用包装类代替。
②Boolean包装类型类型:默认Boolean.FALSE,其他引用类型默认为null。
6.2 @PathVariable
6.2.1 功能
用于将请求URL中的模板变量映射到功能处理方法的参数上
例子:
@RequestMapping(value="/users/{userId}/topics/{topicId}")
public String test(
@PathVariable(value="userId") int userId,
@PathVariable(value="topicId") int topicId)
如请求的URL为“控制器URL/users/123/topics/456”,则自动将URL中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456
6.3 @CookieValue
6.2.3 功能
用于将请求的Cookie数据映射到功能处理方法的参数上
例子1:
public String test(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId)
如上配置将自动将JSESSIONID值入参到sessionId参数上,defaultValue表示Cookie中没有JSESSIONID时默认为空。
例子2:
public String test2(@CookieValue(value="JSESSIONID", defaultValue="") Cookie sessionId)
传入参数类型也可以是javax.servlet.http.Cookie类型。
@CookieValue也拥有和@RequestParam相同的三个参数,含义一样。
6.4 @RequestHeader
6.4.1 功能
用于将请求的头信息区数据映射到功能处理方法的参数上
例子:
@RequestMapping(value="/header")
public String test(
@RequestHeader("User-Agent") String userAgent,
@RequestHeader(value="Accept") String[] accepts){
}
如上配置将自动将请求头“User-Agent”值入参到userAgent参数上,并将“Accept”请求头值入参到accepts参数上。
@RequestHeader也拥有和@RequestParam相同的三个参数,含义一样。
7.Spring MVC框架中控制器向View传参
几种方法:
①Servlet api 中的 HttpServletRequest对象,在SpringMvc中已不推荐。
②ModelAndView 对象:通过addObject方法添加数据, setViewName 设置视图。
③ModelMap 对象:ModelMap对象与request对象相似,可以采用addAttribute()方法来传递参数,向ModelMap对象中添加key和value,其实就是在向request域中添加key和value,与Servlet解耦合。
④ Model 对象:在执行方法的参数列表中,声明一个Model对象,通过addAttribute进行添加。
⑤ Map 集合:在执行方法的参数列表中,声明一个Map集合,并向其中put()仅key和value,就可以被springmvc解析成向request域中传递值。仅仅使用一个简单的map集合,就可以完成对request对象的操作。
8.REST简介
REST(表征状态转移)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。
- 对站点资源的CRUD操作:查询,添加,更新,删除
- http请求的方式:GET, POST, PUT, DELETE
REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表征。获得这些表征致使这些应用程序转变了其状态。随着不断获取资源的表征,客户端应用不断地在转变着其状态,所谓表征状态转移。
如果一个架构符合REST原则,就称它为RESTful架构。
8.1 SpringMVC对REST的支持
org.springframework.web.filter.HiddenHttpMethodFilter过滤器可以对请求方式进行扩展,支持PUT和DELETE
REST特点
(1)REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML以及HTML这些现有的广泛流行的协议和标准。
(2)资源是由URI来指定
(3)对资源的操作包括获取、创建、修改和删除资源
(4)通过操作资源的表现形式来操作资源
REST的优点
(1)可以利用缓存Cache来提高响应速度
(2)通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
(3)浏览器即可作为客户端,简化软件需求
(4)相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
(5)不需要额外的资源发现机制
(6)在软件技术演进中的长期的兼容性更好
8.2 REST风格控制器注解
8.2.1 @RestController
@RestController
是 Spring MVC 中用于构建 RESTful Web 服务 的核心注解,它是 @Controller
和 @ResponseBody
的组合注解,专门设计用于简化 REST API 的开发。
@RestController
@RequestMapping("/orders")
public class OrderController {
@GetMapping("/{id}")
public Order getOrderById(@PathVariable int id) {
Order order = orderService.getOrderById(id);
return order;
}
}
使用 @RestController 注解标记类,并在方法上使用 @GetMapping 注解定义了一个 GET 请求的处理方法。方法的返回值是 Order 类型的对象,它将会直接序列化为 JSON 格式的数据,并作为 HTTP 响应的主体内容返回给客户端。
注意:需要加入jackson的依赖包: jackson-core、jackson-databind、jackson-annotations
@RestController其实是@Controller+@ResponseBody的组合
@Controller
@RequestMapping("/orders")
public class OrderController {
@GetMapping("/{id}")
@ResponseBody
public Order getOrderById(@PathVariable int id) {
// 从数据库中获取订单信息
Order order = orderService.getOrderById(id);
return order;
}
}
使用 @Controller 注解标记类,并在方法上使用 @GetMapping 注解定义了一个 GET 请求的处理方法。在方法上使用 @ResponseBody 注解,表示方法的返回值应该作为响应的主体内容,而不是解析为视图。
8.2.2 @RequestBody注解
@RequestBody
是 Spring MVC 中用于 RESTful 风格 API 的注解,主要用于处理 HTTP 请求体(Request Body)中的数据,并将其绑定到 Java 对象上。
@RestController
@RequestMapping("/api")
public class MyController {
@PostMapping("/user")
public String createUser(@RequestBody User user) {
// 处理接收到的User对象
// ...
return "User created: " + user.getName();
}
}
在上述示例中,@PostMapping("/user")将createUser()方法映射到POST请求的路径/api/user上。@RequestBody注解将请求体中的内容绑定到User对象上,Spring会自动根据请求的Content-Type将请求体转换为User对象。
请注意,为了使@RequestBody注解生效,需要确保项目中已配置了适当的HttpMessageConverter,以便进行请求体到Java对象的转换。通常,Spring 会自动配置适当的转换器。
8.3 两种控制器注解的区别
- @RestController 是 @Controller 和 @ResponseBody 的组合注解,用于创建 RESTful 风格的 API。
- @RestController 返回的数据会直接作为响应的主体内容(JSON 或 XML),不进行页面跳转或视图解析。
- @Controller 用于传统的 MVC 架构,负责处理请求并返回视图作为响应。
- @Controller 方法通常需要配合 @ResponseBody 注解,才能将返回值作为响应的主体内容。
传统的springMVC一般就需要直接返回视图,而现在新兴的前端技术vue在项目中为前后端分离的架构,前端框架负责处理数据和渲染页面,而后端 API 则负责提供数据即可,所以对返回视图的要求也就比较少了。
9. 实验:通过注解式控制器实现CURD操作
前后端分离:注解式控制器实现CURD操作https://download.csdn.net/download/m0_74808313/90746506
10. HTTP四种常见请求与MVC参数绑定如何规范使用
HTTP中常用的4种请求方式——前端如何发送?后端怎么接受?-CSDN博客https://blog.csdn.net/m0_74808313/article/details/141229920