转发:SpringMVC默认就是以转发的形式响应JSP,也就是说直接返回视图名称的方式就是转发
重定向:需要使用redirect: + 视图路径,当然也可以重定向到指定url再次进行处理,比如:redirect:/user/list
需要注意的是业务方法中,设置重定向不能像转发一样写逻辑视图,必须写明目标资源的物理路径,如"redirect:/index.jsp"
@RequestMapping("redirectTest")
public String redirectTest(){
return "redirect:/index.jsp";
}
1.如果是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>
2.如果请求中接收到参数没有乱码,但是返回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对象是没有问题的
}
3.每个方法加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>
4.针对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应用上下文 -->
<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>
该配置作用是注册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。 使用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>
如果想在方法中直接使用HttpServletRequest、HttpServletResponse、HttpSession等对象,需要引入servlet的依赖包
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<!-- 编译测试有效,必须设置,否则运行tomcat容器会报错 -->
<scope>provided</scope>
</dependency>
动力节点在线课程涵盖零基础入门,高级进阶,在职提升三大主力内容,覆盖Java从入门到就业提升的全体系学习内容。全部Java视频教程免费观看,相关学习资料免费下载!对于火爆技术,每周一定时更新!如果想了解更多相关技术,可以到动力节点在线免费观看SpringMVC框架视频教程学习哦!
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54