【Bug向】IDEA 2020.2配置Tomcat 8.5 及项目运行

    科技2026-02-04  5

    本篇针对个人学习情况,大部分需注意的点在【6-2】-【6-3】节课件中有所标注,以下介绍的是自己实际做项目时遇到并已解决的问题。根据需要食用 ~

    1、创建JavaWeb项目流程

    正常创建Java项目

    至此,JavaWeb项目创建成功,接着配置Tomcat服务器

    最后点击 OK,配置完成!

    关于idea 中Update resources和Update classes and resources、Redeploy的区别和应用场景(即 下方图片框住部分如何配置),官方文档最可靠!–> Application update options

    2、重命名index.jsp页面,启动服务器结果报错404

    解决:修改启动服务器的首个页面的路径(或配置指向),具体方案如图

    3、报错 java.lang.NoClassDefFoundError: Could not initialize class DruidUtil(数据库工具类)

    解决:问题出在静态代码块,无法完成某些静态变量或者方法的初始化工作

    【tips】

    参考:关于java.lang.NoClassDefFoundError处理(我遇到的坑could not initialize class xmlreaders)

    区别 NoClassDefFoundError & ClassNotFoundException 他们都与Java classpath有关,但又完全不同。NoClassDefFoundError 发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了 java.lang.NoClassDefFoundError 的错误,而 ClassNotFoundException 是在编译的时候在classpath中找不到对应的类而发生的错误。ClassNotFoundException 比 NoClassDefFoundError容易解决,是因为在编译时我们就知道错误发生,并且完全是由于环境的问题导致。而如果你在J2EE的环境下工作,并且得到 NoClassDefFoundError 异常,而且对应的错误的类是确实存在的,这说明这个类对于类加载器来说,可能是不可见的。

    4、空指针问题

    多数出现的空指针问题由于没有拿取到对象或值,可以先赋初始值。

    5、使用过滤器检查是否是游客模式,以及放行过滤的问题

    解决:注意逻辑就好,下述情况放行

    正在访问登陆页面登陆成功进入的首页(由于是转发url为login.do,地址没有改变即不是hp.jsp)登陆失败提示页面" / ",Tomcat配置了默认访问login.jsp,所以浏览器打开第一个显示登陆页面,但路径是/当前用户已登录,即session中存有user对象

    6、@WebServlet 注解,url-pattern " \ " 必须

    示范:@WebServlet(urlPatterns = {"/login.do"})

    【tips】配置servlet映射的两种方式:

    web.xml配置

    @WebServlet 注解。从Servlet3.0开始,配置Servlet支持注解方式

    loadOnStartup:标记容器是否在启动应用时就加载Servlet,默认不配置或配置负数表示客户端第一 次请求Servlet时再加载;0或正数表示启动应用就加载,正数情况下,数值越小,加载该Servlet的优先级越高

    urlPatterns 常用规则: /* 或 / – 拦截所有 *.do – 拦截指定后缀 /user/test – 拦截指定路径

    7、java.util.Date & java.sql.Date

    java.util.Date

    针对除sql语句外的日常场景使用的

    java.sql.Date / java.sql.Time / java.sql.TimeStamp

    针对sql语句使用的都是 java.util.Date 的直接子类java.sql.Date 只包含日期部分,java.sql.Time 只包含时间部分,java.sql.Stamp 包含日期+精确时间 // 两者都有 getTime() 方法,获取自标准基准时间以来的毫秒数(即1970年1月1日00:00:00 GMT) // java.util.Date => java.sql.Date java.util.Date udate = new java.util.Date(); java.sql.Date sqlDate=new java.sql.Date(udate.getTime()); // 日期部分 java.sql.Time sTime=new java.sql.Time(udate.getTime()); // 时间部分 java.sql.Timestamp stp=new java.sql.Timestamp(udate.getTime()); // 时间戳(日期+精确时间) // java.sql.Date => java.util.Date java.sql.Date sdate = java.sql.Date.valueOf("2020-10-01"); // 将指定日期字符串转换为 Date 型 Date date = new Date(sdate.getTime());

    8、项目目录结构

    【tips】项目导包流程

    参考:【intellij idea】Project Structure 讲解

    9、web层类继承HttpServlet飘红

    【tips】两种实现servlet的方式:

    继承 HttpServlet实现 Servlet 接口

    10、关于JSTL

    参考:js里面可以用el表达式吗

    1、如果Javascript在JSP中,是可以用el表达式的,用引号包住即可。

    2、如果Javsscript在外联的JS文件中,则不可以,因为js文件是在客户端执行的。

    11、前后端分离开发

    12、把之前的项目代码优化了,项目目录重新整理,结果服务器运行报错

    报错 Caused by: java.lang.IllegalArgumentException:The servlets named [com.myproject.service.CommentServlet] and [com.myproject.web.CommentServlet] are both mapped to the url-pattern[/CommentServlet] which is not permitted",意思就是,我一个/CommentServlet请求映射了两个servlet。

    之前因为不清楚项目结构把servlets文件都放在了service包,现在直接移入com.myProject.web包下。我寻思着挪过了,这service目录下也没那东西啊,结果搞了一下午加一个多小时,发现是因为没有删除旧的.class文件(肯定是这些文件里包含之前编译的信息),我的.class全部存在默认的out目录中,所以果断直接删掉!就!O!K!让他全部重新编译。 (我气我自己!!!)

    参考:tomcat报"The servlets named [x] and [y] are both mapped to the url-pattern[z] which is not permitted"

    Processed: 0.010, SQL: 9