如何使用@WebServlet 接受参数(以RESTFul 方式)?

How to use @WebServlet to accept arguments (in a RESTFul way)?

假设我想接受以下网址:

http://myserver/myapplication/posts
http://myserver/myapplication/posts/<id>
http://myserver/myapplication/posts/<id>/delete

如何使用 servlet 装饰器 @WebServlet 来做到这一点?我正在调查 valueurlPatterns,但我不知道该怎么做。例如,

@WebServlet(urlPatterns={"/posts", "/posts/*"})
[..]
String param = request.getPathInfo();

给了我一些结果,但是如何使用呢?此外,request.getPathInfo() 似乎是 return 通配符的值,但如果我想要更多参数,如 http://http://myserver/myapplication/posts/<id>/delete/<force>?

我认为您不能仅使用 @WebServlet 注释来做到这一点。 urlPatterns 仅充当 Servlet 的指令,指示应加入哪些 url 模式。 正如您在本文档中看到的那样 https://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebServlet.html 当 urlPatterns 是一个字符串而不是它们的数组时,值就是这种情况。 正如 brso05 所述,您需要从请求中解析您的参数。

在servlet 规范中,您没有路径变量的概念。一些 MVC 框架确实支持它们,例如 Struts 或 Spring MVC。

对于 servlet 的观点,URL 是:

scheme://host.domain/context_path/servlet_path/path_info?parameters

其中任何部分(从上下文路径开始可能为空)

servlet 3.0 状态规范:

  • Context Path:与此ServletContext关联的路径前缀 servlet 的一部分。如果此上下文是植根于 Web 服务器的 URL 名称 space,此路径将为空字符串。否则,如果 context 不以服务器名称 space 的根为根,路径以 a 开头 / 字符但不以 / 字符结尾。
  • Servlet Path:直接对应映射的路径部分 激活了这个请求。此路径以“/”字符开头,除非在大小写 请求与“/*”或“”模式匹配,在这种情况下它是一个 空字符串。
  • PathInfo:请求路径中不属于上下文路径或 小服务程序路径。如果没有额外的路径,它要么是 null,要么是一个带有前导的字符串 ‘/’.

HttpServletRequest接口中存在以下方法来访问这个 信息:

  • getContextPath
  • getServletPath
  • 获取路径信息

需要注意的是,请求之间的编码差异除外URL URI 和路径部分,下面的等式总是成立的:

requestURI = contextPath + servletPath + pathInfo

这意味着你只需要使用@WebServlet(urlPatterns={"/posts"}),然后手动解码pathInfo部分来提取命令和参数