在使用Spring mvc的时候,可以按照之前传统的配置方式来进行配置,也可以直接使用Spring Boot 来进行搭建你的环境,
spring boot 是对Spring mvc的一个相当于再一次的简化。但是在使用的时候,还需要知道具体的流程。
Spring mvc 的执行流程
- 用户发送请求到前端控制器
- 前端控制器接收到请求,调用处理器映射器
- 处理器映射器根据请求url去查找处理器,返回给前端控制器
- 前端控制器通过处理器适配器调用处理器
- 执行处理器
- 执行完成返回ModelAndView
- 处理器适配器将执行的结果返回前端控制器
- 前端控制器调用视图解析器
- 视图解析器返回具体的View
- 前端控制器对View进行渲染视图
- 前端控制器响应用户
组件说明:
- 前端控制器;DispatcherServlet 、用户请求到达前端控制器,他就相当于Mvc中的C (控制层),DispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户的请求,他的存在降低了组件之间的耦合性。在Web.xml中配置前端控制器
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
注意:如果不指定xml的路劲,默认为/WEB-INF/${servlet-name}-servlet.xml
-
处理器映射器:HandlerMapping、HandlerMapping负责根据用户请求到的Handler即处理器,Spring Mvc 提供了不同的映射器实现不同的映射方式,例如:配置文件方式、实现接口方式、注解方式等等。
-
处理器:Handler 、Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户的请求进行处理
-
处理器适配器:HandlerAdapter、HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行
-
视图解析器:View Resolver 、View Resolver 负责将处理器结果生成View视图,View Resolver 首先根据逻辑视图名解析成物理视图物理视图名即具体的页面的地址,在生成View 视图对象,最后对View 进行渲染将处理结果通过页面展示给用户
-
视图:View 、 springmvc 框架提供了很多的View 视图类型的支持,包括:jstl 、 freemarker 、pdf等
Spring Mvc 的配置:
- 组件扫描器:<context:componet-span base-package="需要扫描的包名">、扫描Controller类上面的注解
- 注解式处理器映射器:<bean class ="rg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping ">,注解式处理器映射器,对类中标记的@RequestMapping 的方法进行映射,根据RequestMapping 定义的url匹配 RequestMapping 标记的方法,匹配成功之后返回HandlerMethod 对象给前端控制器,HandlerMethod对象中封装url 对应的方法Method。
- 注解式处理器适配器:<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>,注解式处理器适配器,对标记@RequestMapping 的方法进行适配
- 配置注解驱动:<mvc:annotation-driven> ,该配置如果配置,则不需要配置<!-- 配置处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 配置处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>这两个。 - 视图解析器:<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean> , InternalResourceViewResolver: 支持jsp视图解析、默认为jstl 的解析。prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为:
前缀+逻辑视图名+后缀,
逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello,则最终返回的jsp视图地址 “WEB-INF/jsp/hello.jsp”
参数绑定:
- 功能描述:处理器在执行Hadler之前需要把http请求的key/value 数据绑定到Handler方法形参上
- 默认支持的类型:处理器方法形参中添加如下类型的参数处理器适配器会默认识别并进行赋值
- HttpServletRequest : 通过Request对象获取请求的信息
- HttpServletResponse: 通过Resonse 处理响应的信息
- HttpSession : 通过session对象得到session中存放的对象
- ModelMap : ModelMap 是Model接口的实现类,通过Model或ModelMap向页面传递数据,在使用Model或ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap,需要注意的是:本质是通过Response向jsp页面发送数据
- 例如:
@RequestMapping("/itemEdit") public String editItem( HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model) {}
-
简单的类型
-
介绍:当请求的参数名称和处理器方法形参名称一致时会将请求参数与形参进行绑定
-
整形:Interger 、ing
-
字符串:String
-
单精度:Float、float
-
双精度:Double 、double
-
布尔类型:Boolean 、 boolean
-
-
@RequestParam:
-
介绍:当请求的参数名称和处理器方法形参名称不一致时使用
-
例如:
@RequestMapping("/itemEdit") public String editItem( @RequestParam( value="id",defaultValue="1",required=true) Integer ids, Model model) { }
说明:完成参数id和ids的绑定,value:参数名称,即入参的请求参数名称。required:是否必须,默认是true,表示请求中一定有相应的参数,否则会报错,defaultValue:默认值,表示如果请求中没有同名参数时的默认值
-
-
Pojo类型
-
介绍:当请求参数过多的时候,可以采用Pojo接收参数,要求参数名称和Pojo属性名称一致
-
实体类定义:
public class Items { private String name; private Float price; }
-
页面表单
<td>商品名称</td> <td><input type="text" name="name" /> </td> </tr> <tr> <td>商品价格</td> <td><input type="text" name="price" /> </td> </tr>
-
注意:默认只支持简单数据类型,日期类型需要用到转换器
-
例如:
@RequestMapping("/updateitem") public String updateItem(Items items) { }
-
-
包装的Pojo
-
实体类定义
public class QueryVo { private Items items; public Items getItems() { return items; } public void setItems(Items items) { this.items = items; } }
-
页面表单
<td>商品名称: <input type="text" name="items.name"/> </td> <td>商品id: <input type="text" name="items.price"/> </td>
- 例如:
<td>商品名称: <input type="text" name="items.name"/> </td> <td>商品id: <input type="text" name="items.price"/> </td>
-
- 自定义参数转换:
- 需求分析:1、由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。
2、前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。
3、在springmvc这可以在处理器适配器上自定义Converter进行参数绑定。
4、如果使用<mvc:annotation-driven/>可以在此标签上进行扩展。 - 自定义Converter
package com.itheima.springmvc.converter; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.core.convert.converter.Converter; public class DateConverter implements Converter<String, Date> { @Override public Date convert(String source) { try { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = simpleDateFormat.parse(source); return date; } catch (Exception e) { e.printStackTrace(); } return null; } } // 说明: // Converter // 第一个泛型:source源数据类型 // 第二个泛型:target 目标数据类型
-
处理器适配器上配置
<mvc:annotation-driven conversion-service="conversionService"/> <!-- 转换器的配置 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.itheima.springmvc. converter.DateConverter"> </bean> </set> </property> </bean>
- 需求分析:1、由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。
-
乱码问题:
-
post乱码问题:
<!-- 解决post乱码问题 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- get乱码问题:
1、 修改tomcat配置文件添加编码与工程编码一致,如下: <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> 2、对参数进行重新编码 String userName new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8") ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码
-
- spring mvc 和 staruts 的区别
- 1、springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
2、springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
3、Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
- 1、springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。