起因
先说一下各项版本
- SpringMVC5.x
- JDK11
- Tomcat8/10
最近在学SpringMVC的时候,看到了Tomcat8.x解决了get乱码的问题,但是post乱码的问题没有解决。Tomcat10.x解决了这个问题,本以为很快就能将其构建好,结果…
总之就是各种各样的报错,期间查阅了很多文档,万分感谢
原因
- Tomcat基于Jakarta EE 9,其中api的包名从javax更改到Jakarta
- 对于SpringMVC5.x来说,DispatcherServlet属于javax包下
解决方案
- 降低Tomcat到10以前版本
- 升级到SpringMVC6.x(还未攻克)
SpringMVC6.x支持相关JDK版本
可以看到Spring6.x 仅支持jdk17及以上的版本(这是我瞎搞了两三天才看到的…),而我是jdk11,算了不搞了…
tomcat10注意事项
tomcat10有了很多新特性,有了许多新的坑。下面我说一下这两天我了解到的一部分。
导入tomcat10依赖
注意,这里是jakarta不是javax
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
tomcat10 web.xml文件
tomcat10与之前版本的web.xml是不同的,可以自行在tomcat安装包目录下的conf文件下的web.xml文件中找到配置文件(大概在18行左右),当更改配置文件不出意外的的话,应该会出现标签报红的情况。需要在找到tomcat安装包下的bin/servlet-api.jar文件,将其部署到项目src/main/webapp/WEB-INF/lib中。
tomcat 乱码问题
写在前面:刚开始不管怎么设置都乱码,后面不管怎么样设置都正常…
之前在学javaweb的时候,tomcat在控制台乱码的问题已经解决了,这次又出现了这个问题。查阅了很多的资料,都没有解决这个问题,甚至原先正常的get方式获取的数据也变成了乱码
乱码原因
- tomcat控制台输出文件默认编码格式为UTF-8
- windows默认编码格式为GBK
- idea默认文件编码格式为GBK
所以乱码问题从启动方式上可以分为两种
- startup.bat启动的tomcat,因为原因1,2造成
- idea控制台server乱码的原因,因为原因1,3造成
解决方法
startup.bat启动乱码
这种不是很有必要解决,因为我们平常也不会从startup.bat文件中启动tomcat,如果你真的想改,可以把conf/logging.properties文件中的UTF-8改为GBK,但是控制台会乱码(我的idea是这样的)
控制台乱码
- 将conf/logging.properties文件中的GBK改为UTF-8
- idea点击Help=>Edit Custom VM Options,添加
-Dfile.encoding=UTF-8
-Djdk.util.zip.ensureTrailingSlash=false
-javaagent:C:\Users\Public.jetbrains\jetbrains-agent-v3.2.1.c46b.ed7=by https://zhile.io
- 重启idea,如果还不行,可以试一下格式化idea,重新操作一下(重装能解决大部分问题…)
get乱码
如果你的tomcati是8之前的版本,那么页面在通过get方法传输数据时,你获取的数据可能会乱码。这是因为8之前的版本传输数据用的是西欧的ISO-8859-1编码集,8-9解决了get方式的乱码,10解决了get和post方式的乱码。
在conf/server.xml文件如下图位置加入URIEncoding=“UTF-8”,post乱码在项目web.xml文件中设置编码过滤器即可(应该也能直接解决get问题)
<!--配置Spring的编码过滤器-->
<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>
ps:后续文章还会更新,如有错误,还望指正