带有变量的 Servlet 映射(Tomcat 7.0)

Posted

技术标签:

【中文标题】带有变量的 Servlet 映射(Tomcat 7.0)【英文标题】:Servlet Mappings with Variables(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 最明显的缺失特性 【参考方案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)  ... 


【讨论】:

以上是关于带有变量的 Servlet 映射(Tomcat 7.0)的主要内容,如果未能解决你的问题,请参考以下文章

将特定 servlet 映射为 Tomcat 中的默认 servlet

Java+Tomcat+Servlet实现页面访问

关于Tomcat启动Servlet工程与映射的访问JavaWeb

Tomcat——Mapper(url到Wrapper的映射)

Servlet 映射:带有斜杠的 URL 的 url-pattern

Servlet之Tomcat配置与启动