SpringMvc执⾏流程及注解详解
说到SpringMVC,⾸先我们了解⼀下spring常⽤的jar包,以4.3版本为例。
Spring AOP:Spring的⾯向切⾯编程,提供AOP(⾯向切⾯编程)的实现
Spring Aspects:Spring提供的对AspectJ框架的整合
Spring Beans:Spring IOC的基础实现,包含访问配置⽂件、创建和管理bean等。
Spring Context:在基础IOC功能上提供扩展服务,此外还提供许多企业级服务的⽀持,有邮件服务、任务调度、JNDI定位,EJB集成、远程访问、缓存以及多种视图层框架的⽀持。
Spring Context Support:Spring context的扩展⽀持,⽤于MVC⽅⾯。
Spring Core:Spring的核⼼⼯具包
Spring expression:Spring表达式语⾔
Spring JDBC:对JDBC 的简单封装
Spring JMS:为简化jms api的使⽤⽽做的简单封装
Spring orm:整合第三⽅的orm实现,如hibernate,ibatis,jdo以及spring 的jpa实现
Spring tx:为JDBC、Hibernate、JDO、JPA等提供的⼀致的声明式和编程式事务管理。
Spring web:包含Web应⽤开发时,⽤到Spring框架时所需的核⼼类,包括⾃动载⼊WebApplicationContext特性的类、Struts与JSF集成类、⽂件上传的⽀持类、Filter类和⼤量⼯具辅助类。
Spring webmvc:包含SpringMVC框架相关的所有类。
SpringMvc的⼯作流程中离不开这⼏个对象:DispatcherServlet、HandlerMapping、HandlerAdapter、ViewResolver及⾃定义的controller 等,这些对象完成的⼯作对于开发者来说都是不可见的,开发者并不需要关⼼这些对象是如何⼯作的,只需要在Handler(Controller)当中完成对请求的业务处理。
⼀.SpringMvc的⼯作流程:
这⾥借⽤⼀下别⼈的图,如图所⽰:
根据上图,Springmvc的⼯作流程可描述为:
1. ⽤户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2. DispatcherServlet对请求URL进⾏解析,得到请求资源标识符(URI)。然后根据该URI,调⽤HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的),最后以HandlerExecutionChain对象的形式返回;
3. DispatcherServlet 根据获得的Handler,选择⼀个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执⾏的preHandler(...)⽅法)
4. 提取Request中的模型数据,填充Handler⼊参,开始执⾏Handler(Controller)。在填充Handler的⼊参过程中,根据你的配
置,Spring将帮你做⼀些额外的⼯作:
HttpMessageConveter:将请求消息(如Json、xml等数据)转换成⼀个对象,将对象转换为指定的响应信息数据转换:对请求消息进⾏数据转换。如String转换成Integer、Double等
数据根式化:对请求消息进⾏数据格式化。如将字符串转换成格式化数字或格式化⽇期等
数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5. Handler执⾏完成后,向DispatcherServlet 返回⼀个ModelAndView对象;
6. 根据返回的ModelAndView,选择⼀个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图
8. 将渲染结果返回给客户端。
其内部调⽤过程可⽤下图来说明:
⼆. springmvc⽤到的注解
1、@Controller
在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,@Controller 标记⼀个类是Controller ,然后使⽤springmvc考试选择题
@RequestMapping 和@RequestParam 等⼀些注解⽤以定义URL 请求和Controller ⽅法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的⽅法参数灵活的获取到。
在实际中有时会⽤到@RestController,⽐@Controller多了⼀个@ResponseBody注解,controller中所有⽅法具有@ResponseBody的功能。
2、@RequestMapping
RequestMapping是⼀个⽤来处理请求地址映射的注解,可⽤于类或⽅法上。⽤于类上,表⽰类中的所有响应请求的⽅法都是以该地址作为
⽗路径,⽤于⽅法表⽰这个⽅法的URL访问地址。也可同时作⽤于类和⽅法上。
1 @Controller
2 @RequestMapping("/user")
3public class UserController {
4
5 @RequestMapping("/user_list")
6public Object queryUserList(HttpServletRequest request, HttpServletResponse response) {
7 .....
8 .....
9 }
10 }
页⾯访问需要⽤/user/user_list
RequestMapping注解有⼏个属性,在开发中也会⽤到。
1、 value, method;
value:指定请求的实际地址;
method:指定请求的method类型, GET、POST、PUT、DELETE等;
@RequestMapping (value= "testMethod" , method={RequestMethod. GET , RequestMethod. DELETE })
public String testMethod() {
return "method" ;
}
限制客户端只能⽤get和delete⽅法。
2、consumes,produces
consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、params,headers
params:指定request中必须包含某些参数值是,才让该⽅法处理。
headers:指定request中必须包含某些指定的header值,才能让该⽅法处理请求。
@RequestMapping (value= "test" , params={ "test1=value1" , "test2" , "!test3" })
public String test() {
System. out .println( "" );
return "test" ;
}
该参数分别表⽰参数test1 的值必须等于value1 ,参数test2 必须存在,值可有可⽆,参数test3 必须不存在,只有当同时满⾜这三个参数条件时才会调⽤该⽅法。
3、@requestParam
常⽤来处理简单类型的绑定,它有required,value常⽤参数;,required 通过boolean设置是否是必须要传⼊的参数,默认为false,value 值表⽰接受的传⼊的参数类型。
4、@PathVariable
将参数绑定到URL上,⼀般⽤于GET模式参数较少的情况,Restful风格。
5、@RequestBody
⽤于读取Request请求的body部分数据,HttpMessageConverter将对象数据与 controller中⽅法的参数
进⾏绑定。⼀般⽤于post⽅法,会要求数据格式(application/json, application/xml等),就是header 的Content-Type来指定。
7、@ResponseBody
⽤于将Controller的⽅法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写⼊到Response对象的body数据区,⼀般⽤于返回json等数据。
8、@Resource和@Autowired
@Resource和@Autowired都是bean的注⼊,都可以写在字段和setter⽅法上。两者如果都写在字段上,那么就不需要再写setter⽅法。
不同的是@Autowired为Spring提供的注解,按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使⽤按照名称(byName)来装配,可以结合@Qualifier注解⼀起使⽤。
@Autowired
@Qualifier("userDao")
private UserDao userDao;
@Resource默认按照ByName⾃动注⼊,不是spring的注解,但是spring⽀持它。使⽤name属性,则使⽤byName的⾃动注⼊策略,⽽使⽤type属性时则使⽤byType⾃动注⼊策略。
@Resource装配顺序:
①如果同时指定了name和type,则从Spring上下⽂中到唯⼀匹配的bean进⾏装配,不到则抛出异常。
②如果指定了name,则从上下⽂中查名称(id)匹配的bean进⾏装配,不到则抛出异常。
③如果指定了type,则从上下⽂中到类似匹配的唯⼀bean进⾏装配,不到或是到多个,都会抛出异常。
④如果既没有指定name,⼜没有指定type,则⾃动按照byName⽅式进⾏装配;如果没有匹配,则回退为⼀个原始类型进⾏匹配,如果匹配则⾃动装配。
9、@Repository
⽤于注解repository层,查询数据库。
10、@SessionAttributes
⽤来绑定HttpSession中的attribute对象的值,便于在⽅法中的参数⾥使⽤。该注解有value、types两个属性,可以通过名字和类型指定要使⽤的attribute 对象。
@Controller
@RequestMapping ( "/test" )
@SessionAttributes (value={ "name" }, types={User. class })
public class MyController {
}
11、@ModelAttribute
该注解有两个⽤法,⼀个是⽤于⽅法上,⼀个是⽤于参数上;
⽤于⽅法上时:通常⽤来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;
⽤于参数上时:⽤来通过名称对应,把相应名称的值绑定到注解的参数bean上;要绑定的值来源于
A) @SessionAttributes 启⽤的attribute 对象上;
B) @ModelAttribute ⽤于⽅法上时指定的model对象;
C)上述两种情况都没有时,new⼀个需要绑定的bean对象,然后把request中按名称对应的⽅式把值绑定到bean中。
1 @Controller
2 @RequestMapping ( "/test" )
3public class MyController {
4
5 @ModelAttribute ( "name" )
6public String getName() {
7 System. out .println( "-------------name---------" );
8return "name" ;
9 }
10
11 @ModelAttribute ( "user" )
12public User getUser(){
13 System. out .println( "---------getUser-------------" );
14return new User(3, "user" );
15 }
16
17 @RequestMapping ( "test" )
18public void test( @ModelAttribute ( "name" ) String name, @ModelAttribute ( "user" ) User user){
19
20 }
21
22
23 }
调⽤test()⽅法时会先调⽤getName(),getUser()。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论