SpringMVC框架

一、SpringMVC的介绍:                                 

1.SpringMVC是Spring为展现层(表述层)提供的基于MVC设计理念的优秀的web框架,是目前最主流的MVC框架之一;从Spring3.0之后SpringMVC全面超越了struts2,成为最优秀的MVC框架。

2.SpringMVC通过一套MVC注解,可以让POJO(普通的java类)成为处理请求的请求处理器(控制器),而无需实现任何接口。

3.SpringMVC支持REST风格的URL请求。

4.SpringMVC采用了松耦合可插拔组件结构,比其他MVC框架更具灵活性和扩展性。

 

二、常用注解:

1.@RequestMapping:

用于映射请求。

常用属性:

1)value:用于指定请求URL,以/开始相对于项目路径

2)method:用于指定请求方式

2.@PathVariable:

在@RequestMapping注解映射的请求的URL中还可以使用占位符,如/delete/{id}匹配:/delete/101、/delete/102等URL路径。然后通过@PathVariable注解可以将URL路径中的占位符参数值传递给请求处理方法的参数,如URL路径中的占位符{xxx}的值就可以通过@PathVariable("xxx")传递给请求处理方法的指定参数,如果请求处理方法的参数名和URL路径中的占位符名称相同都为xxx时,直接使用@PathVariable注解即可。

REST风格的URL请求:

HTTP协议里面四个四种请求方式GET、POST、PUT、DELETE分别对应增删改查四种操作,GET表示获取资源,POST表示新建资源,PUT表示更新资源,DELETE表示删除资源。如:                                           

URL:/order/101 --- GET --- 获取id为101的订单            

URL:/order/101 --- DELETE --- 删除id为101的订单  

URL:/order/101 --- PUT --- 更新id为101的订单     

URL:/order     --- POST --- 新建订单

但是浏览器的超链接只支持GET请求,form表单只支持GET和POST请求,PUT和DELETE请求是并不支持的。在Spring3.0中添加了一个过滤器org.springframework.web.filter.HiddenHttpMethodFilter可以将POST请求转换成PUT和DELETE请求。如果要发送PUT或DELETE请求:

1]在web.xml文件中配置过滤器org.springframework.web.filter. HiddenHttpMethodFilter

2]发送POST请求

3]在发送POST请求时通过隐藏域携带一个名称为_method的请求参数,值为PUT或DELETE

3.@RequestParam:

用于映射请求参数,可以将指定的请求参数值传递给请求处理方法的指定入参数。

常用属性:

1)value:映射的请求参数名

2)required:设置请求参数是否必须存在,值为true表示该请求参数必须存在,值为false表示该请求参数可有可无,默认值是true

3)defaultValue:当请求参数不存在时,用于设置请求参数的默认值

4.@RequestHeader:

@RequestHeader注解用于映射请求头,可以将指定请求头的值传递给请求处理方法的指定参数。

常用属性:

1)value:映射的请求头名称

2)required:设置请求头是否必须存在,值为true表示该请求头必须存在,值为false表示该请求头可有可无,默认值是true

3)defaultValue:当请求头不存在时,用于设置请求头的默认值

5.@CookieValue注解:                       

@CookieValue注解用于映射Cookie,可以将指定名称的Cookie的值传递给请求处理方法的指定参数。

常用属性:

1)value:映射的Cookie的名称

2)required:设置Cookie是否必须存在,值为true表示该Cookie必须存在,值为false表示可有可无,默认值是true

3)defaultValue:当Cookie不存在时,用于设置Cookie的默认值

6.@RequestBody:

将消息体转化并绑定到请求处理方法的入参中,只有POST请求才有消息体。

主要用法是接收ajax提交的json数据。

7.@ResponseBody:

将返回结果转化为对应类型的响应信息;

主要用于将请求处理方法的返回值转成响应的json数据;

8.@SessionAttributes:                         

若希望在一个会话中的多个请求之间共享模型数据,那么可以在请求处理器类上使用@SessionAttributes注解,SpringMVC则会将对应的模型数据保存到域对象session中。

常用属性:

1)value:通过属性名指定需要保存到session域对象的属性

  如:@SessionAttributes(value="user1") 将名称为user1的属性保存到session域对象中

         @SessionAttributes(value={"user1","user2"}) 将名称为user1和user2的属性保存到session域对象中

2)types:通过属性类型指定需要保存到session域对象中的属性

  如:@SessionAttributes(types=Student.class) 将Student类型的属性保存到session域对象中

         @SessionAttributes(types={Student.class,Address.class}) 将Student类型和Address类型的属性保存到session域对象中

9.@ModelAttribute注解 *****

1)作用在请求处理方法的参数上

@RequestMapping("/save")

public String save(@ModelAttribute("user1") User user){

}

该请求处理方法表示,在处理请求之前会先从Model(即request域对象)中去获取key为"user1"(@ModelAttribute注解的value属性指定的)的User对象,如果有则拿到且被参数User对象user引用,并将请求参数封装到User对象user中;如果没有,则会通过反射机制创建一个User对象且被参数User对象user引用,再将请求参数封装到User对象user中,最后将User对象user保存到Model(即request域对象)中,key仍是"user1"。

@RequestMapping("/save")

public String save(@ModelAttribute User user){

}

@RequestMapping("/save")

public String save(User user){

}

以上两个请求处理方法是等价的,在处理请求之前都会先从Model(即request域对象)中去获取key为"user"(User类名首字母小写)的User对象,如果有则拿到且被参数User对象user引用,并将请求参数封装到User对象user中;如果没有,则会通过反射机制创建一个User对象且被参数User对象user引用,再将请求参数封装到User对象user中,最后将User对象user保存到Model(即request域对象)中,key仍是"user"

