WebContent下Pages文件夹内页面无法访问包中CreateNewCampaign Servlet的HTTP 404问题求助
嘿,我遇到过好多次这种Servlet配置后仍报404的情况,大概率是路径匹配或者部署细节出了问题,咱们一步步来排查:
1. 先确认web.xml的配置是否规范
你说已经完成了映射,但还是要仔细核对几个关键点,先给你一个标准的配置示例对照:
<servlet> <servlet-name>CreateNewCampaign</servlet-name> <!-- 这里必须写完整的包名+类名,比如com.yourteam.servlets.CreateNewCampaign,不能只写类名 --> <servlet-class>your.package.path.CreateNewCampaign</servlet-class> </servlet> <servlet-mapping> <servlet-name>CreateNewCampaign</servlet-name> <!-- 注意路径开头的斜杠/,这是根路径映射的关键 --> <url-pattern>/CreateNewCampaign</url-pattern> </servlet-mapping>
要检查的点:
<servlet-class>有没有漏写包路径?如果只写CreateNewCampaign,容器根本找不到你的类<url-pattern>开头是不是加了/?没加的话,容器会把它当成相对路径匹配,很容易出错
2. 页面请求路径是重灾区!
你的页面在WebContent/Pages/目录下,直接写相对路径肯定会错!举个例子:
如果你的Servlet映射是/CreateNewCampaign,那页面里的请求必须用绝对路径,比如JSP表单里这么写:
<form action="${pageContext.request.contextPath}/CreateNewCampaign" method="post"> <!-- 表单内容 --> </form>
这里${pageContext.request.contextPath}会自动获取你的项目上下文路径(比如/YourProjectName),这样不管页面在哪个目录下,请求都会指向正确的Servlet路径。
要是你直接写action="CreateNewCampaign",实际请求的路径会变成/YourProjectName/Pages/CreateNewCampaign,这和Servlet的映射路径完全不匹配,自然报404。tables.jsp的问题应该也是同样的原因。
3. 检查Servlet类是否真的部署到位了
别光看源码,去你的项目部署目录里看看WEB-INF/classes下有没有对应的包和.class文件。比如你的Servlet在com.yourpackage包下,那必须存在WEB-INF/classes/com/yourpackage/CreateNewCampaign.class,否则容器找不到类,也会返回404。
4. 别忘了上下文路径
访问的时候要带上项目的上下文路径,比如你的项目部署后上下文路径是/CampaignTool,那完整的Servlet访问URL应该是http://localhost:8080/CampaignTool/CreateNewCampaign,直接访问http://localhost:8080/CreateNewCampaign肯定找不到。
如果方便的话,把你的web.xml完整内容贴出来,我能帮你更精准地定位问题,但先按上面的步骤排查,应该能找到症结所在。
内容的提问来源于stack exchange,提问作者Prasoon Mishra

