一,用SpringMVC的简介
SpringMVC是一种基于Spring实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC的架构模式思想,将Web层进行指责解耦,并管理应用所需的生命周期,为简化日常开发,提供了很大便利。
SpringMVC提供了总开关DispatcherServlet;请求处理映射器(Handler Mapping)和处理适配器(Handler Adapter),视图解析器(View Resolver)进行视图管理;动作处理器Controller接口(包含ModelAndView,以及处理请求响应对象请求和响应),配置灵活,支持文件上传,数据简单转化等强大功能。
二,用SpringMVC的常用注解标签
- @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。@ Controller只是定义了一个控制器类,而使用@RequestMapping注解的方法才是真正处理请求的处理器。单个使用@Controller标记在一个类上还不能真正意义上的说它就是SpringMVC的一个控制器类,因为这个时候Spring还不认识它。那么要如何做Spring才能认识它呢?这个时候就需要我们把这个控制器类交给Spring来管理。有两种方式:(1)在SpringMVC的配置文件中定义MyController的bean对象。(2)在SpringMVC的配置文件中告诉Spring该到哪里去找标记为@Controller的Controller控制器。
<!--方式一--> <bean class="com.host.app.web.controller.MyController"/> <!--方式二--> < context:component-scan base-package = "com.host.app.web" />//路径写到controller的上一层(扫描包详解见下面浅析)
- @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
- @Resource和@Autowired @Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
- @ModelAttribute和@SessionAttributes 该控制器的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的控制器继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。@ SessionAttributes即将值放到session作用域中,写在类上面。
- @PathVariable 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出URI模板中的变量作为参数。
@Controller public class TestController { @RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET) public String getLogin(@PathVariable("userId") String userId, @PathVariable("roleId") String roleId){ System.out.println("User Id : " + userId); System.out.println("Role Id : " + roleId); return "hello"; } @RequestMapping(value="/product/{productId}",method = RequestMethod.GET) public String getProduct(@PathVariable("productId") String productId){ System.out.println("Product Id : " + productId); return "hello"; } @RequestMapping(value="/javabeat/{regexp1:[a-z-]+}", method = RequestMethod.GET) public String getRegExp(@PathVariable("regexp1") String regexp1){ System.out.println("URI Part 1 : " + regexp1); return "hello"; } }
- @ReauestParam 主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter(“name”),它有三个常用参数:defaultValue =“0”,required = false,value =“isApp”; defaultValue表示设置默认值,required铜过布尔设置是否是必须要传入的参数,值值表示接受的传入的参数类型。
- @ResponseBody 该注解用于将控制器的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到响应对象的身体数据区。使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如JSON,XML等)使用;
- @Component 相当于通用的注解,当不知道一些类归到哪个层时使用,但是不建议。
- @Repository 用于注解道层,在daoImpl类上面注解。
三,用SpringMVC的工作流程与介绍
(1)客户端通过URL发送请求
(2-3)核心控制器Dispatcher Servlet接收到请求,通过系统或自定义的映射器配置找到对应的处理程序,并将url映射的控制器控制器返回给核心控制器。
(4)通过核心控制器找到系统或默认的适配器
(5-7)由找到的适配器,调用实现对应接口的处理器,并将结果返回给适配器,结果中包含数据模型和视图对象,再由适配器返回给核心控制器
(8-9)核心控制器将获取的数据和视图结合的对象传递给视图解析器,获取解析得到的结果,并由视图解析器响应给核心控制器
(10)核心控制器将结果返回给客户端
四,用SpringMVC与Struts2的的主要区别
- 区别一 Struts2的核心是基于一个Filter即StrutsPreparedAndExcuteFilter SpringMvc的核心是基于一个Servlet即DispatcherServlet(前端控制器)
- 区别二
Struts2的基于的英文类开发的,传递的参数是通过类的属性传递(属性驱动和模型驱动),所以只能设计成多例原型
SpringMvc是基于类中的方法开发的,也就是一个url对应一个方法,传递参数是传到方法的形参上面,所以既可以是单例模式也可以是多例模式singiton
- 区别三
Struts2的采用的是值栈存储请求以及响应数据,OGNL存取数据
用SpringMVC采用请求来解析请求内容,然后由其内部的的getParameter给方法中形参赋值,再把后台处理过的数据通过ModelAndView的对象存储,型号存储数据,查看存储返回的页面,再把对象通过请求传输到页面去。