SSM之SpringMVC-自定义类型转换器咋写?文件上传怎么操作?SpringMVC如何获得数据请求的Cookie与请求头?

40 篇文章 0 订阅
6 篇文章 0 订阅

写在前面
记录自己的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>

在注解驱动中写入,如图
不配置自定义类型转换器操作结果如图![[Pasted image 20211201154403.png]]
配置后可成功运行,控制台如图![[Pasted image 20211201155642.png]]

2.4.10 SpringMVC乱码问题

2.4.10.1 问题

当前台用post传数据给后台时,有时可能会需要传输中文格式的数据,但是可能会遇到这种情况,如图![[Pasted image 20211201135840.png]]
即后台显示的中文数据是乱码,而不是我们想要的。

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服务器会自动产生并注入,可以直接调用。
    代码操作:
  • 添加资源依赖,如图![[Pasted image 20211202153723.png]]
  • 业务方法,如图![[Pasted image 20211202153804.png]]
    运行结果,如图![[Pasted image 20211202154005.png]]

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,如图![[Pasted image 20211202164817.png]]
  • 配置文件上传解析器
    在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类方法中用数组来操作。
表单如图![[Pasted image 20211202215027.png]]
controller方法如图![[Pasted image 20211202215112.png]]
运行结果如图![[Pasted image 20211202215612.ng]]
上传成功,如图![[Pasted image 20211202215637.png]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值