JavaEE框架---SpringMVC第一部分

摘要:

  1. SpringMVC介绍
  2. 入门程序
  3. SpringMVC架构讲解
    1. 框架结构
    2. 组件说明
  4. SpringMVC整合MyBatis
  5. 参数绑定
    1. SpringMVC默认支持的类型
    2. 简单数据类型
    3. Pojo类型
    4. Pojo包装类型
    5. 自定义参数绑定
  6. SpringMVC和Struts2的区别

 2.    Spring入门

2.1. Springmvc是什么

Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来,如下图:

JavaEE框架---SpringMVC第一部分

2.2. Springmvc处理流程

JavaEE框架---SpringMVC第一部分

2.3. 入门程序

需求:使用浏览器显示商品列表

2.3.1. 创建web工程

2.3.2. 导入jar包

JavaEE框架---SpringMVC第一部分

2.3.3. 加入配置文件

2.3.3.1. 创建springmvc.xml

创建SpringMVC的核心配置文件

SpringMVC本身就是Spring的子项目,对Spring兼容性很好,不需要做很多配置。

这里只配置一个Controller扫描就可以了,让Spring对页面控制层Controller进行管理。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

	<!-- 配置controller扫描包=================== -->
	<context:component-scan base-package="com.itheima" />

	<!-- 配置处理器映射器,默认的已经废弃 -->
	<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> -->
	<!-- 配置处理器适配器,默认的已经废弃 -->
	<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" /> -->
	
	<!-- 注解驱动,替代上面两个====================== -->
	<mvc:annotation-driven/>
	
	<!-- 配置视图解析器 ==========================-->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 配置逻辑视图的前缀 -->
		<property name="prefix" value="/WEB-INF/jsp/"/>
		<!-- 配置逻辑视图的后缀 -->
		<property name="suffix" value=".jsp"/>
	</bean>
	
</beans>

2.3.3.2. 配置前端控制器

配置SpringMVC的前端控制器DispatcherServlet

