欢迎来到我的主页:【一只认真写代码的程序猿】
本篇文章收录于专栏【JSP相关】
如果这篇文章对你有帮助,希望点赞收藏加关注啦~
本文所有内容相关代码都可在以下仓库中找到:
https://github.com/Echo-Nie/JSPLearn
1 发现使用“out”报错
在tomcat下找到下面两个jar包,放到lib下面。
接着,右键,add as Library
最后得到下图所示即可解决问题。
2 静态include的变量重复定义
如果你在主体中有变量num,然后在foot或者head中也有同名变量,将会报如下错误。
An error occurred at line: [15] in the jsp file: [/footer.jsp] Duplicate local variable num
3 一个超蠢版本问题(2024.11.09更)
在写简单的登录页面demo的过程中发生了一个404问题。
HTTP Status 404 – Not Found Type Status Report Message /JSPTest1/loginServlet Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists. Apache Tomcat/8.5.31
这里是因为是用的8.5,JavaEE被Oracle捐献给Apache了。目前JavaEE的最高版本是 JavaEE8;Apache把JavaEE换名了,以后不叫JavaEE了,以后叫做 jakarta EE。所以JavaEE8版本升级之后叫做JakartaEE9
JavaEE8的时候对应的Servlet类名是:javax.servlet
JakartaEE9的时候对应的Servlet类名是:jakarta.servlet
在Tomcat9之前是javax,Tomcat9之后是Jakarta。如果不替换Tomcat版本将出现以下问题:
javax.servlet.ServletException: Class [LoginServlet] is not a Servlet org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.base/java.lang.Thread.run(Thread.java:1623)
所以最好的办法就是下个Tomcat9之后的版本然后配置一下就没问题了,很蠢的问题,花了我十多分钟。。。。。记录一下自己的傻逼时刻。
补充:可以使用
@WebServlet("/loginServlet")
也可以在web.xml中配置:
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping>
4 JSTL导包问题
如果使用Tomcat8的话,直接去官网下载前面的版本即可。但是
如果使用的是Tomcat10的话,不要下载1.1.2了,要用以下两个包(Jakarta的,官网那个是javax的。直接点击下面两个网址就能下载):
5 项目重命名问题
一个很简单的问题,大部分人也不会犯,但是我手贱试了一下,报错的时候还是有点慌的...
如果把项目重命名,如下:
会导致404,原因很简单,假设原项目是JspLearn,被你改成了JspLearnTest,那么原本你的web项目的路径都是原来的,比如说是xxx/xxx/JspLearn路径下,但是你在xxx/xxx/JspLearnTest路径下会找不到,很合理。这个时候只需要把web重新配置即可,如下图:
把Artifacts重新创建,在Module里面重新添加web配置,最后把tomcat原来的Development和Server重新添加即可。
6 究极奇葩问题mybatis
首先,网上有很多其他方法,但是我试了都不行。最后发现了一个这样的小bug。
下面是我报错的一个测试代码
public class Test {
public static void main(String[] args) {
SqlSession session = GetSqlSession.createSqlSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.queryUserByName("admin");
System.out.println(user);
}
}
如果你发现报错:Exception in thread "main" org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ynu.edu.mapper.UserMapper.queryUserByName
尝试一下把创建包名改成:com/ynu/edu/mapper,而不是com.ynu.edu.mapeer
7 简单问题——请求乱码
在 Java Web 开发中,HTTP 请求的字符编码可能会导致乱码问题,尤其是在处理中文或其他非 ASCII 字符时。乱码问题的出现通常与以下因素有关:
-
Tomcat 版本:Tomcat 8 及以上版本对字符编码的处理与 Tomcat 7 及以下版本不同。
-
请求类型:POST 请求和 GET 请求的字符编码处理方式不同。
POST 请求的乱码处理:
无论是 Tomcat 8 及以上版本,还是 Tomcat 7 及以下版本,POST 请求都可能出现乱码。
在 Servlet 中,通过 request.setCharacterEncoding("UTF-8");
设置请求的字符编码为 UTF-8。这行代码需要在获取请求参数之前调用,通常在 doPost
方法的最开始部分。
代码:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); // 设置请求编码为 UTF-8
String name = request.getParameter("name"); // 获取参数
// 其他逻辑
}
GET 请求的乱码处理
Tomcat 8 及以上版本:GET 请求默认不会出现乱码,不需要额外处理。
Tomcat 7 及以下版本:GET 请求可能会出现乱码,需要手动处理。
对于 Tomcat 7 及以下版本,GET 请求的参数需要手动进行字符编码转换。
使用 new String(request.getParameter("参数名").getBytes("ISO-8859-1"), "UTF-8");
将参数从 ISO-8859-1 编码转换为 UTF-8 编码。
代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name"); // 获取参数
if (isTomcat7OrBelow()) { // 判断是否是 Tomcat 7 及以下版本
name = new String(name.getBytes("ISO-8859-1"), "UTF-8"); // 转换编码
}
// 其他逻辑
}
POST 请求:
无论 Tomcat 版本如何,都需要调用 request.setCharacterEncoding("UTF-8");
来设置请求编码。
GET 请求:
如果是 Tomcat 8 及以上版本,不需要额外处理。
如果是 Tomcat 7 及以下版本,需要手动将参数从 ISO-8859-1 编码转换为 UTF-8 编码。
8 奇葩问题 —— Session自动创建三次
原因:
当使用 IntelliJ IDEA 启动 Tomcat 时,IDEA 会自动连接到 Tomcat 并访问项目,这会创建一个 Session。
如果你在 IDEA 中配置了多个部署目标(例如多个浏览器或工具),IDEA 可能会多次访问项目,导致多个 Session 被创建。
解决方法:
取消 IDEA 的 After launch
选项的勾选,避免 IDEA 自动连接到项目。
操作步骤:
-
打开 IDEA 的
Run/Debug Configurations
。 -
找到你的 Tomcat 配置。
-
取消勾选
After launch
选项。 -
保存并重新启动 Tomcat。