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

Bla*_*gle 31 web.xml servlets get path-parameter

servlet是否支持URL如下:

/xyz/{value}/test
Run Code Online (Sandbox Code Playgroud)

其中的价值可以用文字或数字代替.

如何在web.xml中映射?

Bal*_*usC 49

Servlet API不支持*在映射中间使用URL模式通配符.它只允许*映射结束时的通配符,/prefix/*或者像映射的开头一样*.suffix.

使用标准允许的URL模式语法,最好的办法是将其映射/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
// ...
Run Code Online (Sandbox Code Playgroud)

如果你想要像Apache HTTPD那样更精细的控制mod_rewrite,那么你可以看看Tuckey的URL重写过滤器.

  • 这真的是*方式*需要提取不是GET参数的url参数吗?这看起来很臃肿,难以维护,容易出现偏移错误和 1995 年的总体情况。 (2认同)
  • @Herbert:只需在Servlet API之上使用一个支持路径参数的框架,例如JAX-RS或MVC. (2认同)

she*_*ley 8

正如其他人所指出的那样,servlet规范不允许这样的模式; 但是,如果这适合您的用例,您可以考虑允许这种模式的JAX-RS.

@Path("/xyz/{value}/test")
public class User { 

    public String doSomething(@PathParam("value") final String value) { ... }

}
Run Code Online (Sandbox Code Playgroud)

要么:

@Path("/xyz/{value}")
public class User { 

    @Path("test")
    public String doTest(@PathParam("value") final String value) { ... }

}
Run Code Online (Sandbox Code Playgroud)

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