Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)

目录

  • 引出:bug::bug::bug:
  • Tomcat开发的bug汇总
  • 项目启动就报错
    • 1.@WebServlet()路径配置的问题
    • 2.由于之前的错误,Context[/day01]启动失败【困扰】
    • 3.启动过滤器异常---init方法
  • JSP使用相关报错
    • 1.后端传给jsp的数据,前端jsp不显示
    • 2.jsp的包没有导,用foreach方法的时候报错【困扰】
    • 3.jsp的forEach方法报错
    • 4.jsp用foreach的时候,没有生成首行一段话
  • session报错
    • 1.session不能转换成String类型
  • servlet业务流程错误
    • 1.在servlet的if处理流程中,没有加return
  • 总结

引出

java的web开发,涉及到前端后端各种交互,路径的转发,重定向等带来的问题,以及需要配置xml文件,导包等很多问题,本文尝试总结在Java网络开发中遇到的bug


Tomcat开发的bug汇总

项目启动就报错

1.@WebServlet()路径配置的问题

(1)@WebServlet(value = “/us”) 中反斜杠 / 没有写;

(2)两个Serlet 指向同一个路径;

(3)DBUtils里面的静态方法出问题;

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第1张图片
Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第2张图片

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第3张图片

2.由于之前的错误,Context[/day01]启动失败【困扰】

困扰一上午的bug

报错信息:

org.apache.catalina.core.StandardContext.startInternal 一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到

org.apache.catalina.core.StandardContext.startInternal 由于之前的错误,Context[/day01]启动失败

问题描述:

在启动项目的时候就报错,报错信息是 一个或多个筛选器启动失败,然后删除了项目中所有的过滤器,还是报错,上网查了解决方案,有说是项目结构的问题,几种说法汇总如下:

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第4张图片

第一种说法:项目的输出路径设置成\WEB-INF\classes;没有解决该问题

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第5张图片

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第6张图片

第二种说法:项目的输出要配置,如下图,配置完成后,也没有解决该问题

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第7张图片

第三种说法,在项目中添加jar包,新建lib目录,然后导入相关的包;也没有解决该问题

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第8张图片

以上几种方式,尝试过后都无效,最后突发奇想,既然是web项目,那如果把servlet的文件全部删除,项目都没有servlet了,那肯定能启动起来,结果把servlet文件全部删除后,项目成功启动起来;

从而把问题定位到了servlet这里,仔细查看servlet文件后,发现了最终的原因,是因为一个servlet的注解@WebServlet(“/user/login”),不小心设置成了@WebFilter(“/user/info”),所以启动不起来,再回过头来看,报错信息确实是对的,就是一个或多个筛选器启动失败;但是这个报错信息没有定位到代码部分,所以查起来就比较麻烦。

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第9张图片

解决方案:

把@WebFilter(“/user/info”)改成,@WebServlet(“/user/info”)

3.启动过滤器异常—init方法

报错信息:

org.apache.catalina.core.StandardContext.filterStart 启动过滤器异常[com.tianju.filter.LoginAuthorServlet]

问题描述:

配置了一个过滤器,过滤器也实现了doFilter方法,但是项目就是启动不起来,过滤器启动异常,导致项目启动不起来,报错;

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第10张图片

原因:

原因是tomcat8.5的过滤器需要实现init方法,如果不实现,就会报错,tomcat高版本才支持不实现;

解决方法:

实现init方法:

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("DemoFilter init");
    }

JSP使用相关报错

1.后端传给jsp的数据,前端jsp不显示

问题描述:

后端传给jsp的数据,前端jsp没有显示出来,原因是官方生成的web.xml文件版本低,很多功能不支持,需要更换成下面这种

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第11张图片

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第12张图片

web.xml文件如下:


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
web-app>

2.jsp的包没有导,用foreach方法的时候报错【困扰】

报错信息:

javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/LoopTag

问题描述:

在jsp文件中,如果注释掉foreach部分的代码,前端jsp文件就能正常进入,也能显示从后端拿到的信息;

但是如果加上foreach部分的代码,就报错,后台的错误指向了servlet的转发部分;但其实是能进到这里的,所有这个问题查了好久,以为是req的问题,后来以为是foreach语法写错的问题;

最后突然想到,可能是xml包没导,最后补充了jsp相关的包,问题解决。

req.getRequestDispatcher("/news/list.jsp").forward(req, resp);

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第13张图片
Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第14张图片

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第15张图片

jsp相关的包:

  
  <dependency>
    <groupId>javax.servlet.jspgroupId>
    <artifactId>javax.servlet.jsp-apiartifactId>
    <version>2.3.3version>
    
    <scope>providedscope>
  dependency>

  <dependency>
    <groupId>javax.servletgroupId>
    <artifactId>jstlartifactId>
    <version>1.2version>
  dependency>

  <dependency>
    <groupId>taglibsgroupId>
    <artifactId>standardartifactId>
    <version>1.1.2version>
  dependency>

3.jsp的forEach方法报错

org.apache.jasper.JasperException: 在 [57] 行处理 [/news/list.jsp] 时发生异常

语法错误,多打印了一个h

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第16张图片

4.jsp用foreach的时候,没有生成首行一段话

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

问题描述:

前端jsp能拿到后端发来的数据,但是没法进入forEcah方法中,不生效;

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第17张图片

session报错

1.session不能转换成String类型

报错信息:

java.lang.ClassCastException: org.apache.catalina.session.StandardSessionFacade cannot be cast to java.lang.String

问题描述:

保存到session的时候,不小心把session存进了session里,然后拿的时候用(String)类型转换

存的时候:

    // 验证码存到session空间中
    HttpSession session = req.getSession();
    session.setAttribute("yzm", session);

取的时候

    // +++++判断验证码是否正确
    HttpSession session = req.getSession();
    // 从session中获取验证码
    String yzm = (String)session.getAttribute("yzm");

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第18张图片
解决方法:

应该保存验证码的4位数字

servlet业务流程错误

1.在servlet的if处理流程中,没有加return

问题描述:

如果在servlet中,需要if处理的业务流程,没有加return,通常会引起其他错误,因为没有return,程序会继续往下执行;如下图的例子,这里用户名密码输入错误,没有加return,导致即使非法用户也能登陆进入系统。

Java网络开发(Tomcat)——遇到的 bug 汇总(持续更新)_第19张图片


总结

bug不可怕,找到它并消灭就好了!

你可能感兴趣的:(Java,java,tomcat,bug)