SpringMVC配置讲解
请求转发与重定向
转发: SpringMVC默认就是以转发的形式响应JSP,也就是说直接返回视图名称的方式就是转发
重定向:需要使用redirect:
+ 视图路径,当然也可以重定向到指定url再次进行处理,比如:redirect:/user/list
需要注意的是业务方法中,设置重定向不能像转发一样写逻辑视图,必须写明目标资源的物理路径,如"redirect:/index.jsp"
@RequestMapping("redirectTest")
public String redirectTest(){
return "redirect:/index.jsp";
}
中文乱码配置
- 如果是get请求带中文参数,后台接收到乱码,需要修改tomcat的配置(或者Maven项目中修改tomcat插件配置)
<!-- 1.tomcat 修改配置文件server.xml,添加URIEncoding -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding ="UTF-8"/>
<!-- Maven项目中修改tomcat插件编码 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
- 如果请求中接收到参数没有乱码,但是返回json字符串时候乱码了,可以添加produce解决
@RequestMapping(value = "/index",produces = "application/json;charset=UTF-8")
@ResponseBody
public String index(String name){
System.out.println(name);
People p = new People(name);
return JSONObject.toJSONString(p);
//如果返回的是People对象是没有问题的
}
- 每个方法加produce解决未免过于麻烦,那么可以修改转换器的编码处理,这里处理String的转换器为
StringHttpMessageConverter
,查看源码发现默认的编码是ISO-8859-1
所以在springmvc配置文件中统一修改
<!-- 注解驱动 -->
<mvc:annotation-driven>
<!-- 处理请求返回json字符串的中文乱码问题 -->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
- 针对POST表单提交,我们还需要配置过滤器进行统一编码处理(最好都配上),该过滤器就是springmvc自带
CharacterEncodingFilter
,查看源码可知,配置forceEncoding
将会强制使用这里配置的编码,而不管请求响应有没有设置编码
<filter>
<filter-name>encodingFilter</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> <!--强制使用Encoding设置的编码格式-->
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
加入Spring的配置
真正的应用肯定少不了Spring,所以这里将spring配置加上
<!-- spring应用上下文 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/configs/spring/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
springmvc的上下文层级,理解层次化的ApplicationContext
带小s的loaderlistener
所加载形成的上下文,可以有多个,为我们提供了所有应用公共所使用的组件和服务,如sevice、dao,这些服务应该被整个应用所共享,而不应该被局限在某个dispatcherServlet
上下文之中
不带小s的,就是与我们的dispatcherServlet
相关的上下文。dispatcherservlet
可以有多个,因为在现在的互联网中,一个应用可能需要提供多种服务,而让dispatcherservlet
针对不同的服务请求去分发。因为有些服务是完全不同于其他服务的,所以需要作区分,根据配置的url-pattern
进行拦截。
spring配置文件
<context:component-scan base-package="com.rxy.mvcdemo">
<!-- 不需要管理controller -->
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<MVC:annotation-driven />
该配置作用是注册RequestMappingHandlerMapping
与RequestMappingHandlerAdapter
两个Bean,这是Spring MVC为@Controller
分发请求所必需的,并且提供了数据绑定支持,@NumberFormatannotation
支持,@DateTimeFormat
支持,@Valid
支持读写XML的支持(JAXB)和读写JSON的支持(默认Jackson)等功能
静态资源映射
location:指location指定的目录不要拦截,直接请求
mapping:指在static目录下的所有文件(**代表所有文件)
cache-period:设置静态资源在客户端浏览器中的缓存有效时间
该配置意思就是在根目录下static的所有文件不会被DispatcherServlet
拦截,直接访问,当做静态资源交给Servlet处理
<!-- 静态资源映射 -->
<mvc:resources mapping="/static/**" location="/static/" cache-period="31536000"/>
配置ViewResolver
可以配置多个ViewResolver。 使用order属性排序。 InternalResourceViewResolver
需要放在最后。
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
<entry key="htm" value="text/html" />
</map>
</property>
<property name="defaultViews">
<list>
<!-- JSON View -->
<bean
class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
</bean>
</list>
</property>
<property name="ignoreAcceptHeader" value="true" />
</bean>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsps/" />
<property name="suffix" value=".jsp" />
</bean>
使用Servlet相关对象
如果想在方法中直接使用HttpServletRequest
、HttpServletResponse
、HttpSession
等对象,需要引入servlet的依赖包
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<!-- 编译测试有效,必须设置,否则运行tomcat容器会报错 -->
<scope>provided</scope>
</dependency>