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():该方法将在整个请求完成之后,也就是说在视图渲染之后进行调用,

主要用于进行一些资源的释放

相关推荐