You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Servlet中doGet方法无法跳转至JSP页面的问题求助

Servlet路径匹配导致404错误的定位与解决

你的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");
    }
}

问题定位:

  1. Servlet映射与路径获取不匹配
    你把Servlet映射到@WebServlet("/"),这是Tomcat的默认Servlet,负责处理所有未被其他Servlet匹配的请求。此时request.getServletPath()返回的是空字符串,而非你期望的"/new"、"/edit"等路径——这些实际路径后缀存在于request.getPathInfo()中。所以你的switch分支永远只会走到default,无法触发对应页面跳转,最终导致404。

  2. 重定向路径缺少上下文路径
    代码中response.sendRedirect("list")使用了相对路径,当应用部署在非根上下文(比如http://localhost:8080/myapp)时,会导致重定向路径错误,进一步引发跳转问题。

  3. 页面链接路径可能不规范
    如果页面上的按钮/链接没有带上应用上下文路径(比如直接写<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:35:34