如何向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),会导致编译失败。
解决方法
- 改用
request.getPathInfo()获取Servlet路径后的部分(比如请求"/category/newCategory"时,getPathInfo()返回"/newCategory") - 调整switch的case值,去掉前缀"/category",只保留动作部分
- 修正变量名大小写不一致的问题
修改后的代码
@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
相关产品推荐
相关产品推荐

