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

时间:2015-07-09 15:57:51

标签: java rest servlets servlet-3.0

假设我想接受以下网址:

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()似乎返回通配符的值,但如果我想要更多参数,例如http://http://myserver/myapplication/posts/<id>/delete/<force>,该怎么办?

2 个答案:

答案 0 :(得分:7)

在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名称空间,此路径将为空字符串。否则,如果 上下文不是以服务器名称空间的根为根,路径以a开头 /字符但不以/字符结尾。
  • Servlet路径:直接对应于映射的路径部分 激活了这个请求。除了案例外,此路径以“/”字符开头 请求与'/ *'或“”模式匹配,在这种情况下它是一个 空字符串。
  • PathInfo:请求路径中不属于上下文路径或部分的部分 Servlet路径。如果没有额外路径,则为null,或者是带有前导的字符串 “/'.

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

  • getContextPath
  • getServletPath
  • getPathInfo

重要的是要注意,除了URL编码请求之间的差异 URI和路径部分,以下等式始终为真:

requestURI = contextPath + servletPath + pathInfo

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

答案 1 :(得分:1)

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