SpringMVC 细节处理
一、post 请求, 中文乱码问题
解决办法:web.xml 中添加CharacterEncodingFilter
<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>
二、类型转换问题
POJO中日期属性:可以使用 @DateTimeFormat
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
POJO中特殊字符串转数字: 可以使用 @NumberFormat
//字符串 19,991,231.9
@NumberFormat(pattern = "#,###,###.#")
private Double money;
Json 转 POJO 或 POJO 转json: 需要使用到 Jackson 依赖包
<!--引入jackson支持包,实现对象与json的互转。-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
@RequestBody 修饰参数,表示 Json 转 POJO
@ResponseBody 修饰返回值,或者方法 表示 POJO 转Json
三、dispartcherServlet url-parttent 设置 / 问题
dispartcherServlet 拦截路径设置 为 / 时 会拦截 除了 jsp 的所有资源,
原因:
因为 tomcat 默认有一个 default Servlet 拦截的虚拟 目录就是 / , 这个默认的servlet 是专门用来处理 静态资源的,系统 启动时,先加载 tomcat 的web.xml 配置文件, 然后再加载 项目的web.xml 配置文件, 这个时候,dispartcherServlet 的拦截目录会 覆盖 default Servlet, 从而导致无法访问静态资源
解决办法:
default *.html *.css *.js *.jpg ``` ```
<mvc:resources mapping="/pages/**" location="/pages/"/>
<mvc:resources mapping="/index.html" location="/index.html"/>3. <font color='red'>推荐使用这种</font> ```xml <mvc:default-servlet-handler/>
restful 风格 put delete 响应报错问题
原因:
浏览器 不支持 put 和 delete 请求或响应, 所以 controller 接受 put 或 delete 请求时,不能直接 重定向 或转发 , 只能向浏览器 响应json 数据
文件上传
需要使用 apache 的 fileupload 包
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
上传文件三要素
- 提交方式:post
- 表单类型:enctype=“multipart/form-data”
- 文件域:
apache fileupload 上传文件
private void saveFile(String path, String fileName, HttpServletRequest request) throws Exception {
//获得文件真实路径
String realPath = request.getServletContext().getRealPath(path);
//创建文件夹
File dir = new File(realPath);
if (!dir.exists()) {
dir.mkdirs();
}
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
List<FileItem> fileItems = servletFileUpload.parseRequest(request);
//遍历集合,判断是否是 文件域
for (FileItem fileItem : fileItems) {
if (!fileItem.isFormField()) {
//获得上传的文件名
String name = fileItem.getName();
//获得一个文件文件名
String newFileName = UUID.randomUUID().toString().replaceAll("-", "") + name.substring(name.lastIndexOf("."));
//写入文件到硬盘
fileItem.write(new File(realPath, newFileName));
//清除临时文件
fileItem.delete();
}
}
}
SpringMVC 文件上传
注意:需要导入 apache fileupload 包, 还需要配置 multipartersolver 解析器
<!-- 解析器的id 必须是这个,不然会报错 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
// 注意 MultipartFile 的变量名 必须和 表单的 name 属性一致
@RequestMapping("/upload2")
public String upload2(MultipartFile upload, HttpServletRequest request) {
String realPath = request.getServletContext().getRealPath("file");
//创建文件夹
File dir = new File(realPath);
if (!dir.exists()) {
dir.mkdirs();
}
String fileName = upload.getOriginalFilename();
String newFileName = UUID.randomUUID().toString().replaceAll("-", "") + fileName.substring(fileName.lastIndexOf("."));
try {
upload.transferTo(new File(dir, newFileName));
} catch (IOException e) {
e.printStackTrace();
}
return SUCCESS;
}