在web.xml中

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SpringMvc_day01</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 配置SpringMVC前端控制器 -->
  <servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  		<!-- 指定SpringMVC配置文件 -->
		<!-- SpringMVC的配置文件的默认路径是/WEB-INF/${servlet-name}-servlet.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>
  		<!-- 
  			1. /*拦截所有,全部拦截
  			2. *.action *.do 拦截以do,action结尾的请求    ERP
  			3. /拦截所有(不包括jsp)(包含 .js  .png  .css) 强烈建议使用  面向前端消费者  对静态资源放行
  		 -->
  	<url-pattern>/</url-pattern>
  </servlet-mapping>
  
</web-app>

2.3.4. 加入jsp页面
把参考资料中的itemList.jsp复制到工程的/WEB-INF/jsp目录下,如下图:

2.3.5. 实现显示商品列表页

2.3.5.1. 创建pojo
分析页面,查看页面需要的数据,如下图:

JavaEE框架---SpringMVC第一部分

2.3.5.2. 创建ItemController

ItemController是一个普通的java类,不需要实现任何接口。

需要在类上添加@Controller注解,把Controller交由Spring管理

在方法上面添加@RequestMapping注解,里面指定请求的url。其中“.action”可以加也可以不加。

JavaEE框架---SpringMVC第一部分

3.    Springmvc架构

3.1. 框架结构

框架结构如下图: 

JavaEE框架---SpringMVC第一部分

3.2. 架构流程

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
  5. 执行处理器(Controller,也叫后端控制器)。
  6. Controller执行完成返回ModelAndView
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  9. ViewReslover解析后返回具体View
  10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
  11. DispatcherServlet响应用户

3.3. 组件说明

以下组件通常使用框架提供实现:

  • DispatcherServlet:前端控制器

用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

  • HandlerMapping:处理器映射器

HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

  • Handler:处理器

Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。

由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

  • HandlAdapter:处理器适配器

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

下图是许多不同的适配器,最终都可以使用usb接口连接

  • ViewResolver:视图解析器

View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

  • View:视图

springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。

一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。

需要用户开发的组件有handlerview

3.4. 默认加载的组件

我们没有做任何配置,就可以使用这些组件
因为框架已经默认加载这些组件了,配置文件位置如下图:

3.5. 组件扫描器

使用组件扫描器省去在spring容器配置每个Controller类的繁琐。

使用<context:component-scan>自动扫描标记@Controller的控制器类,

在springmvc.xml配置文件中配置如下:

JavaEE框架---SpringMVC第一部分

3.6. 注解映射器和适配器

3.6.1. 配置处理器映射器

注解式处理器映射器,对类中标记了@ResquestMapping的方法进行映射。根据@ResquestMapping定义的url匹配@ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器。
HandlerMethod对象中封装url对应的方法Method。 

从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。

在springmvc.xml配置文件中配置如下:

JavaEE框架---SpringMVC第一部分

注解描述:

@RequestMapping定义请求url到处理器功能方法的映射

3.6.2. 配置处理器适配器

注解式处理器适配器,对标记@ResquestMapping的方法进行适配。

从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。

在springmvc.xml配置文件中配置如下:

JavaEE框架---SpringMVC第一部分

3.6.3. 注解驱动

直接配置处理器映射器和处理器适配器比较麻烦,可以使用注解驱动来加载。
SpringMVC使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter
可以在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。

JavaEE框架---SpringMVC第一部分

3.7. 视图解析器

视图解析器使用SpringMVC框架默认的InternalResourceViewResolver,这个视图解析器支持JSP视图解析
在springmvc.xml配置文件中配置如下:

JavaEE框架---SpringMVC第一部分

逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为ItemList,则最终返回的jsp视图地址:

“WEB-INF/jsp/itemList.jsp”

最终jsp物理地址:前缀+逻辑视图名+后缀

4.    整合mybatis

    为了更好的学习 springmvc和mybatis整合开发的方法,需要将springmvc和mybatis进行整合。

整合目标:控制层采用springmvc、持久层使用mybatis实现。

4.1. 创建数据库表

sql脚本,位置如下图:

4.2. 需要的jar包

1.    spring(包括springmvc)
2.    mybatis
3.    mybatis-spring整合包
4.    数据库驱动
5.    第三方连接池。

jar包位置如下图:

JavaEE框架---SpringMVC第一部分

4.3. 整合思路

Dao层:

  1. SqlMapConfig.xml,空文件即可,但是需要文件头。
  2. applicationContext-dao.xml
    1. 数据库连接池
    2. SqlSessionFactory对象,需要spring和mybatis整合包下的。
    3. 配置mapper文件扫描器。

Service层:

  1. applicationContext-service.xml包扫描器,扫描@service注解的类。
  2. applicationContext-trans.xml配置事务。

Controller层:

  1. Springmvc.xml
    1. 包扫描器,扫描@Controller注解的类。
    2. 配置注解驱动
    3. 配置视图解析器

Web.xml文件:

  1. 配置spring
  2. 配置前端控制器。

4.4. 创建工程

4.5. 加入jar包

复制jar包到/WEB-INF/lib中
工程自动加载jar包

4.6. 加入配置文件

创建资源文件夹config
在其下创建mybatis和spring文件夹,用来存放配置文件,如下图:

4.6.1. sqlMapConfig.xml

使用****来生成Mapper相关代码,不需要配置别名。
在config/mybatis下创建SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 设置别名 -->
	<typeAliases>
		<!-- 2. 指定扫描包,会把包内所有的类都设置别名,别名的名称就是类名,大小写不敏感 -->
		<package name="com.itheima.springmvc.pojo" />
	</typeAliases>
	
</configuration>

4.6.2. applicationContext-dao.xml

配置数据源、配置SqlSessionFactory、mapper扫描器。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

   <!-- 加载配置文件 ===================-->
   <context:property-placeholder location="classpath:db.properties" />

	<!-- 数据库连接池 ====================-->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="maxActive" value="10" />
		<property name="maxIdle" value="5" />
	</bean>

	<!-- 配置SqlSessionFactory ==================-->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 配置mybatis核心配置文件 -->
		<property name="configLocation" value="classpath:SqlMapConfig.xml" />
		<!-- 配置数据源 -->
		<property name="dataSource" ref="dataSource" />
	</bean>
	
	<!--Mapper动态代理开发  扫描  ======================-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 导入基本包
		1.不用传入sqlSessionFactory,底层已经集成了
		2.只需要传入基本包,底层根据基本包把所有的 mapper的实现类都创建了,只需要根据接口名调用即可
		-->
		<property name="basePackage" value="com.itheima.springmvc.dao"/>
	</bean>
	
	<!-- 配置事务管理器=========================-->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 注解式事务=============================== -->
	<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

4.6.3. db.properties

4.6.3. springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

	<!-- 配置controller扫描包 -->
	<context:component-scan base-package="com.itheima" />

	<!-- 配置处理器映射器,默认的已经废弃 -->
	<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> -->
	<!-- 配置处理器适配器,默认的已经废弃 -->
	<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" /> -->
	
	<!-- 注解驱动,替代上面两个 -->
	<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
	
	<!-- 设置Convert转换器 转换日期、格式、去掉空格。。。 -->
	<bean id="conversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<!-- 配置多个转换器 -->
		<property name="converters">
			<list>
				<bean class="com.itheima.springmvc.convert.DateConveter"/>
			</list>
		</property>
	</bean>
	
	<!-- 配置视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
	
</beans>

4.6.7. web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SpringMVC-Mybatis</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 加载spring的配置文件 -->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <!-- Spring的监听器 -->
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <!-- 配置解决post乱码的过滤器 -->
  <filter>
  	<filter-name>encoding</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>encoding</filter-name>
  	<url-pattern>*.action</url-pattern>
  </filter-mapping>
  
  
  <!-- 配置SpringMVC前端控制器 -->
  <servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  		<!-- 指定SpringMVC配置文件 -->
		<!-- SpringMVC的配置文件的默认路径是/WEB-INF/${servlet-name}-servlet.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>
  		<!-- 
  			1. /*拦截所有,全部拦截
  			2. *.action *.do 拦截以do,action结尾的请求    ERP
  			3. /拦截所有(不包括jsp)(包含 .js  .png  .css) 强烈建议使用  面向前端消费者  对静态资源放行
  		 -->
  	<url-pattern>*.action</url-pattern>
  </servlet-mapping>
  
</web-app>

4.7. 加入jsp页面

4.8. 效果

JavaEE框架---SpringMVC第一部分

5.    实现商品列表显示

5.1. 需求

实现商品查询列表,从mysql数据库查询商品信息。

5.2. DAO开发

使用****,生成代码

JavaEE框架---SpringMVC第一部分

5.3. ItemService接口

JavaEE框架---SpringMVC第一部分

5.4. ItemServiceImpl实现类

JavaEE框架---SpringMVC第一部分

5.5. ItemController

JavaEE框架---SpringMVC第一部分

6.    参数绑定

6.1. 默认支持的参数类型

6.1.1. 需求

打开商品编辑页面,展示商品信息。

6.1.2. 需求分析

编辑商品信息,首先要显示商品详情
需要根据商品id查询商品信息,然后展示到页面。
请求的url:/itemEdit.action
参数:id(商品id)
响应结果:商品编辑页面,展示商品详细信息。

6.1.3. ItemService接口

编写ItemService接口如下图:

JavaEE框架---SpringMVC第一部分

6.1.4. ItemServiceImpl实现类

JavaEE框架---SpringMVC第一部分

6.1.5. ItemController

页面点击修改按钮,发起请求

http://127.0.0.1:8080/springmvc-web/itemEdit.action?id=1

需要从请求的参数中把请求的id取出来。

Id包含在Request对象中。可以从Request对象中取id。

想获得Request对象只需要在Controller方法的形参中添加一个参数即可。Springmvc框架会自动把Request对象传递给方法。

代码实现

JavaEE框架---SpringMVC第一部分

6.1.6. 默认支持的参数类型

处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值。

6.1.6.1. HttpServletRequest
通过request对象获取请求信息
6.1.6.2. HttpServletResponse
通过response处理响应信息
6.1.6.3. HttpSession
通过session对象得到session中存放的对象

6.1.7. Model/ModelMap

6.1.7.1. Model

除了ModelAndView以外,还可以使用Model来向页面传递数据,
Model是一个接口,在参数里直接声明model即可。
如果使用Model则可以不使用ModelAndView对象,Model对象可以向页面传递数据,View对象则可以使用String返回值替代。
不管是Model还是ModelAndView,其本质都是使用Request对象向jsp传递数据。
代码实现:

JavaEE框架---SpringMVC第一部分

6.1.7.2. ModelMap
ModelMap是Model接口的实现类,也可以通过ModelMap向页面传递数据

使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。

代码实现:
JavaEE框架---SpringMVC第一部分

6.2. 绑定简单类型

当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。
这样,从Request取参数的方法就可以进一步简化。

JavaEE框架---SpringMVC第一部分

6.2.1. 支持的数据类型

参数类型推荐使用包装数据类型,因为基础数据类型不可以为null

整形:Integer、int

字符串:String

单精度:Float、float

双精度:Double、double

布尔型:Boolean、boolean

说明:对于布尔类型的参数,请求的参数值为true或false。或者1或0

请求url:

http://localhost:8080/xxx.action?id=2&status=false

处理器方法:

public String editItem(Model model,Integer id,Boolean status)

6.2.2. @RequestParam

使用@RequestParam常用于处理简单类型的绑定。

value参数名字,即入参的请求参数名字,如value=“itemId表示请求的参数    区中的名字为itemId的参数的值将传入

required是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错

TTP Status 400 - Required Integer parameter 'XXXX' is not present

defaultValue默认值,表示如果请求中没有同名参数时的默认值

定义如下:

JavaEE框架---SpringMVC第一部分

6.3. 绑定pojo类型

6.3.1. 需求    

将页面修改后的商品信息保存到数据库中。

6.3.2. 需求分析

请求的url:/updateItem.action
参数:表单中的数据。
响应内容:更新成功页面

6.3.3. 使用pojo接收表单数据

如果提交的参数很多,或者提交的表单中的内容很多的时候,可以使用简单类型接受数据,也可以使用pojo接收数据。
要求:pojo对象中的属性名和表单中input的name属性一致。

页面定义如下图:

JavaEE框架---SpringMVC第一部分

Pojo(****生成)如下图:

JavaEE框架---SpringMVC第一部分

请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性。

6.3.6. ItemController

JavaEE框架---SpringMVC第一部分

注意:

提交的表单中不要有日期类型的数据,否则会报400错误。如果想提交日期类型的数据需要用到后面的自定义参数绑定的内容。

6.3.8. 解决post乱码问题

提交发现,保存成功,但是保存的是乱码
在web.xml中加入:
JavaEE框架---SpringMVC第一部分

以上可以解决post请求乱码问题。

对于get请求中文参数出现乱码解决方法有两个:

修改tomcat配置文件添加编码与工程编码一致,如下:

<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

另外一种方法对参数进行重新编码:

String userName new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码

6.4. 绑定包装pojo

6.4.1. 需求

使用包装的pojo接收商品信息的查询条件。

6.4.2. 需求分析

包装对象定义如下:

JavaEE框架---SpringMVC第一部分

页面定义如下图:

JavaEE框架---SpringMVC第一部分

6.4.3. 接收查询条件

JavaEE框架---SpringMVC第一部分

6.5. 自定义参数绑定

6.5.1. 需求

在商品修改页面可以修改商品的生产日期,并且根据业务需求自定义日期格式。

6.5.2. 需求分析

由于日期数据有很多种格式,springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。

前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。可以在springmvc处理器适配器上自定义转换器Converter进行参数绑定。

一般使用<mvc:annotation-driven/>注解驱动加载处理器适配器,可以在此标签上进行配置。

6.5.3. 修改jsp页面

如下图修改itemEdit.jsp页面,显示时间

JavaEE框架---SpringMVC第一部分

6.5.4. 自定义Converter

JavaEE框架---SpringMVC第一部分

6.5.5. 配置Converter

我们同时可以配置多个的转换器。在springmvc.xml里面

JavaEE框架---SpringMVC第一部分

7.    springmvc与struts2不同

  1. springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过滤器。
  2. springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
  3. Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面。Jsp视图解析器默认使用jstl。