jersey的webservice开发基本上都是使用注解,接下来学习常用注解.
一.根资源类
1.@PATH注解
@Path("/hello")
public class HelloWorldController {
@GET
@Path("{username}")
@Produces(MediaType.TEXT_PLAIN)
public String helloWorld(@PathParam("username") String username){
return "hello world! "+username;
}
}
对应访问链接: http://localhost:8888/hello/niuli
@PathParam
可以从链接中取出相应的值自动赋值给相应变量.-
同时还支持正则表达式:例如:
@Path(“users/{username: [a-zA-Z][a-zA-Z_0-9]*}”)
这个正则表达式匹配由大小写字符、横杠和数字组成的字符串,如果正则校验不通过,则返回404(没有找到资源)。
一个 @Path的内容是否以”/”开头都没有区别,同样是否以”/”结尾也没有什么区别
2.@GET, @PUT, @POST, @DELETE, … (HTTP 方法)
一般下面方法有如下用途:
• GET - 提供资源的只读访问。
• PUT - 用于创建一个新资源。
• DELETE - 用于移除一个资源。
• POST - 用于更新现有资源或者创建一个新资源。
• OPTIONS - 用于获取资源上支持的操作。
下面是设计 URI 时要考虑的要点:
• 使用复数名词 - 使用复数名词定义资源。比如,我们使用 users 标识用户资源。
• 避免使用空格 - 处理长资源名时使用下划线(_)或者连字符(-),比如,用 authorized_users 而不是 a
uthorized%20users。
• 使用小写字母 - 尽管 URI 不区分带小写,但是在 url 中使用小写字母是一种很好的做法。
• 保持向后兼容 - 由于 Web 服务是一种公共服务,URI 一旦公开之后应该始终可用。这种情况下,要更新 U
RI,请使用 HTTP 状态码 - 300 重定向老的 URI 到新的 URI。
• 使用 HTTP Verb - 始终使用 HTTP Verb,比如 GET,PUT 以及 DELETE 处理资源操作。在 URL 中使
用操作名并不好。
例如:
3.@Produces
@Produces是定义返回值给客户端的 MIME 媒体类型。在下面这个例子里面,将会返回一个text/plainMIME 媒体类型的相应。@Produces既可以应用在类的水平上,也可以作用与方法的水平。也就是说定义在类上的这个注解会被其里面方法上的该注解覆盖掉.
另外@Produces({"application/xml", "application/json"})
可以像这样支持多个返回类型,这样匹配是匹配到先检测到的那个,同时还可以利用qs指定匹配品质,自动选择品质高的那个
4. @Consumes
@Consumes注释与@Produces相反,是用来指定表示可由资源消耗的 MIME 媒体类型。,一般用于post和put接收客户端参数,取出使用@FormParam
例如 @Consumes("text/plain")
,该注解明确表示将消耗表示确定的 MIME 媒体类型text/plain
二.@XXParam
1.@PathParam
从URL中匹配给定的参数,上面例子已经用到了
2.@QueryParam
对于get请求参数使用
public Response smooth(
@DefaultValue("2") @QueryParam("step") int step,
@DefaultValue("true") @QueryParam("min-m") boolean hasMin,
@DefaultValue("true") @QueryParam("max-m") boolean hasMax,
@DefaultValue("true") @QueryParam("last-m") boolean hasLast,
@DefaultValue("blue") @QueryParam("min-color") ColorParam minColor,
@DefaultValue("green") @QueryParam("max-color") ColorParam maxColor,
@DefaultValue("red") @QueryParam("last-color") ColorParam lastColor) {
...
}
如果step的参数存在的话,那么附值给它,否则默认是 @DefaultValue定义的值 2。如果step的内容不是 32位 整型,那么会返回404错误。
3.类似注解
@PathParam 和其他参数注解 @MatrixParam, @HeaderParam,@CookieParam, @FormParam 遵循与 @QueryParam一样的规则。 @MatrixParam 从 URL 路径提取信息. @HeaderParam 从 HTTP 头部提取信息。 @CookieParam从关联在 HTTP 头部的 cookies 里提取信息。
4.@FormParam
对于POST请求参数取出使用
表单请求是非常有用的,例如从发布的表单数据中提取名称是 name 的参数信息:
@POST
@Consumes("application/x-www-form-urlencoded")
public void post(@FormParam("name") String name) {
// Store the message
}
5.@BeanParam
允许注入上述参数到一个 bean 。
该方法需要指明Bean里面的参数需要提前指定,也就相当于把参数都封装了一下,例如:
定义bean:
import javax.ws.rs.QueryParam;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
@XmlRootElement(name = "user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@QueryParam("name")
private String name;
@QueryParam("password")
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
构造控制器
@Path("/hello")
public class HelloWorldController {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String helloWorld(@BeanParam User user){
System.out.println(user.toString());
return "hello world! ";
}
}
访问链接:
http://localhost:8888/hello?name=niuli&password=123456
参数值就会自动映射到User中
6.直接获取map
@Context可以可以获取诸如 ServletConfig 、ServletContext 、HttpServletRequest 和 HttpServletResponse这些参数
@GET
public String get(@Context UriInfo ui) {
MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
MultivaluedMap<String, String> pathParams = ui.getPathParameters();
}
或者还可以从头部参数获取
@GET
public String get(@Context HttpHeaders hh) {
MultivaluedMap<String, String> headerParams = hh.getRequestHeaders();
Map<String, Cookie> pathParams = hh.getCookies();
}
最后还可以直接使用该变量
@POST
@Consumes("application/x-www-form-urlencoded")
public void post(MultivaluedMap<String, String> formParams) {
// Store the message
}
7.返回json数据
首先maven中加入
<!--json转换器-->
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.3.3</version>
</dependency>
然后@Produces要设置为json类型,这样就完成了转换,xml配置同样类似
@GET
@Produces(MediaType.APPLICATION_JSON)
public User helloWorld(@BeanParam User user){
System.out.println(user.toString());
return user;
}
接收数据直接formparam即可
开发webservice感觉这些就够用了,其他没有去学习,毕竟用jerseyMVC的还是很少的吧,感觉springMVC更加好用.
参考资料:
https://waylau.gitbooks.io/jersey-2-user-guide/content/
https://jersey.java.net/documentation/latest/
项目示例:
SJM框架整合: https://github.com/nl101531/JavaWEB