笔记32 SpringMVC中使用静态资源、处理中文乱码
一、静态资源的使用
在WebConfig.java中有如下代码段
1 @Override // 配置静态资源处理 2 public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 3 // TODO Auto-generated method stub 4 configurer.enable(); 5 }
此时会注册一个默认的Handler:DefaultServletHttpRequestHandler,这个Handler也是用来处理静态文件的,它会尝试映射/*。当DispatcherServelt映射/时(/ 和/* 是有区别的),并且没有找到合适的Handler来处理请求时,就会交给DefaultServletHttpRequestHandler 来处理。注意:这里的静态资源是放置在web根目录下,而非WEB-INF 下。
可能这里的描述有点不好懂(我自己也这么觉得),所以简单举个例子,例如:在webroot目录下有一个图片:1.png 我们知道Servelt规范中web根目录(webroot)下的文件可以直接访问的,但是由于DispatcherServlet配置了映射路径是:/ ,它几乎把所有的请求都拦截了,从而导致1.png 访问不到,这时注册一个DefaultServletHttpRequestHandler就可以解决这个问题。其实可以理解为DispatcherServlet破坏了Servlet的一个特性(根目录下的文件可以直接访问),DefaultServletHttpRequestHandler是帮助回归这个特性的。
问: /和/* 有什么区别?
答: /会拦截除了jsp以外的所有url,/* 会拦截所有url,包括jsp。例如:在webroot下面有一个test.jsp,当DispatcherServlet 配置映射/ 时,浏览器输入:http://localhost:8083/test.jsp 这个jsp是可以直接访问的,并且不经过DispatcherServlet ,而当DispatcherServlet 配置映射/* 时,这个请求就会被DispatcherServlet 拦截。
使用JSTL标签:
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<img src="<s:url value="/resources/profile/images/profile_img.png" />" > 使用对应目录下的图片,同理使用其他静态资源类似。
二、处理中文乱码——表单提交controller获得中文参数后乱码解决方案
注意: jsp页面编码设置为UTF-8
1.form表单提交方式为必须为post,get方式下面spring编码过滤器不起效果
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<form action="${ctx}/user/addUser" name="userForm" method="post">
2.修改web.xml,增加编码过滤器,如下(注意,需要设置forceEncoding参数值为true) web.xml在WEB-INF目录下
<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>

浙公网安备 33010602011771号