【问题标题】:Servlet Mappings with Variables(Tomcat 7.0)带有变量的 Servlet 映射(Tomcat 7.0)
【发布时间】:2012-01-05 08:24:22
【问题描述】:

是否可以将 URL 映射到 servlet(可能是 Tomcat 特有的),以便以下两个 URL(其中 {id} 是可从代码中检索的变量),

/users/{id}/a

/users/{id}/b

映射到两个不同的 servlet,还是我必须为映射到 /users/* 的 servlet 实现某种我自己的过滤器?

更清楚地说,任何带有/users/*/a 模式的 URL 都应该映射到同一个 servlet。 /users/*/b 也是如此。

【问题讨论】:

  • 您想将两个不同的 id 映射到两个不同的 servlet..?
  • 更清楚地说,任何带有 /users/*/a 模式的 URL 都应该映射到同一个 servlet。 /users/*/b 也是如此。
  • 你能发布确切的网址而不是输入ID吗?
  • PathVariables 是 Servlet 3.0 API 最明显的缺失特性

标签: java tomcat servlets servlet-filters


【解决方案1】:

我认为这是不可能的。使用UrlRewriteFilter 或Spring-MVC 等能够映射更复杂URL 的框架

【讨论】:

    【解决方案2】:

    您可以将其映射到/users/* 并从HttpServletRequest#getPathInfo() 中提取信息:

    @WebServlet("/users/*")
    public class UsersController extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String[] pathInfo = request.getPathInfo().split("/");
            String id = pathInfo[1]; // {id}
            String command = pathInfo[2]; // a or b
            // ...
        }
    
    }
    

    (省略对数组大小的明显验证)

    【讨论】:

      【解决方案3】:

      这看起来可能是JAX-RS 的好候选。我不确定您的 servlet 当前执行什么业务逻辑,但此选项解决了您的 servlet 映射问题并且可能是合适的。

      @Path("/users/{id}")
      public class User { 
      
          @Path("a")
          public String doA(@PathParam("id") final int id) { ... }
      
          @Path("b")
          public String doB(@PathParam("id") final int id) { ... }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2018-11-24
        • 1970-01-01
        • 2012-01-16
        • 2013-10-11
        • 2016-10-28
        • 2010-11-08
        • 1970-01-01
        • 2011-10-05
        • 2017-02-01
        相关资源
        最近更新 更多