java Restful框架(二):jersey请求映射和页面传值

jersey的webservice开发基本上都是使用注解,接下来学习常用注解.

一.根资源类

[email protected]注解

@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]*}”)

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

  • 一个 @Path的内容是否以”/”开头都没有区别,同样是否以”/”结尾也没有什么区别

  • [email protected], @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 中使
    用操作名并不好。

    例如:
    java Restful框架(二):jersey请求映射和页面传值

    [email protected]

    @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

    [email protected]

    [email protected]

    从URL中匹配给定的参数,上面例子已经用到了

    [email protected]

    对于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 里提取信息。

      [email protected]

      对于POST请求参数取出使用
      表单请求是非常有用的,例如从发布的表单数据中提取名称是 name 的参数信息:

      @POST
      @Consumes("application/x-www-form-urlencoded")
      public void post(@FormParam("name") String name) {
          // Store the message
      }

        [email protected]

        允许注入上述参数到一个 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

                      原文链接:https://blog.****.net/u012706811/article/details/52054156
                      并在此感谢作者!