SpringMVC常用的注解
- @Component衍生出@Controller(用于控制层),@Service(用于业务层),@Repository(用于数据访问层,dao层)
- @RequestMapping(用于方法,匹配请求)衍生出@GetMapping,@PostMapping,@PutMapping,@DeleteMapping
- @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形式响应数据
导入jackson的依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.1</version> </dependency>
开启mvc的注解驱动(在SpringMVC的配置文件中)
<mvc:annotation-driven />
在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、拦截器的三个抽象方法
preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法
postHandle:控制器方法执行之后执行postHandle()
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