SpringMVC:是表现层框架和struts2一样,但它和struts2也有不同之处首先springMVC是基于方法来进行开发的即它的每一个请求路径都会对应一个方法并且将请求路径带过来的参数通过参数解析器解析然后绑定到方法的形参,可以设计为单例模式也可以设计成多例模式,但struts2它是基于类来进行开发的参数的传递是通过类的属性来完成的它对于数据的响应是通过OGNL语言完成的且只能是多例模式.
springMVC的流程:
1. 客户端传过来的指定url会被前端控制器DispatcherServlet所拦截2. 前端控制器会将url发送给处理器映射器HandlerMapping,HandlerMapping会根据url去查找对应的处理器handle,找到后会生成具体的Handler对象和Handler拦截器返回给DispatcherServlet3. DispatcherServlet会去通过处理器适配器HandlerAdapter处理Handler4. Handler执行完毕以后会返回一个ModelAndView,HandlerAdapter会将这个ModelAndView返回给DispatcherServlet5. DispatcherServlet会将这个ModelAndView交给视图解析器ViewReslover,ViewReslover会根据逻辑视图名产生对应的View并返回给DispatcherServlet6. DispatcherServlet 会对View进行渲染然后填充到request域然后响应到客户端
springMVC使用了基于组件技术,就是将整个业务划分为几个不同的组件来完成,主要由以下几个组件构成:
1. DispatcherServlet:前端控制器,DispatcherServlet是用来调控整个业务流程的,它调用别的组件来实现这个的业务流程,可以说它将这个业务划分为了几个部分让这几个部分解耦和,DispatcherServlet做为核心控制器它在创建时会默认的从DispatcherServlet.properties中加载别的组件,如果在springmvc.xml中配置了组件就加载配置的组件,为了可以在启动服务时加载组件我们需要将DispathcerServlet配置到web.xml中并设置成加载时创建,需要将配置的springmvc.xml通过初始化参数加载.2. HandlerMapping:处理器映射器,HandlerMapping根据传过来的请求去找到对应的Handler,然后将Handler和Interceptor拦截器封装到HandlerExceutionChain中返回给DispatcherServlet.3. Handler:处理器,用来处理用户具体的请求4. HandlerAdapter:处理器适配器,用来执行Handler,HanlderAdapter会通过适配器接口对Hanlder进行适配,适配后就可以执行Handler,通过HandlerAdapter可以执行多种类型的Handler,使用的是适配器设计模型.5. ViewResolver:视图解析器:ViewResolver负责将HandlerAdapter返回给DispathcerServlet的ModelAndView通过指定的逻辑视图名生成相应的View然后返回给DispatcherServlet.
参数绑定:HandlerAdapter在执行Handler之前会将请求所携带的参数绑定到方法的形式参数上,我们的Handler上的形式参数可以是:
1. HttpServletRequest:通过request对象获取请求2. HttpservletResponse:通过response处理响应信息3. HttpSession:通过session对象获得里面存放的对象4. ModelMap/Model:通过Model向页面传数据5. 基本数据类型:如果用基本类型那么请求发送过来的参数名要和Hanlder的形参名一样.如果两个名字不一样要绑定的话需要在Handler指定形参前面添加@RequestParam,它可以指定请求发送过来的参数名字,默认值,是否必须要传值.6. Pojo类:只要pojo类的属性名和请求发过来的参数名相同就可以如果pojo类的属性是一个类那么请求发过来的参数名必须符合OGNL表达式的写法,(类.属性)7. 自定义参数:如果我们需要将传过来的参数进行简单的转换那么就需要自定义参数,自定义参数我们需要创建一个类去实现Converter接口8. 字符串数组:只需要请求发过来的参数名和字符串的名字相同就可以.9. List集合:如果List的泛型是引用类型则传过来的参数名称要是集合名字[].泛型的属性名itemList[0].id10. Map:传过来的参数名字必须是map类型的参数名[key]
Controller的返回值:
1. ModelAndView:里面包含有model数据和逻辑视图名2. void:如果形参中有request,response那么就可以用它们来进行转发和重定向,不用将数据返回给DispatcherServlet3. String:String可以返回一个逻辑视图名,也可以通过redirect,forward来进行转发和重定向
数据回显:当我们请求失败时有可能需要将数据回显,对于简单数据类型会使用Model将参数放到request中model.addAttribute("id", id); springmvc默认支持pojo数据回显,springmvc自动将形参中的pojo重新放回request域中,request的key为pojo的类名,如果参数名和key对应不上我们可以使用@ModelAttribute(key)来讲参数回显.
Json交互:如果Handler要接受一个json数据那么在参数名前面加上@RequestBody,如果要返回一个json数据要在返回值类型上加@ResponseBody
拦截器:是用来对Handler进行预处理和后处理的,拦截器类需要实现HandlerInterceptor接口.
springmvc.xml配置:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 处理对静态资源访问,不走前端控制器-->
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
<!--配置处理器适配器:用于执行处理器(handle) 所有实现的controller接口的都可以被他执行
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
配置处理器适配器:用于执行处理器(handle) 所有实现的HttpRequestHandler接口的都可以被他执行
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
配置处理器映射器:用来找到处理器
根据bean的name进行查找Handler 将action的url配置在bean的name中
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增强版本,它可以将url和处理器bean的id进行统一映射配置
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/items1.action">itemList</prop>
<prop key="/items2.action">itemList</prop>
<prop key="/items3.action">itemList1</prop>
</props>
</property>
</bean>
Handler配置
<bean name="/items.action" id="itemList" class="cn.itcast.springmvc.controller.ItemList"/>
Handler配置
<bean name="/items3.action" id="itemList1" class="cn.itcast.springmvc.controller.ItemList2"/>-->
<!-- 注解开发,上面的Handler,HandlerMapping,HandlerAdapter都用注解代替-->
<!-- 扫描controller注解,完成controller注入-->
<context:component-scan base-package="cn.itcast.springmvc.controller"/>
<!--注解适配器
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
json转换器
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
</list>
</property>
</bean>-->
<!--注解映射器 -->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> -->
<!-- 上边的注解处理器映射器和适配器配置可以使用下边mvc:annotation-driven代替,conversion-service用于开启自定义参数
使用annotation-driven 不需要配置json转换器-->
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 自定义参数 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<!-- 自定义参数必须实现Converter接口 -->
<bean class="cn.itcast.spring.converter.DateConverter"/>
</list>
</property>
</bean>
<!-- 配置视图解析器:用来将modelAndView解析成符合要求的view -->
<!-- ViewResolver -->
<!-- InternalResourceViewResolver:支持JSP视图解析 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- viewClass : JstlView表示JSP模板页面需要使用JSTL标签库 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<!--前缀与后缀用来组成最终视图的地址-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 配置异常处理器 -->
<!-- 自定义异常处理器必须要实现HandlerExceptionResolver -->
<bean id="handlerExceptionResolver" class="cn.itcast.spring.exception.CustomExceptionResolver"/>
<!--拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截器拦截路径,/**拦截所有url -->
<mvc:mapping path="/**"/>
<!-- 自定义拦截器必须要实现HandlerInterceptor-->
<bean class="cn.itcast.spring.handlerinterceptor.HandlerInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
<!-- 文件上传 -->
<!-- Multipart解析器-->
<!-- 配置好以后,在Handler的形式参数中加入 MultipartFile参数 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
</beans>