Servlet和path参数/ xyz / {value} / test,如何在web.xml中映射?

servlet是否支持如下的url:

/xyz/{value}/test 

价值可以被文字或数字取代。

如何在web.xml中映射?

Servlet API不支持在映射中间使用URL模式通配符* 。 它只允许映射末尾的通配符* ,比如so /prefix/*或者像映射的开始那样*.suffix

使用标准允许的URL模式语法,最好的办法是将其映射到/xyz/*并使用HttpServletRequest#getPathInfo()提取path信息。

因此,给定一个<url-pattern>/xyz/*</url-pattern> ,下面是一个基本的开球示例,如何提取path信息,空值检查和数组索引超出边界检查省略:

 String pathInfo = request.getPathInfo(); // /{value}/test String[] pathParts = pathInfo.split("/"); String part1 = pathParts[1]; // {value} String part2 = pathParts[2]; // test // ... 

如果您希望使用Apache HTTPD的mod_rewrite更细粒度的控制,那么您可以查看Tuckey的URL重写filter 。

正如其他人所指出的,servlet规范不允许这样的模式; 不过,如果这适合您的使用情况,您可以考虑JAX-RS允许使用这种模式。

 @Path("/xyz/{value}/test") public class User { public String doSomething(@PathParam("value") final String value) { ... } } 

要么:

 @Path("/xyz/{value}") public class User { @Path("test") public String doTest(@PathParam("value") final String value) { ... } } 

(相关: https : //stackoverflow.com/a/8303767/843093 。)

它支持映射该url; 但不提供任何validation。

在你的网站的XML,你可以做到这一点….

 /xyz/* 

但是这并不能保证拖尾test是存在的,而且是最后一项。 如果你正在寻找更复杂的东西,你应该尝试urlrewritefilter。

http://code.google.com/p/urlrewritefilter/

如上所述,基本servlet不支持您在问题中指定的模式。 Spring MVC支持模式。 这是一个链接到春季参考文件中的相关部分。

您不应该在web.xml中这样做,而是可以将每个请求指向您的filter(Patternfilter)并检查URL

 package com.inventwheel.filter; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; /** * Servlet Filter implementation class PatternFilter */ @WebFilter("/*") public class PatternFilter implements Filter { /** * Default constructor. */ public PatternFilter() { // TODO Auto-generated constructor stub } /** * @see Filter#destroy() */ public void destroy() { // TODO Auto-generated method stub } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String servletPath = ((HttpServletRequest)request).getServletPath(); String requestURI = ((HttpServletRequest)request).getRequestURI(); Pattern pattern = Pattern.compile(".*"+servletPath+"/(.*)"); Matcher matcher = pattern.matcher(requestURI); if (matcher.matches()) { String param = matcher.group(1); // do stuff with param here.. } chain.doFilter(request, response); } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { // TODO Auto-generated method stub } } 

你可以使用这个库:http: //zerh.github.io/ServletIO/ ,所以你可以转换你的servlet在MVC控制器,并使用漂亮的URL