Spring MVC笔记---day02

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来进行结合使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值