近期在跟着打一个javaweb项目的时候,自己搭建Tomcat环境之后,访问jsp页面之后跳转访问Servlet资源时却出现404错误,如下图:
通常的话出现404错误肯定是先检查自己的访问路径有没有写对,我检查后我这个路径是没有错的,代码逻辑也是没问题的(因为是照着培训视频打的,同时也有把培训视频的代码替换我的代码也是运行不了),于是我就开始在网上搜索解决方案了,以下是我在网上搜到的解决方案以及自己的一点片面见解,因为别人实力较菜,写这篇文章也只是想着分享一下自己的解决方法,在说的过程中如果有错误的话,欢迎大家指出来,以免我误导别人O(∩_∩)
一.servlet版本与tomcat版本不对应
这个问题真的很致命,因为我自己问题就是出现在这(我承认自己是有点弱智...),我用的Tomcat版本是8.5.x,然后一直用的是4.0的Servlet版本(版本得对应上,不过我之前没对应上的时候好像也可以运行Servlet),这一次做的项目用到了EL表达式,终于在这一次出现问题了,在网上找了那么多方案,兜兜转转原来是出现在这里,于是我重新创建了JavaEE7的项目,选择了3.1版本(我这个项目采用的是注解配置),后来重新布置了下环境,就能运行了
这里我也给出我在网上搜到的Servlet和Tomcat对应版本的表
ervlet Spec | JSP Spec | EL Spec | WebSocket Spec | JASPIC Spec | Apache Tomcat version | Actual release revision | Supported Java Versions |
---|---|---|---|---|---|---|---|
4.0 | TBD (2.4?) | TBD (3.1?) | TBD (1.2?) | 1.1 | 9.0.x | 9.0.0.M9 (alpha) | 8 and later |
3.1 | 2.3 | 3.0 | 1.1 | 1.1 | 8.5.x | 8.5.4 | 7 and later |
3.1 | 2.3 | 3.0 | 1.1 | N/A | 8.0.x (superseded) | 8.0.35 (superseded) | 7 and later |
3.0 | 2.2 | 2.2 | 1.1 | N/A | 7.0.x | 7.0.70 | 6 and later (7 and later for WebSocket) |
2.5 | 2.1 | 2.1 | N/A | N/A | 6.0.x | 6.0.45 | 5 and later |
2.4 | 2.0 | N/A | N/A | N/A | 5.5.x (archived) | 5.5.36 (archived) | 1.4 and later |
2.3 | 1.2 | N/A | N/A | N/A | 4.1.x (archived) | 4.1.40 (archived) | 1.3 and later |
2.2 | 1.1 | N/A | N/A | N/A | 3.3.x (archived) | 3.3.2 (archived) | 1.1 and later |
二.注解方式的WebServlet配置错误
这个错误也是很多新人比较容易犯的错误了,采用注解配置的话,idea自动生动的Servlet的模板是
@WebServlet( name="类名")
但其实这样并没有配置好路径,我们可以将其改为以下两种方式
①@WebServlet( name="类名",urlPatterns="/路径")
举例:@WebServlet( name="UserListSerlvet",urlPatterns="/userListServlet")
②@WebServlet( value="/路径") ,此处value要是只有一个可以省略
举例:@WebServlet( "/userListServlet")
上面的斜杠千万不能落下
这里开始就说我在网上看到别人出现这个错误,几个比较有代表性的解决方法
三.未能正确部署Web项目到Tomcat上
(解决方法来源于https://blog.csdn.net/eaphyy/article/details/72513914)
1首先,右击项目,点击 open module settings
2.配置 project,主要是本地 jdk 的安装路径,还有项目编译输出的路径
3.配置 modules ,其中 paths 定位到 web-inf/classes ;dependencies 加入jdk和项目 web-inf/lib(其实这里默认选择就可以)
4.配置 libraries ,点击 + 号,选择 java ,然后还是选择你项目的 web-inf/lib
5.配置 facets ,此步很重要,配置 web resource directories ,路径配错,就会报 404 ,一定要定位到项目根目录,也就是下面有整个项目源码的地方(这里的话我一开始也有犯了这个错误,因为在项目里面新建个模板,然后也不知道为什么路径会定位到别的地方,所幸最后改过来)
下图是我引用的博主他犯的错误
博主原话:“本人就是定位到了另一个地方,导致 404,本来应该到 webroot,结定位到了 web”
6.配置 artifacts ,此步选择第二个,选择你的项目即可
7、部署到 tomcat,“Run”中的“Edit Configurations...”
(这里其实设置了Deployment的时候前面基本会默认帮我们修改)
四.文件放置到错误位置(非idea)
在网上搜索的时候看到了这篇文章,我觉得也应该是比较有效的解决方法,下面的评价都还不错,但看他里面说的那些文件夹的名字好像是用eclipse编辑才会产生的文件名,因为我用的是idea,所以这里就不多阐述,用eclipse的朋友可以去看一下(不过因为这篇文章已经过了两年多了,效果我也不太敢保证,就是在我看到的那一些文章中比较有代表性的吧)。
五.未能正确的配置web.xml文件
这里的话针对的是用web.xml配置访问目录的,这里的话其实要是知道怎么配置基本不会出现这个问题,不过要是编辑错的话确实会出现404错误,这里就稍微提一下
1 <servlet> 2 <servlet-name>HWS</servlet-name> <!--给serverlet取名字,可任意--> 3 <servlet-class>com.web.servlet.HelloWorldServlet</servlet-class> <!--指明servlet路径包名+类名,也就是全类名--> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>HWS</servlet-name> <!--对应上面的名字--> 7 <url-pattern>/hws</url-pattern> <!--这是在浏览器中输入访问这个servlet的资源定位符,可任意,注意斜杆--> 8 </servlet-mapping>
这里最后也给出Servlet的一些规范吧
JAVA servlet 2.x规范:
项目目录结构必须要有WEB-INF,web.xml等文件夹和文件
在web.xml中配置servlet,filter,listener,以web.xml为java web项目的统一入口
JAVA servlet 3.x规范:
项目中可以不需要WEB-INF,web.xml等文件夹和文件
在没有web.xml文件的情况下,通过注解实现servlet,filter, listener的声明,例如
@WebServlet, @WebFilter,@WebListener,当使用注解时,容器自动进行扫描。
(原文链接:https://blog.csdn.net/m0_38059795/article/details/78694177)
Servlet3.1规范:https://www.cnblogs.com/heartstage/archive/2013/10/10/3362138.html
这篇文章是我花了比较多时间整理出来的吧,原创内容也不多,主要也是说想分享出来给那些同样出现这个问题的朋友参考下,当然可能不一定能解决您的疑惑╮(╯▽╰)╭,最后也再啰嗦一句,因为本人实力较菜,所以如果这篇文章里面有说得不对的地方,也希望大家能指出来,我也不想误导大家。