1、访问静态资源
在项目中我们可以需要用到 js 、css 和图片等静态资源,而在 SpringMVC 中我们请求静态资源时通常会报 404 错误。
这是为什么呢?因为在 SpringMVC 中的入口是 前端控制器DispatcherServlet,在 web.xml 中配置前端控制器时,我们通常的给url-pattern属性
配置的是/
,代表对所有的资源都进行过滤操作。所以在访问静态资源时,SpringMVC 进行了过滤操作,从而访问不到我们需要的静态资源。
当然对于这种情况,SpringMVC 也给出了两种解决办法:
- 指定放行的资源:告诉 SpringMVC 那些资源不需要你进行处理,通过在配置文件中添加配置项完成。
<mvc:resources mapping="/js/**" location="/js/" /> <mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/image/**" location="/image/" /> <mvc:resources mapping="/font/**" location="/font/" /> <mvc:resources mapping="/fonts/**" location="/fonts/" />
- 当访问静态资源时,SpringMVC 在 Controller 的方法中寻找匹配项,如果没有就将这个请求丢给 web容器配置的默认servlet(defaultServlet)进行处理。这种方式只需要写一条配置语句。
<mvc:default-servlet-handler/>
2、中文乱码
想要避免中文乱码文件,肯定需要统一编码方式,从页面到后端再到数据库都需要统一编码方式,这样才能避免乱码。
- 页面编码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
- URL中的乱码:修改 Tomcat 中 server.xml 文件中
Connector
,加上一个URIEncoding="utf-8"
- 配置过滤器,指定所有请求的编码:配置 Spring 的编码过滤器,为了防止Spring 中 post 方式提交的时候中文乱码通过在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>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 在连接数据库时指定编码格式:
jdbc:mysql://127.0.0.1:3306/xxx?useUnicode=true&characterEncoding=UTF-8
。
3、类型转换器
3.1、内置的类型转换器
在 SpringMVC 框架中,对于常用的数据类型 SpringMVC 框架有许多内置的类型转换器用于完成常用的类型转换。SpringMVC 框架的类型转换是通过 Converter<S,T> 实现的,这里 S 表示源类型,T 表示目标类型。Spring MVC 框架对于基本类型(例如 int、long、float、double、boolean 以及 char 等)已经做好了基本类型转换。
3.2、自定义类型转换器
虽然 SpringMVC 提供了很多内置的类型转换器,但是在开发过程中难免遇到不能满足需求的时候,所以我们还可以根据具体需求去自定义一个类型转换器。我们可以通过实现 Converter<S,T> 接口来完成类型转换器的定义:
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = format.parse(source);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
在定义完成之后,我们还需要在配置文件种配置转换器:
<!-- 配置转换器,这是一个转换器的服务工厂,将所有的转换器全部放在工厂内 -->
<bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<!-- 自定义转换器 -->
<bean class="com.itheima.converter.DateConverter"/>
<!-- 还可以添加更多的自定义转换器 -->
</list>
</property>
</bean>
<!-- 在配置完转换器的服务工厂之后,我们还要告诉 SpringMVC 我们使用服务工厂 -->
<mvc:annotation-driven conversion-service="converterService"/>