Servlet支持以下URL吗:
/xyz/{value}/test
value可以被替换为文本或数字。
如何在web.xml中进行映射?
Servlet支持以下URL吗:
/xyz/{value}/test
value可以被替换为文本或数字。
如何在web.xml中进行映射?
*
,它只允许在映射结尾使用通配符*
,例如/prefix/*
,或者在映射开头使用通配符*.suffix
。/xyz/*
并使用HttpServletRequest#getPathInfo()
提取路径信息。<url-pattern>/xyz/*</url-pattern>
,以下是一个基本示例,演示如何提取路径信息(省略了空值检查和数组索引越界检查):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重写过滤器或者自己开发URL重写过滤器。
就像其他人所说的那样,servlet规范不允许使用这样的模式;但是,如果这符合您的用例,您可以考虑使用JAX-RS,因为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) { ... }
}
/xyz/*
test
是否存在,以及它是否是最后一个项目。如果您正在寻找更复杂的内容,则应该尝试使用urlrewritefilter。
http://code.google.com/p/urlrewritefilter/
Servlet不支持那样的模式,其他人提到的可能的方法是在xyz
后面使用/*
,但这并不检查{value}
或/test
。最好使用Spring或JAX-RS。但是,如果您计划坚持使用Servlet,则更好的编写方式是:
@WebServlet(urlPatterns = {"/xyz/*"})
你不应该在web.xml中这样做,而是可以将每个请求指向你的过滤器(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
}
}
来自2022年的答案。
Servlets仍然不允许通配符,因此我们无法做到以下操作:
/xyz/{value}/test
Paul Tuckeys的urlrewritefilter仍然是4.0.3版本,并且与新的jakarta命名空间[1]不兼容(版本5正在开发中)。
我在Tomcat本身中找到了一个解决方案,它具有其特性RewriteValve。
请参见https://rmannibucau.metawerx.net/post/tomcat-rewrite-url以获取逐步手册。这是一种方便的解决方案,可允许URL中间的通配符。
[1] https://github.com/paultuckey/urlrewritefilter/issues/239