Servlet中doGet方法无法跳转至JSP页面的问题求助
你的Servlet代码:
@WebServlet("/") public class HelloServlet extends HttpServlet { private static final long serialVersionUID = 1L; private UserDAO userDAO; public void init() { userDAO = new UserDAO(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getServletPath(); try { switch (action) { case "/new": showNewForm(request, response); break; case "/insert": insertUser(request, response); break; case "/delete": deleteUser(request, response); break; case "/edit": showEditForm(request, response); break; case "/update": updateUser(request, response); break; default: listUser(request, response); break; } } catch (SQLException ex) { throw new ServletException(ex); } } private void listUser(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException, ServletException { List<User> listUser = userDAO.selectAllUsers(); request.setAttribute("listUser", listUser); RequestDispatcher dispatcher = request.getRequestDispatcher("user-list.jsp"); dispatcher.forward(request, response); } private void showNewForm(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = request.getRequestDispatcher("user-form.jsp"); dispatcher.forward(request, response); } private void showEditForm(HttpServletRequest request, HttpServletResponse response) throws SQLException, ServletException, IOException { int id = Integer.parseInt(request.getParameter("id")); User existingUser = userDAO.selectUser(id); RequestDispatcher dispatcher = request.getRequestDispatcher("user-form.jsp"); request.setAttribute("user", existingUser); dispatcher.forward(request, response); } private void insertUser(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException { String name = request.getParameter("name"); String email = request.getParameter("email"); String country = request.getParameter("country"); User newUser = new User(name, email, country); userDAO.insertUser(newUser); response.sendRedirect("list"); } private void updateUser(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException { int id = Integer.parseInt(request.getParameter("id")); String name = request.getParameter("name"); String email = request.getParameter("email"); String country = request.getParameter("country"); User book = new User(id, name, email, country); userDAO.updateUser(book); response.sendRedirect("list"); } private void deleteUser(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException { int id = Integer.parseInt(request.getParameter("id")); userDAO.deleteUser(id); response.sendRedirect("list"); } }
问题定位:
Servlet映射与路径获取不匹配
你把Servlet映射到@WebServlet("/"),这是Tomcat的默认Servlet,负责处理所有未被其他Servlet匹配的请求。此时request.getServletPath()返回的是空字符串,而非你期望的"/new"、"/edit"等路径——这些实际路径后缀存在于request.getPathInfo()中。所以你的switch分支永远只会走到default,无法触发对应页面跳转,最终导致404。重定向路径缺少上下文路径
代码中response.sendRedirect("list")使用了相对路径,当应用部署在非根上下文(比如http://localhost:8080/myapp)时,会导致重定向路径错误,进一步引发跳转问题。页面链接路径可能不规范
如果页面上的按钮/链接没有带上应用上下文路径(比如直接写<a href="/new">),会导致请求直接指向服务器根目录(http://localhost:8080/new),而非你的应用路径,同样触发404。
解决方案:
方案一:调整Servlet映射与路径获取逻辑
- 修改Servlet映射:将
@WebServlet("/")改为@WebServlet("/user/*"),这样所有以/user开头的请求都会被这个Servlet处理。 - 修改路径获取代码:把
String action = request.getServletPath();改成String action = request.getPathInfo();,此时action会是"/new"、"/edit"等你期望的值。 - 调整重定向路径:将所有
response.sendRedirect("list");改为response.sendRedirect(request.getContextPath() + "/user/list");,确保路径正确。
方案二:保持默认Servlet映射,修正路径获取
如果一定要保留@WebServlet("/"),则修改路径获取逻辑:
String action = request.getPathInfo(); // 处理首页请求(action为空的情况) if (action == null || action.isEmpty()) { action = "/"; }
同时调整重定向路径为response.sendRedirect(request.getContextPath() + "/list");,并确保页面链接带上上下文路径:
<a href="${pageContext.request.contextPath}/new">新增用户</a>
额外检查:
确认user-form.jsp和user-list.jsp位于Web应用的根目录下(而非WEB-INF文件夹内),如果放在WEB-INF里,虽然RequestDispatcher可以forward访问,但直接请求会被拦截,不过当前是forward,所以只要路径正确就没问题。
内容的提问来源于stack exchange,提问作者HeyGilly

