Web应用点击超链接报错排查及无web.xml配置方案咨询
首先,咱们拆解下你遇到的404问题,从配置和代码里能看到几个明显的问题点:
1. 拼写错误导致映射不匹配
你在web.xml里把Servlet拼写成了NextPageServlent(多了个n,正确拼写是Servlet),这个低级错误会让容器找不到对应的Servlet映射,直接触发404。
2. JSP文件路径配置错误
你的<jsp-file>/NextPageServlent/nextPage.jsp</jsp-file>假设nextPage.jsp放在了NextPageServlent子目录下,但如果你的JSP实际是在Web应用根目录(比如src/main/webapp或WebContent),这个路径就完全错了,应该改成/nextPage.jsp。
3. URL映射与请求路径不匹配
你实际访问的是/Welcome/nextPage,但web.xml里的映射是/NextPageServlent/*,两者完全不对应。同时index.jsp里的链接是<a href="nextPage">,这个相对路径基于当前页面URL(比如http://localhost:8080/Welcome/),所以请求的是/Welcome/nextPage,需要让这个路径和你的Servlet映射对上。
修改web.xml的正确配置方案
把上述问题修正后,修改后的web.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>MyApp</display-name> <welcome-file-list> <welcome-file>WelcomeServlet</welcome-file> </welcome-file-list> <!-- 修正拼写错误,调整JSP路径 --> <servlet> <servlet-name>NextPageServlet</servlet-name> <jsp-file>/nextPage.jsp</jsp-file> </servlet> <!-- 映射到你实际请求的/nextPage路径 --> <servlet-mapping> <servlet-name>NextPageServlet</servlet-name> <url-pattern>/nextPage</url-pattern> </servlet-mapping> </web-app>
同时确保nextPage.jsp确实在Web应用的根目录下,这样访问/Welcome/nextPage就能正确找到对应的页面了。
不用web.xml的解决方案(Servlet 3.0+支持)
当然可以不用web.xml!Servlet 3.0及以上版本支持注解式配置和直接访问JSP文件,给你两种可选方案:
方案1:直接访问JSP文件
如果nextPage.jsp只是静态或简单的JSP页面,完全不需要配置Servlet,直接修改index.jsp里的链接:
<a href="nextPage.jsp">go to the next page </a>
点击后会直接请求/Welcome/nextPage.jsp,只要JSP在根目录,就能正常访问,全程不需要web.xml配置。
方案2:注解式Servlet
如果nextPage需要Servlet逻辑处理,可以创建一个Servlet类,用@WebServlet注解指定映射路径,示例代码:
import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/nextPage") public class NextPageServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // 这里写你的业务逻辑 request.getRequestDispatcher("/nextPage.jsp").forward(request, response); } }
这种方式下,你可以直接删除web.xml(或者保留但移除Servlet相关配置),容器会自动识别注解并完成映射。
内容的提问来源于stack exchange,提问作者student

