JavaServerPages篇05 —— JSP相关Bug解决

 欢迎来到我的主页:【一只认真写代码的程序猿

本篇文章收录于专栏【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的。直接点击下面两个网址就能下载):

https://repo.maven.apache.org/maven2/jakarta/servlet/jsp/jstl/jakarta.servlet.jsp.jstl-api/2.0.0/jakarta.servlet.jsp.jstl-api-2.0.0.jar

https://repo.maven.apache.org/maven2/org/glassfish/web/jakarta.servlet.jsp.jstl/2.0.0/jakarta.servlet.jsp.jstl-2.0.0.jar

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 自动连接到项目。

操作步骤:

  1. 打开 IDEA 的 Run/Debug Configurations

  2. 找到你的 Tomcat 配置。

  3. 取消勾选 After launch 选项。

  4. 保存并重新启动 Tomcat。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Echo-Nie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值