Jersey学习记录(二)--请求映射和页面传值

时间:2022-09-27 13:14:33

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

  1. @PathParam可以从链接中取出相应的值自动赋值给相应变量.

  2. 同时还支持正则表达式:例如:

    @Path(“users/{username: [a-zA-Z][a-zA-Z_0-9]*}”)

  3. 这个正则表达式匹配由大小写字符、横杠和数字组成的字符串,如果正则校验不通过,则返回404(没有找到资源)。

  4. 一个 @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 中使
用操作名并不好。

例如:
Jersey学习记录(二)--请求映射和页面传值

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