2)作用在方法上:

@ModelAttribute

public void addUser(){

}

如果该方法定义在请求处理器中,那么在执行请求处理器的请求处理方法之前会先执行该方法。

@ModelAttribute

public void addUser(User user){

}

如果该方法定义在请求处理器中,那么在执行请求处理器的请求处理方法之前会先执行该方法,且在执行addUser()过程中会向Model(即request域对象)中添加一个key为"user"(User类名首字母小写)的User对象(即addUser()方法的参数User对象user)。

@ModelAttribute("user1")

public User addUser(User user){

  return new User(101,"ls");

}

如果该方法定义在请求处理器中,那么在执行请求处理器的请求处理方法之前会先执行该方法,且在执行addUser()过程中会向Model(即request域对象)中添加一个key为"user"(User类名首字母小写)的User对象(即addUser()方法的参数User对象user),和一个key为"user1"(@ModelAttribute注解value属性指定的)的User对象(即addUser()方法的返回值User对象)。

3)同时作用在指定方法上和请求处理方法的参数上:

@ModelAttribute("user1")

public User addUser(User user){

  return new User();

}

@RequestMapping("/save")

public String save(@ModelAttribute User user){

}

或者

@RequestMapping("/save")

public String save(User user){

}

在执行请求处理方法save()之前会先去执行被@ModelAttribute注解标识的addUser()方法,且在执行addUser()过程中会向Model(即request域对象)中添加一个key为"user"(User类名首字母小写)的User对象(addUser()方法的参数User对象user),和一个key为"user1"(@ModelAttribute注解的value属性指定)的User对象(addUser()方法的返回值User对象)。当addUser()方法执行结束后再去执行请求处理方法save(),在执行save()时会先从Model(即request域对象)中获取到key为"user"(User类名首字母小写)的User对象,再将其被save()方法的参数User对象user引用,最后再使用save()方法的参数User对象user去接收并封装客户端的请求参数。

@ModelAttribute("user1")

public User addUser(User user){

  return new User();

}

@RequestMapping("/save")

public String save(@ModelAttribute("user1") User user){

}

在执行请求处理方法save()之前会先去执行被@ModelAttribute注解标识的addUser()方法,且在执行addUser()过程中会向Model(即request域对象)中添加一个key为"user"(User类名首字母小写)的User对象(addUser()方法的参数User对象user),和一个key为"user1"(@ModelAttribute注解的value属性指定)的User对象(addUser()方法的返回值User对象)。当addUser()方法执行结束后再去执行请求处理方法save(),在执行save()时会先从Model(即request域对象)中获取到key为"user1"(@ModelAttribute注解的value属性指定)的User对象,再将其被save()方法的参数User对象user引用,最后再使用save()方法的参数User对象user去接收并封装客户端的请求参数。

 

三、拦截器

SpringMVC的拦截器就类似于Servlet中的过滤器,用于拦截请求,在请求执行的前后完成相应的工作。

 

自定义拦截器:                                        

1>实现HandlerInterceptor接口并重写其所有的抽象方法:

  1)boolean | preHandle():                                     

   该方法会在请求处理方法执行之前被执行;若返回值为true,则继续执行后续的拦截器和请求处理方法,若返回值为false,则不会再执行后续的拦截器和请求处理方法了;因为该方法是在请求处理方     法执行之前被执行,所以在该方法中可以进行权限设置、日志操作、事务操作等工作;

  2)void | postHandle():                                      

  该方法会在请求处理方法执行之后,在渲染视图即向客户端做出响应之前被执行;所以在该方法中可以对Model中的属性和视图做出修改等工作;

  3)void | afterCompletion():                                 

  该方法会在渲染视图即向客户端做出响应之后被执行;所以在该方法可以进行释放资源等工作;

2>在SpringMVC的配置文件中装配拦截器

 拦截器链:

一个请求还可以有多个拦截器

 

四、SpringMVC的执行流程:

SpringMVC运行中几个重要的对象:

1.HandlerMapping:该对象负责请求到处理器之间的映射,即通过该对象可以获取到请求对应的处理器;

2.HandlerExecutionChain:处理器执行链对象,该对象中包含了请求处理器以及所有的拦截器;

3.HandlerAdapter:请求处理适配器,该对象负责将请求参数映射给请求处理方法的入参、数据类型的转换、数据的格式化、数据校验等工作;

 

执行流程:

1.浏览器发出请求到达前置控制器DispatcherServlet。
2.DispatcherServlet接到请求调用处理器映射器HandlerMapping获取Handler。
3.处理器映射器HandlerMapping根据请求url找到具体的Handler,生成处理器执行链HandlerExecutionChain(包括处理器和所有的拦截器)并返回给DispatcherServlet。
4.DispatcherServlet根据处理器Handler获取到处理器适配器HandlerAdapter,执行HandlerAdapter处理一系列的操作,如:参数封装,数据类型转换、数据格式化,数据验证等。

   注意:在获取到处理器适配器HandlerAdapter后,此时如果有拦截器,则将先执行拦截器的preHandle()方法。
5.处理器适配器HandlerAdapter执行处理器Handler。
6.Handler执行完成返回ModelAndView给处理器适配器HandlerAdapter。
7.处理器适配器HandlerAdapter将Handler返回的ModelAndView再返回到DispatcherServlet。
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器进行解析。
9.ViewReslover解析后返回具体的View给DispatcherServlet。
10.DispatcherServlet使用View进行视图渲染(即将模型数据填充到视图中)。
11.DispatcherServlet向浏览器做出响应。

 

 

 

 

 

 

 

 

 

posted @ 2020-07-11 20:09  一个农民  阅读(202)  评论(0)    收藏  举报