SpringMVC

SpringMVC常用的注解

  1. @Component衍生出@Controller(用于控制层),@Service(用于业务层),@Repository(用于数据访问层,dao层)
  2. @RequestMapping(用于方法,匹配请求)衍生出@GetMapping,@PostMapping,@PutMapping,@DeleteMapping
  3. @ResponseBody(用于方法,将JavaBean转成Json),衍生出@RestController(作用于Controller类上,替换@Controller)
    <!-- @PutMapping,@DeleteMapping比较特殊,需要特别处理 -->
    <!-- 作用:通过超链接控制表单的提交,将post请求转换为delete请求 -->
    <form id="delete_form" method="post">
        <!-- HiddenHttpMethodFilter要求:必须传输_method请求参数,并且值为最终的请求方式 -->
        <input type="hidden" name="_method" value="delete"/>
    </form>
    

SpringMVC的常用组件

1. DispacherServlet: 前端控制器
	作用: 统一处理请求和响应.整个流程的控制中心,有他来调度其他组件处理用户请求
2. HandlerMapping: 处理器映射器
	作用: 根据请求的链接和请求方式等信息查找Controler中对应的方法.与@RequestMapping进行匹配
3. Handler: 处理器
	作用: 对用户请求进行处理;就是自己写的Controller中的方法
4. HandlerAdapter: 处理器适配器
	作用: 执行匹配到的处理器;就是去执行匹配到的Controller的方法
5. ViewResolver: 视图解析器
	作用: 进行视图解析, 得到相应的视图;就是解析ModelAndView对象

SpringMVC的执行过程

1. 用户向服务器发送请求;如果有过滤器,先进行过滤,然后被前端控制器(DispacherServlet)捕获
2. 前端控制器调用处理器映射器(HandleMapping)去匹配拦截器和Controller中的方法
	如果匹配不到,就去静态资源中匹配,在匹配不到就报404
3. 前端控制器再调用处理器适配器(HandlerAdapter)去执行匹配到的拦截器和Controller的方法,返回ModelAndView
4. 前端控制器调用视图解析器来解析返回的ModelAndView
5. 渲染页面

SpringMVC接收参数的方式

1. 通过ServletAPI获取

@RequestMapping("/testParam")
public String testParam(HttpServletRequest request){
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    return "success";
}

2. 通过同名形参来获取

@RequestMapping("/testParam")
public String testParam(String username, String password){
    System.out.println("username:"+username+",password:"+password);
    return "success";
}

3. 通过实体对象来获取

@RequestMapping("/testParam")
public String testParam(User user){
    System.out.println(user);
    return "success";
}

4. 通过RequestEntity来获取

// 将请求中的所有信息(包括请求头,请求体)包装成一个对象
@RequestMapping("/testRequestEntity")
public String testRequestEntity(RequestEntity<String> requestEntity){
    System.out.println("requestHeader:"+requestEntity.getHeaders());
    System.out.println("requestBody:"+requestEntity.getBody());
    return "success";
}

5. 通过@RequestBody来获取

// 通常用来接收post请求的请求体
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody User user){
    System.out.println(user);
    return "success";
}

6. 通过@RequestParam获取

// 将不同名的请求参数映射到指定的形参中,value: 请求参数名; required: 是否是必须; defaultValue: 默认值;
@RequestMapping("/testParam")
public String testParam(
            @RequestParam(value = "name", required = false, defaultValue = "hehe") String username) {
    System.out.println("username:"+username);
    return "success";
}

7. 通过@RequestHeader获取

// 将请求头中的某个信息映射到指定的形参中,value: 请求头的key; required: 是否是必须; defaultValue: 默认值;
@RequestMapping("/testParam")
public String testParam(
            @RequestParam(value = "referer", required = false, defaultValue = "hehe") String referer) {
    System.out.println("referer:"+referer);
    return "success";
}

8. 通过@CookieValue获取

// 将cookie中的某个信息映射到指定的形参中,value: cookie的key; required: 是否是必须; defaultValue: 默认值;
@RequestMapping("/testParam")
public String testParam(
            @RequestParam(value = "JSESSIONID", required = false, defaultValue = "hehe") String jseesionId) {
    System.out.println("jseesionId:"+jseesionId);
    return "success";
}

