Spring MVC
1、 springMVC简介
springMVC是spring家族的一个表现层的一个模块,其核心是通过核心前端控制器dispatcherServlet来过滤前端的请求
2、 入门案例
-
场景:在前端显示一个数据表格
-
步骤
- 创建web工程
- 添加jar包:springMVC、spring
- 在web.xml中添加一个DispatcherServlet 需要初始化一个springMVC容器
<!-- 配置springMVC的核心前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 默认加载/WEB-INF/{servlet-name}-servlet.xml --> <!-- 设置加载配置文件路径为classpath:springmvc.xml --> <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>
-
创建springmvc.xml
-
创建一个商品pojo
-
创建一个商品的Controller
传统方式:实现一个Controller接口,需要把Controller配置到springmvc.xml中
public class ItemController implements Controller { /** * ModelAndView: model:需要展示的数据 view:需要页面显示的路径 */ @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { //等同于把数据放在request域中 modelAndView.addObject("itemList", list); //设置展示或者跳转路径 modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp"); return modelAndView; } }
<!-- name:url访问路径 class:Controller全限定名 --> <bean name="/list.action" class="com.edu.controller.ItemController"></bean>
注解方式:添加@Controller标签,需要开启注解扫描
@Controller public class ItemController2 { @RequestMapping("/list") public ModelAndView List(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView modelAndView = new ModelAndView(); //等同于把数据放在request域中 modelAndView.addObject("itemList", list); //设置展示或者跳转路径 modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp"); return modelAndView; } }
<!-- 开启注解扫描 --> <context:component-scan base-package="com.edu"/>
- 创建jsp,测试
3、springMVC的三大核心组件
- 处理器映射器(HandlerMapping):找到目标控制器
<!-- 配置文件加载最新处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
- 处理器适配器(HandlerAdapter):找到目标控制器中的目标方法
<!-- 配置文件加载最新处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
注:可以在xml配置文件中用<mvc:annotation-driven/>代替上述配置
- 视图解析器(ViewResover):解析html代码,并展示
<!-- 可不配置,默认配置文件已配置 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
4、springMVC、spring、mybatis整合
- 持久层:dataSource、sqlSessionFactory、MapperScannerConfigurer(mapper映射)
<!-- 配置dataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
......
</bean>
<!-- 配置sqlSessionFactoryBean -->
<bean class=" org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="typeAliasesPackage" value="com.edu.ssm.pojo"></property>
</bean>
<!-- mapper扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.edu.ssm.mapper"></property>
</bean>
- 业务层:事务、注解扫描器
<context:component-scan base-package="com.edu.ssm.serviceImp"/>
<!-- 事务配置 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="tx" transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="tx" pointcut="execution(* com.edu.ssm.serviceimpl.*.*(..))"/>
</aop:config>
- 视图层
<context:component-scan base-package="com.edu.ssm.controller"></context:component-scan>
<!-- 注解驱动 目的:加载新版本的处理器映射器、处理器适配器-->
<mvc:annotation-driven/>
<!-- 配置视图解析器的前缀和后缀,即逻辑视图会加上此前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
- 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>
<!-- 监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
5、 springMVC接收数据(数据绑定)
-
默认绑定
HttpServletRequest request, HttpServletResponse response,HttpSession session,Model model
-
基础数据类型
规则:页面参数的名字(name属性)和形参中的名字保持一致。若不同,则使用@RequestParam注解
@RequestMapping("/itemEdit")
/**
* value:前台的name属性
* required:是否必要,默认值true
* defaultValue:设置默认值
*/
public String itemEdit(@RequestParam(value="id",required=false,defaultValue="1")int itemId,Model model) {
Items items = itemsService.findById(id);
model.addAttribute("item", items);
return "editItem";
}
- 绑定pojo:会自动把前台传来的数据的name值与pojo里的属性进行匹配,成功赋值,不成功为默认值
@RequestMapping("/updateitem")
public String updateItem(Items item,Model model) {
itemsService.update(item);
return "success";
}
注意:提交的表单中不要有日期类型的数据,否则会报400错误。如果想提交日期类型的数据需要用到后面的自定义参数绑定的内容。
- 绑定pojo中的pojo:原理和绑定pojo一样,但前台需要修改name值,如:
//A里面有一个items实体类
<input type="text" name="items.name"/>
- 绑定数组:和基础数据类型绑定方式相同
@RequestMapping("/updateitem")
public String updateItem(int[] ids,Model model) {
itemsService.update(item);
return "success";
}
6、解决乱码
springMVC并没有像Struts2那样处理了乱码问题,所以需要自己处理
- post乱码:在web.xml中添加过滤器
<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乱码:
String name = new String(item.getName().getBytes("iso-8859-1"),"utf-8");
7、自定义转化器
在pojo类的日期属性上添加如下注解:
@DateTimeFormat(pattern = “yyyy-MM-dd”)
8、springmvc与struts2不同
1、 springmvc的入口是一个servlet即前端控制器(DispatherServlet),而struts2入口是一个filter(StrutsPrepareAndExecuteFilter)过虑器。
2、 springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
3、 Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面。Jsp视图解析器默认使用jstl。