Spring MVC笔记—day02
7.mvc:annotation-driven
我们如果使用springmvc的基础功能比如:@Controller
@RequestMapping
@RequestParam
,是不需要添加 mvc:annotation-driven的支持,但是我们如果要使用高级功能,例如: @RequestBody
@ResponseBody
这一些高级功能注解就需要添加mvc:annotation-driven的支持了;
我们要在 spring-mvc.xml
的配置文件中配置高级功能注解的支持
<?xml version="1.0" encoding="UTF-8"?>
<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:aop="http://www.springframework.org/schema/aop"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--高级功能注解的支持-->
<mvc:annotation-driven/>
<!-- 注册处理器映射器 -->
<bean name="requestMappingHandlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<!-- 注册处理器适配器 -->
<bean name="requestMappingHandlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<!-- 视图解析器 -->
<bean name="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
<!-- 开启Springmvc的注解扫描,主要扫描处理器的注解 @Controller @RequestMapping @GetMapping @PostMapping -->
<context:component-scan base-package="com.zll.springmvc.controller"></context:component-scan>
</beans>
8.@ReponseBody注解
@ReponseBody
和@Controller
进行结合使用,可以直接返回json对象给客户端
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@PostMapping(value = "/login")
@ResponseBody
public User login(@RequestBody User user) {
System.out.println(user);
user.setId(1001);
return user;// 返回一个对象,在springmvc的底层会把对象自动转换为json字符串进行返回,还自动添加了 Content-Type: application/json
}
}
但是我们如果在每个方法上面都添加ReponseBody注解实在太繁琐了,所以Spring给我们提供了一种非常好的解决方案: @RestController
@RestController
=@Controller
+ @ResponseBody
@RestController
@RequestMapping("/user")
public class UserController{
@Autowired
UserService userService;
@RequestMapping("/findById")
public User findById(@RequestParam("id") Integer id){
User user=new User(id,"as","666");
return user;
}
@RequestMapping("/findByName")
public User findByName(@RequestParam("name") String name){
User user=new User(111,name,"666");
return user;
}
@RequestMapping("/findByPassword")
public User findByPassword(@RequestParam("password") String password){
User user=new User(112,"as",password);
return user;
}
}
9. SpringMvc的请求转发与请求重定向
9.1 传统的Servlet的方式
请求转发
//传统方式的请求转发
request.setAttribute("orderNum","120519");
request.getRequestDispatcher("/orderList.jsp").forward(request,response);
请求重定向
//传统方式的请求重定向
response.sendRedirect("/orderList.jsp");
9.2 SpringMvc提供的方式
请求转发
@Controller
@RequestMapping("/order")
//方法的返回值为String类型,返回的是视图逻辑名称
public class OrderController {
@GetMapping("/findById")
public String findById(Model model) {
model.addAttribute("orderNum",2021);
return "/orderList.jsp";
}
}
请求重定向
@Controller
@RequestMapping("/order")
public class OrderController {
@GetMapping("/findById")
public String findById(Model model) {
重定向时会把orderNum以参数的形式携带在url中 加上redirect即为重定向
model.addAttribute("orderNum",2021);
return "redirect:/orderList.jsp";
}
}
10. Springmvc中的拦截器
SpringMVC 中的Interceptor 拦截器是相当重要的,它的主要作用是拦截用户的请求并进行相应的处理。
定义拦截器可以通过两种方式:
- 通过实现 HandlerInterceptor 接口或继承 HandlerInterceptor 接口的实现类来定义;
- 通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类来定义。
注册拦截器
<mvc:interceptors>
<!--配置全局拦截器,拦截所有请求-->
<bean class="com.zll.springmvc.interceptor.MyAllRequestInterceptor"></bean>
<!--配置某个请求的拦截器,可以使用/**通配符-->
<mvc:interceptor>
<mvc:mapping path="/user/findById.do"/>
<bean class="com.zll.springmvc.interceptor.Interceptor01"></bean>
</mvc:interceptor>
</mvc:interceptors>
编写拦截器
/**
* 全局的拦截器
*/
public class MyAllRequestInterceptor implements HandlerInterceptor {
/**
*
* @param request 请求对象
* @param response 响应对象
* @param handler handler对象
* @return 返回true代表放行 false代表不放行
* @throws Exception
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyAllRequestInterceptor...请求处理之前"+request.getParameter("orderNum"));
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
modelAndView.addObject("orderNum",120);
System.out.println("MyAllRequestInterceptor...请求处理之后");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyAllRequestInterceptor...视图渲染之后");
}
}
/**
* 局部的拦截器
*/
public class MyUserInterceptor implements HandlerInterceptor {
/**
*
* @param request 请求对象
* @param response 响应对象
* @param handler handler对象
* @return 返回true代表放行 false代表不放行
* @throws Exception
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyUserInterceptor...请求处理之前");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyUserInterceptor...请求处理之后");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyUserInterceptor...视图渲染之后");
}
}
拦截器的定义中实现了 HandlerInterceptor 接口,并实现了接口中的 3 个方法。
- preHandle 方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
- postHandle 方法:该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
- afterCompletion 方法:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。
11. SpringMvc请求参数限定
@RequestMapping("/findById")
public User findById(@RequestParam(value = "id",required = false,defaultValue = "110") Integer id){
User user=new User(id,"as","666");
return user;
}
required: 默认为true,也就是说发送的请求必须要传递这个参数,不传递就会报错,我们想要不传递也不报错就要设置为false
defaultValue: 不传递时的默认值,一般与 required = false
来进行结合使用。