SpringMVC响应数据的方式

SpringMVC不论用哪一种方式响应数据,在前端控制器接收响应的参数时都是通过ModelAndView类型来接收的

1. 通过request域对象共享数据

@RequestMapping("/testServletAPI")
public String testServletAPI(HttpServletRequest request){
    request.setAttribute("testScope", "hello,servletAPI");
    return "success";
}

2. 通过session域对象共享数据

@RequestMapping("/testSession")
public String testSession(HttpSession session){
    session.setAttribute("testSessionScope", "hello,session");
    return "success";
}

3. 通过application域对象共享数据

@RequestMapping("/testApplication")
public String testApplication(HttpSession session){
	ServletContext application = session.getServletContext();
    application.setAttribute("testApplicationScope", "hello,application");
    return "success";
}

4. 通过ModelAndView向request共享数据

@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
    ModelAndView mav = new ModelAndView();
    //向请求域共享数据
    mav.addObject("testScope", "hello,ModelAndView");
    //设置视图,实现页面跳转
    mav.setViewName("success");
    return mav;
}

5. 通过Model向request共享数据

@RequestMapping("/testModel")
public String testModel(Model model){
    model.addAttribute("testScope", "hello,Model");
    return "success";
}

6. 通过Map向request共享数据

@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
    map.put("testScope", "hello,Map");
    return "success";
}

7. 通过ModelMap向request共享数据

@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
    modelMap.addAttribute("testScope", "hello,ModelMap");
    return "success";
}

8. 通过Json形式响应数据

  1. 导入jackson的依赖

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.12.1</version>
    </dependency>
    
  2. 开启mvc的注解驱动(在SpringMVC的配置文件中)

    <mvc:annotation-driven />
    
  3. 在Conroller的方法上加@ResponseBody注解

    @RequestMapping("/testResponseUser")
    @ResponseBody
    public User testResponseUser(){
        return new User(1001,"admin","123456",23,"男");
    }
    

对于上述的第三步;其实SpringMVC提供了一个RestController复合注解.标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了@ResponseBody注解

SpringMVC拦截器

1、拦截器的配置

SpringMVC中的拦截器用于拦截控制器方法的执行

SpringMVC中的拦截器需要实现HandlerInterceptor

SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置:

<bean class="com.atguigu.interceptor.FirstInterceptor"></bean>
<ref bean="firstInterceptor"></ref>
<!-- 以上两种配置方式都是对DispatcherServlet所处理的所有的请求进行拦截 -->
<mvc:interceptor>
    <mvc:mapping path="/**"/>
    <mvc:exclude-mapping path="/testRequestEntity"/>
    <ref bean="firstInterceptor"></ref>
</mvc:interceptor>
<!-- 
	以上配置方式可以通过ref或bean标签设置拦截器,通过mvc:mapping设置需要拦截的请求,通过mvc:exclude-mapping设置需要排除的请求,即不需要拦截的请求
-->

2、拦截器的三个抽象方法

  1. preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法

  2. postHandle:控制器方法执行之后执行postHandle()

  3. afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()

3、多个拦截器的执行顺序

a>若每个拦截器的preHandle()都返回true

此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:

preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行

b>若某个拦截器的preHandle()返回了false

preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterComplation()会执行

SpringMVC异常处理器

SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver

HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver

SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver,使用方式:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
        	<!--
        		properties的键表示处理器方法执行过程中出现的异常
        		properties的值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面
        	-->
            <prop key="java.lang.ArithmeticException">error</prop>
        </props>
    </property>
    <!--
    	exceptionAttribute属性设置一个属性名,将出现的异常信息在请求域中进行共享
    -->
    <property name="exceptionAttribute" value="ex"></property>
</bean>

声明: SpringMVC跟着尚硅谷的杨博超老师学的,作此笔记仅为了自己查阅方便
https://www.bilibili.com/video/BV1Ry4y1574R?p=1

上一篇:java5.4SpringMVC


下一篇:【新】使用fastjson作为SpringMVC的HttpMessageConverter