spring mvc
SPRINGMVC
一,什么是springmvc
springmvc是spring的后续产品,是一个mvc框架,通过实现model-view-controller模式将数据,
业务,视图进行分离
springmvc是围绕着dispatcherServlet这个核心控制器设计的,
DispatcherServlet负责将请求派发到特定的handler。通过可配置的handlermappings、
viewresolution、locale以及themeresolution来处理请求并且转到对应的视图
SpringWebMVC是一种基于Java的实现了WebMVC设计模式的请求驱动类型的轻量级Web框架,
即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,
框架的目的就是帮助我们简化开发,SpringWebMVC也是要简化我们日常Web开发的。
二,为什么要springmvc
a。实现了零配置,不用想以前那样在xml配置很多bean标签
b,通过注解现实依赖注入和url的注入
c,通过注解实现页面数据的封装,
三,如何使用springmvc
a,先在web.xml上配置springmvc的核心控制器
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/conf/floor/dao/system_dao.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
b,就是在spring-servlet.xml上配置
1,启动springmvc注解
<context:annotation-config></context:annotation-config>
2,启动的时候,你要到这个包下面去扫描所有类的注解,将类生成实例放到ioc容器
<context:component-scanbase-package="com.controller"></context:component-scan>
3,DefaultAnnotationHandlerMapping通过注解,把一个URL映射到Controller类上
配置org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
4,AnnotationMethodHandlerAdapter类,通过注解,把一个URL映射到Controller类的方法上
完成请求和注解POJO的映射
beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
5,对转向页面的路径解析。prefix:前缀,suffix:后缀
beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/jsp/"p:suffix=".jsp"/>
6,设置json格式,和编码
org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"设置返回格式和编
<propertyname="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
C,在程序中的使用
springmvc的原理与struts的原理是相似的,都是基于mvc架构,都有一个控制页面请求的servlet
处理完后跳转到相应的页面
1,在一个处理请求的类头中要用注解@Controller标示是控制类,类似struts的action
2,在控制类中要处理请求的方法上面需要写@requestMapping(请求的action)
括号里边可以是xx!xx,(action名!方法名)也可以是/xx(方法名,但要跟jsp的请求想对应)
3,也可以吧@requestMapping(请求的action)写在类体上,然后再该类的方法上写上请求的参数
例如:@RequestMapping(params="method=2"[method=RequestMethod.POST])
4,方法中的参数可以用@ModelAttribute参数类型,参数
也可以是直接写上参数,但字段要跟jsp的请求字段保持一致
D,httpServletRequest的获取
1,直接在方法上当做参数写入,就可以获取,httpServletResponse也是一样的
2,RequestAttributesra=RequestContextHolder.getRequestAttributes();
HttpServletRequestrequest=((ServletRequestAttributes)ra).getRequest();
response获取就比较麻烦了。。好像得些方法
E,springmvc常用的注解有:
@Controller:用于标识是处理器类;
@RequestMapping:请求到处理器功能方法的映射规则;
@RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定;
@ModelAttribute:请求参数到命令对象的绑定;
@SessionAttributes:用于声明session级别存储的属性,放置在处理器类上,通常列出模型属性
(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中;
@InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;
@CookieValue:cookie数据到处理器功能处理方法的方法参数上的绑定;
@RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定;
@RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换);
@ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
@ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因;
@ExceptionHandler:注解式声明异常处理器;
@PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定,从而支持RESTful
架构风格的URI;
F:springmvc处理请求的的流程
a,首先用户发送请求web容器,web容器根据URL路径映射到DispatcherServlet(url-pattern为/)进行处理;
b,DispatcherServlet——>BeanNameUrlHandlerMapping进行请求到处理的映射,
BeanNameUrlHandlerMapping将url路径直接映射到名字为url的Bean进行处理,
即HelloWorldController,BeanNameUrlHandlerMapping将其包装为HandlerExecutionChain
(只包括HelloWorldController处理器,没有拦截器);
c,DispatcherServlet——>SimpleControllerHandlerAdapter,SimpleControllerHandlerAdapter
将HandlerExecutionChain中的处理器(HelloWorldController)
适配为SimpleControllerHandlerAdapter;
d,SimpleControllerHandlerAdapter——>HelloWorldController处理器功能处理方法的调用,
SimpleControllerHandlerAdapter将会调用处理器的handleRequest方法进行功能处理,
该处理方法返回一个ModelAndView给DispatcherServlet;
e,hello(ModelAndView的逻辑视图名)——>InternalResourceViewResolver,
InternalResourceViewResolver使用JstlView,具体视图页面在/WEB-INF/jsp/hello.jsp;
f,JstlView(/WEB-INF/jsp/hello.jsp)——>渲染,将在处理器传入的模型数据(message=HelloWorld!)
在视图中展示出来;
h,返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
四,springmvc用于做什么
五,struts2和springmvc的区别:
1,springmvc的核心控制器是dispatchServlet,是依赖于servletapi的,而
struts2的核心控制器是fileDispatch或者是StrutsPrepareAndExecuteFilter(struts22.1.3之后),
是不依赖于servletapi
2,springmvc是基于方法的设计,而sturts是基于类。也就是说:spring3mvc是方法级别的拦截,
拦截到方法后根据参数上的注解,把request数据注入进去,在spring3mvc中,
一个方法对应一个request上下文。
而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用settergetter方法
把request中的数据注入;struts2实际上是通过settergetter方法与request打交道的;
struts2中,一个Action对象对应一个request上下文。
3,struts有以自己的interceptor机制,springmvc用的是独立的AOP方式
六,springmvc的拦截器
springmvc它的主要作用是拦截用户的请求并进行相应的处理
定义Interceptor实现类
1,实现HandlerInterceptor接口
2,实现WebRequestInterceptor接口
preHandle():在请求处理之前执行,该方法主要是用于准备资源数据的,
然后可以把它们当做请求属性放到WebRequest中。
在WebRequest的父层接口RequestAttributes中对它定义了三个常量:
SCOPE_REQUEST:它的值是0,代表只有在request中可以访问。
SCOPE_SESSION:它的值是1,如果环境允许的话它代表的是一个局部的隔离的session,
否则就代表普通的session,并且在该session范围内可以访问。
SCOPE_GLOBAL_SESSION:它的值是2,如果环境允许的话,它代表的是一个全局共享的session,
否则就代表普通的session,并且在该session范围内可以访问。
postHandle():该方法将在Controller执行之后,返回视图之前执行,ModelMap表示请求
Controller处理之后返回的Model对象,所以可以在这个方法中修改ModelMap的属性,
从而达到改变返回的模型的效果。
afterCompletion():该方法将在整个请求完成之后,也就是说在视图渲染之后进行调用,
主要用于进行一些资源的释放