- 依赖spring-webmvc
- 配置DispatcherServlet:这是spring mvc中的核心组件,用于请求的配置和转发
- 启用Spring MVC注解模式:在官方也是默认优先使用注解来进行开发工作
- 配置请求与响应字符集
- 配置FreeMarker模板引擎
- 配置Json序列化组件
新建maven项目
设置web
打开项目结构,新增web模块
修改web.xml文件保存在哪个路径上
创建全新的Artifacts, 目前默认把所有的资源都发布在左侧的发布列表中
配置Tomcat
将以下两处改为“更新类和资源”,这样在调试过程中修改源代码就不需要重启tomcat,就可以完成类和资源的热部署。
编写index.html,放置在webapp目录下,与WEB-INF同级
导入相关依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.imooc</groupId>
<artifactId>imooc-reader</artifactId>
<version>1.0-SNAPSHOT</version>
<!--0.Maven国内阿里云镜像-->
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<dependencies>
<!--1.引入Spring-webmvc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!--2.引入FreeMarker依赖-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
<!--2.1.引入Spring对FreeMarker的支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!--3.引入JSON序列化工具包jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
</project>
配置DispatcherServlet
<!-- 配置DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
新建applicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
启用Spring MVC注解模式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--Spring 开启组件扫描-->
<!--
这一行不是springmvc开启注解模式,而是spring框架来启用注解模式,
从而在容器初始化时,去实例注入像service,controller这样的对象
-->
<context:component-scan base-package="com.imooc"/>
<!--开启spring MVC注解模式-->
<mvc:annotation-driven/>
<!--将图片/JS/CSS等静态资源排除在外,这样做可提高Spring MVC对url的处理效率-->
<mvc:default-servlet-handler/>
</beans>
配置请求与响应字符集
解决Post请求中文编码问题
解决post请求当中的中文乱码核心是一个filter过滤器,过滤器名字可以自定义,这里写characterFilter,而filter-class对应的处理类是由spring提供的web.filter.CharacterEncodingFilter,通过这个过滤器对于post请求的中文乱码的字符机转换,那转换成什么呢?这里需要使用init-param初始化参数,ame设置成encoding,value设置成utf-8,他会将post请求体中的数据按照utf-8字符集进行转换。而filter-mapping映射这里指向characterFilter,url-pattern是/*,对所有的请求进行拦截。
<!--解决post请求中文乱码问题-->
<filter>
<filter-name>characterFilter</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>
<filter-mapping>
<filter-name>characterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
解决Get请求中文编码问题
设置Tomcat配置文件server.xml中的URIEncoding属性,配置UTF-8。因为Tomcat8.0及以后的版本,已经帮我们做好了,所以我们不需要在自己配置了。
解决Response响应中文编码问题
关键的一个配置项是在annotation-driven中增加一个子标签,注意这个解决响应中文输出是需要在driven里边额外增加<mvc:message-converters>,message-converters是消息转换器,这里我们定义一个bean,这个bean的class比较长,是”org.springframework.http.converter.StringHttpMessageConverter”,这个类用来管理我们响应输出所产生的字符集,其核心的一个属性为”supportedMediaTypes”,在这个属性中通过设置list集合来说明响应输出的字符集,在value里要书写text/html;说明响应的内容类型是一个HTML,浏览器会对其进行解析,与此同时,如果要解决中文还要设置charset=utf-8,这样浏览器就会将响应所产生的结果按照utf-8进行转换后,再按照html格式文本进行解析,进而解决了响应输出时的中文乱码问题。
<!--开启spring MVC注解模式-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=utf-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
配置FreeMarker模板引擎
首先第一个配置一个bean,id等于freemarkerConfig,这是指freemarker的配置对象,他的类指向是”org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer”,这个配置类用于通知springmvc到底我们去哪个目录下去加载脚本,其中要设置两个属性,第一个是”templateLoaderPath”,指向加载服务器的哪个目录,也就是脚本存放地址;还有一个属性是”freemarkerSettings”,针对freemarker本身还有哪些要配置的参数,这里最核心的一个属性是defaultEncoding。将默认的编码类型设置为utf-8。
这里的utf-8是指读取指定ftl文件的时候,读取文件时来采用utf-8编码读取这个文件,避免在ftl脚本文件内部因为包含中文从而导致的乱码问题,这个utf-8它的作用时机是在读取ftl文件时所使用的,和请求与响应中的字符集没有半毛钱关系。
还要设置一个bean,id等于“ViewResolver”,他表示具体使用哪个模板引擎,指向的类”org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver”,真正的执行的对象是ViewResolver, 在这其中要设置两个参数,第一个是ContentType,响应类型,设置为”text/html;charset=utf-8″,在这里进行视图解析器将数据和模板引擎结合所产生的新的HTML片段,那么像响应输出时设置它的内容类型为这个value,因为包含了utf-8,所以不会产生中文乱码的问题。
上下两个字符编码的应用场景是不同的,下面的是加载freemarker产生HTML片段返回数据的时候所使用的,而上面的这个是指在没有使用freemarker模引擎直接通过响应向客户端输出的时候,才会有这个效果。最典型的一个应用场景就是我们客户端通过ajax向服务器提交请求,由服务器直接产生json字符串,返回的时候是由上面这一项来生效的,关于这两项的区别呢必须要了解。
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/ftl"/>
<property name="freemarkerSettings">
<props>
<prop key="defaultEncoding">UTF-8</prop>
</props>
</property>
</bean>
<bean id="ViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="contentType" value="text/html;charset=utf-8"/>
<property name="suffix" value=".ftl"/>
</bean>
配置Json序列化组件
JSON序列化输出的时候,我们要做哪些设置呢?其实就一项,在讲解restful风格的时候都说过restful风格从服务器产生的是json字符串,那么作为json字符串,它本身也要考虑到中文乱码的情况,因此在我们响应输出的时候也要对json格式的字符串呢进行相应的编码转换。
编写测试用例:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import java.util.HashMap;
import java.util.Map;
@Controller
public class TestController {
@GetMapping("/test/t1")
public ModelAndView test1() {
return new ModelAndView("/test");
}
@GetMapping("/test/t2")
@ResponseBody//直接通过方法向外产生响应文本
public Map test2() {
Map result = new HashMap();
result.put("test", "测试JSON的文本");
return result;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99474.html