写在前面:
记录自己的SpringMVC学习之旅,若看不懂则建议先看前几篇博客,详细代码可在我的Gitee仓库ssm-learning克隆下载学习使用!
2.4.9 自定义类型转换器
2.4.9.1 背景
虽然Spring MVC默认有提供的类型转换器,如字符串转int型,但不是所有的数据类型转换都提供了转换器,而没有提供的数据转换器就需要自定义,如日期类型数据转换。
2.4.9.2 开发步骤
- 定义转换器类实现Converter接口
- 在配置文件中声明转换器
- 在
<annotation-driven>
中引用转换器
2.4.9.3 代码操作
业务方法如下:
@RequestMapping("/datarequest8")
@ResponseBody
public void dataRequest8(Date date)
{
System.out.println(date);
}
自定义日期类型转换器,代码如下:
public class StringToDate implements Converter<String, Date> {
// 将yy-MM-dd类型日期字符串转换为Date对象
public Date convert(String dateString) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd");
Date date = null;
try {
date = simpleDateFormat.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
在配置文件中进行声明,如下:
<!-- 声明自定义类型转换器-->
<bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.demo.converter.StringToDate"/>
</list>
</property>
</bean>
在注解驱动中写入,如图
不配置自定义类型转换器操作结果如图
配置后可成功运行,控制台如图
2.4.10 SpringMVC乱码问题
2.4.10.1 问题
当前台用post传数据给后台时,有时可能会需要传输中文格式的数据,但是可能会遇到这种情况,如图
即后台显示的中文数据是乱码,而不是我们想要的。
2.4.10.2 解决之道
在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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.4.11 获取Servlet相关API
SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用对象如下:
- HttpServletRequest
- HttpServletResponse
- HttpSession
在项目运行时,这些API服务器会自动产生并注入,可以直接调用。
代码操作: - 添加资源依赖,如图
- 业务方法,如图
运行结果,如图
2.4.12 获得数据请求头
2.4.12.1 @RequestHeader
使用@RequestHeader可以直接获得请求头信息,相当于web阶段的request.getHeader(name)
属性:
- value.请求头名称
- required.是否必须携带此请求头
2.4.12.2 @CookieValue
使用@CookieValue可以直接获得指定Cookie的值,属性如下:
- value.指定cookie名称
- required.是否必须携带cookie
2.4.12.3 代码操作
业务方法如下:
// 获取请求头:Header与Cookie
@RequestMapping("/datarequest10")
@ResponseBody
public void dataRequest10(@CookieValue(value = "JESSIONID") String JessionID,@RequestHeader(value = "User-Agent") String userAgent)
{
System.out.println("get Cookie:");
System.out.println(cookie);
System.out.println("get Header:");
System.out.println(userAgent);
}
运行结果如图
2.4.13 文件上传
2.4.13.1 客户端文件上传三要素
- 表单项type值为“file”
- 表单提交方式为post
- 表单中的enctype属性是多部分表单形式,enctype=“multipart/form-data”
代码如下:
<form action="${pageContext.request.contextPath}/datarequest11" method="post" enctype="multipart/form-data">
用户名称:<input type="text" name="userName"><br/>
文件:<input type="file" name="file"><br/>
<input type="submit" value="上传">
</form>
2.4.13.2 文件上传原理
- 当form表单修改为多部分表单时,request.getParameter()将失效
- enctype = "application/x-www-form-unlencoded"时,form表单内容是:
key=value&key=value
- 当form表单的enctype取值为Multipart/form-data时,服务请求正文内容就变为多部分形式,如图
2.4.13.3 单文件上传代码操作
- 导入fileUpload坐标依赖和IO
打开pom文件进行配置并刷新Maven,如图 - 配置文件上传解析器
在springMVC.xml中进行配置解析器,如下:
<!-- 配置文件上传解析器,bean的id必须这样写,不然会报错-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--配置文件上传总最大尺寸-->
<property name="maxUploadSize" value="5242800"/>
<!-- 配置文件上传单个文件大小-->
<property name="maxUploadSizePerFile" value="5242800"/>
<!-- 文件上传编码-->
<property name="defaultEncoding" value="UTF-8"/>
</bean>
- 编写文件上传代码。代码如下:
// 文件上传
@RequestMapping(value = "/datarequest11")
@ResponseBody
public void dataRequest11(String userName, MultipartFile uploadFile) throws Exception
{
// 获得文件名称
if(uploadFile.isEmpty())
System.out.println("can't find file!");
else {
System.out.println(userName);
System.out.println(uploadFile);
String originalFileName = uploadFile.getOriginalFilename();
uploadFile.transferTo(new File("E:\\" + originalFileName));
}
}
2.4.13.4 多文件上传代码操作
与单文件上传操作类似,只不过是表单多几个input标签以及controller类方法中用数组来操作。
表单如图
controller方法如图
运行结果如图
上传成功,如图