RESTful 两个注解@PathParam 和 @QueryParam 以及@PathVariable
@PathVariable 映射 URL 绑定的占位符
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
@PathVariable("xxx") 绑定到操作方法的入参中。
一般与@RequestMapping(method = RequestMethod.GET)一起使用
@RequestMapping("/getUserById/{name}")
public User getUser(@PathVariable("name") String name){
return userService.selectUser(name);
}
若方法参数名称和需要绑定的uri中变量名称一致时,可以简写:
@RequestMapping("/getUser/{name}")
public User getUser(@PathVariable String name){
return userService.selectUser(name);
}
---------------------------------------------------
关于@PathParam 和 @QueryParam,两个注解都是取路径的,但是方式不同。这里我之前也遇到问题了。主要是看你怎么传入的路径。
@QueryParam 主要通过键值对这样取 如 a=1 QueryParam("a")
@PathParam 主要通过路径映射取(后面解释)
1 关于@QueryParam用法,我们直接取参数传入的名字。
如 localhost:8080/introduction?booId=1?gg=2?version=3?platform=4?vps=5
.此时我们就用QueryParam 通过@QueryParam("bookId") Integer bookId 实际代码如下
@GET
@Path("/introduction")
Response introduction(
@QueryParam("bookId") Integer bookId,
@QueryParam("gg") Integer gg,
@QueryParam("version") String version,
@QueryParam("platform") String platform,
@QueryParam("vps") String vps
);
后台就获得booId=1 gg=2 version=3 platform=4 vps=5
2 如果使用PathParam ,传参就应该为
localhost:8080/introduction/1/2/3/4/5 对应下面的 /{bookId}/{gg}/{version}/{plarform}/{vps}
@Path("/introduction/{bookId}/{gg}/{version}/{plarform}/{vps}")
也就是让booId=1 gg=2 version=3 platform=4 vps=5 然后通过
@PathParam ("bookId") Integer bookId 把bookId的值取出来
@GET
@Path("/introduction/{bookId}/{gg}/{version}/{plarform}/{vps}")
Response introduction(
@PathParam ("bookId") Integer bookId,
@PathParam ("gg") Integer gg,
@PathParam ("version") String version,
@PathParam ("platform") String platform,
@PathParam ("vps") String vps
);
后台同样获得booId=1 gg=2 version=3 platform=4 vps=5
最后附上简单常用的注解,和一个讲restful 框架的一个帖子
@PathParam注解
该注解定义路径的参数信息,用于指定的URI路径参数,@PathParam 用在接收请求的方法的参数上。
@GET
@Path("/user/{username}")
public String getUser(@PathParam("username") String userName) {
return "hello," + userName;
}
@PathParam注解提供更精确的匹配方式,如要求变量只能由字母和数字构成,则可以使用表达式覆盖默认的表达式[^/]+?
如@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]*}")
---------------------------------------------------------------------------
什么是资源(Resource)
所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的标识符。
应用,资源和子资源
一个完整的资源访问路径(URI)由以下部分构成
<协议>://<主机地址>:<端口>/应用域/<资源路径>/<子资源路径>
如系统应用中获取用户详细信息的URI可表示为
http://192.169.1.10:8080/system/user/1000001
协议:常用的协议有http、https、ws
主机地址:IP地址或域名
端口:服务端口
应用域:应用中根据业务属性划定的访问范围,如/system代表系统业务域,/product代表产品业务域
资源路径:包含所有子资源的路径
子资源路径:具体的资源访问地址
Jersey中应用域在服务器的启动类中,通过ServletContextHandler提供的setContextPath方法指定。
ServletContextHandler apiContext = new ServletContextHandler(
ServletContextHandler.SESSIONS);
apiContext.addServlet(sh, "/*");
//指定应用域
apiContext.setContextPath("/system");
@Path注解
@Path注解的源码如下,可以看到该注解可以标记在类上,也可以标记在方法上,接收一个value参数,标识资源的地址。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Path {
String value();
}
@Path使用举例
@Path("")
@WebService
public class WelcomeRes {
@Path("")
@GET
public String sayHello(@Context HttpServletRequest request) {
return "hello, jetty!";
}
}
根资源类(Root Resource Classes)
在JAX-RS标准中,根资源类是带有@PATH 注解的类,且包含至少一个@Path 注解的方法或者方法带有 @GET、@PUT、@POST、 @DELETE 资源方法指示器的 POJO。
资源方法(Resource Method)
资源方法是带有资源方法指示器(resource method designator)注解的方法,在Jersey中,资源方法指示器即@GET、@HEAD、@PUT、@POST、 @DELETE。
关于@Path注解的理解
@Path("")相当于@Path("/"),即使注解的value中不显示指定"/",框架会自动加上。
如以下示例中路径注解加"/"和不加,最后的访问地址都为/user
@Path的内容是否以”/”开头都没有区别
是否以”/”结尾也没有什么区别