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。
如上所述,基本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