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

如何向Servlet传递动作?/category/*路径匹配问题求助

Servlet路径配置为"/category/*"时动作无法生效的解决方法

问题描述

之前将Servlet的urlPattern设为"/"时代码可正常运行,但因项目需新增更多逻辑,不能再使用该配置。改为"/category/*"后,无法正确识别传递的动作(如/newCategory、/showCategory等),需调整代码让这些动作正常生效。

原代码

@WebServlet(name = "category", urlPatterns = {"/category/*"})
public class CategoryController extends HttpServlet {
    private CategoryDAO categoryaDao;

    public void init() {
        CategoryaDao = new CategoryDAO();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getServletPath();

        try {
            switch (action) {
                case "/category/newCategory":
                    showNewFormCategoria(request, response);
                    break;
                case "/category/showCategory":
                    listCategory(request, response);
                    break;
                case "/category/deleteCategory":
                    deleteCategory(request, response);
                    break;
            }
        } catch (SQLException ex) {
            throw new ServletException(ex);
        }
    }
}

问题原因

当urlPattern设为"/category/*"时,request.getServletPath()返回的是**"/category"**,而非完整的请求路径(比如"/category/newCategory"),导致switch里的case完全匹配不上,自然触发不了对应动作。另外代码里还有变量名大小写不一致的错误(categoryaDao和CategoryaDao),会导致编译失败。

解决方法

  1. 改用request.getPathInfo()获取Servlet路径后的部分(比如请求"/category/newCategory"时,getPathInfo()返回"/newCategory")
  2. 调整switch的case值,去掉前缀"/category",只保留动作部分
  3. 修正变量名大小写不一致的问题

修改后的代码

@WebServlet(name = "category", urlPatterns = {"/category/*"})
public class CategoryController extends HttpServlet {
    private CategoryDAO categoryDao; // 统一变量名

    public void init() {
        categoryDao = new CategoryDAO(); // 修正大小写
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String pathInfo = request.getPathInfo();

        try {
            switch (pathInfo) {
                case "/newCategory":
                    showNewFormCategoria(request, response);
                    break;
                case "/showCategory":
                    listCategory(request, response);
                    break;
                case "/deleteCategory":
                    deleteCategory(request, response);
                    break;
                default:
                    // 处理直接访问/category的情况,默认跳转到列表页
                    listCategory(request, response);
                    break;
            }
        } catch (SQLException ex) {
            throw new ServletException(ex);
        }
    }
}

额外说明

  • 现在请求URL需为/category/newCategory、/category/showCategory这类格式,Servlet会正确匹配对应动作
  • 建议保留default分支,处理未定义的动作或直接访问/category的情况,避免出现404错误
  • 变量名大小写错误必须修正,否则代码无法通过编译

内容的提问来源于stack exchange,提问作者Raúl Peñate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:01:33