带有变量的 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吗?PathVariable
s 是 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
关于Tomcat启动Servlet工程与映射的访问JavaWeb
Tomcat——Mapper(url到Wrapper的映射)