zoukankan      html  css  js  c++  java
  • Jersey the RESTful Web Services in Java

    Jersey 是一个JAX-RS的实现, JAX-RS即Java API for RESTful Web Services, 支持按照表述性状态转移(REST)架构风格创建Web服务. REST 中最重要的概念是资源(resources),使用Global ID (通常使用 URI)标识. 客户端应用程序使用 HTTP 方法 GET/ POST/ PUT/ DELETE 操作资源或资源集. RESTful Web 服务是使用 HTTP 和 REST 原理实现的 Web 服务. 通常, RESTful Web 服务应该定义以下方面:

    Web 服务的基/根 URI,比如 http://host/<appcontext>/resources
    支持 MIME 类型的响应数据,包括 JSON/XML/ATOM 等等
    服务支持的操作集合, 例如 POST, GET, PUT 或 DELET.


    JAX-RS 提供一个部署检测的抽象类Application用于声明根资源和提供对应的类, 在支持Servlet 3.0及以上的容器上, 可以不需要web.xml来部署. 仅需要在某个class上使用@ApplicationPath, 并扩展Application

    @ApplicationPath("/*")
    public class MyApplication extends Application {
        @Override
        public Set<Class<?>> getClasses() {
            Set<Class<?>> s = new HashSet<Class<?>>();
            s.add(HelloWorldResource.class);
            return s;
        }
        ...
    }

    而Jersey提供了自己实现的方式, 可以更便利地使用其高级特性

    @ApplicationPath("resources")
    public class MyApplication extends ResourceConfig {
        public MyApplication() {
            packages("org.foo.rest;org.bar.rest");
        }
    }

    此时要在pom.xml中添加 failOnMissingWebXml 以免构建中出现丢失web.xml的错误

    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
        ...
    </plugins>

    在MyApplication()的初始化方法中,

    packages("com.aa.bb", "com.aa.cc");可以提供多个用于自动扫描的包路径. 这些路径下, 就是标注了 @Path, @Produces, @GET等信息的资源类.

    register()方法用于注册各种组件

    使用Maven创建一个Jersey项目:

    mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.22.1 -DinteractiveMode=false -DgroupId=com.nz -DartifactId=longinus -Dpackage=com.nz

    如果要使用上面的servlet 3.0特性不带web.xml启动, 需要修改下pom.xml

    注意里面的这段话

            <dependency>
                <groupId>org.glassfish.jersey.containers</groupId>
                <artifactId>jersey-container-servlet-core</artifactId>
                <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
                <!-- artifactId>jersey-container-servlet</artifactId -->
            </dependency>

    需要去掉和servlet 2.x的兼容, 然后就能以不带web.xml的形式启动了

            <dependency>
                <groupId>org.glassfish.jersey.containers</groupId>
                <artifactId>jersey-container-servlet</artifactId>
            </dependency>

    最后的pom.xml是这样的

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.rockbb</groupId>
        <artifactId>foobar</artifactId>
        <packaging>war</packaging>
        <version>1.0-SNAPSHOT</version>
        <name>foobar</name>
    
        <properties>
            <jersey.version>2.22.1</jersey.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <build>
            <finalName>foobar</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.3</version>
                    <inherited>true</inherited>
                    <configuration>
                        <source>1.7</source>
                        <target>1.7</target>
                        <encoding>${project.build.sourceEncoding}</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <encoding>${project.build.sourceEncoding}</encoding>
                    </configuration>
                </plugin>
                <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-war-plugin</artifactId>
                                <version>2.3</version>
                                <configuration>
                                    <failOnMissingWebXml>false</failOnMissingWebXml>
                                </configuration>
                            </plugin>
            </plugins>
        </build>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.glassfish.jersey</groupId>
                    <artifactId>jersey-bom</artifactId>
                    <version>${jersey.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <dependency>
                <groupId>org.glassfish.jersey.containers</groupId>
                <artifactId>jersey-container-servlet</artifactId>
            </dependency>
            <!-- uncomment this to get JSON support
            <dependency>
                <groupId>org.glassfish.jersey.media</groupId>
                <artifactId>jersey-media-moxy</artifactId>
            </dependency>
            -->
        </dependencies>
    </project>

    jersey常用注解解释:                                                                               

    Annotation 作用 说明
    @GET 查询请求 相当于数据库的查询数据操作
    @POST 插入请求 相当于数据库的插入数据操作
    @PUT 更新请求 相当于数据库的更新数据操作
    @DELETE 删除请求 相当于数据的删除数据操作
    @Path uri路径 定义资源的访问路径,client通过这个路径访问资源。比如:@Path("user")
    @Produces 指定返回MIME格式 资源按照那种数据格式返回,可取的值有:MediaType.APPLICATION_XXX。比如:@Produces(MediaType.APPLICATION_XML)
    @Consumes 接受指定的MIME格式 只有符合这个参数设置的请求再能访问到这个资源。比如@Consumes("application/x-www-form-urlencoded")
    @PathParam uri路径参数 写在方法的参数中,获得请求路径参数。比如:@PathParam("username")  String userName
    @QueryParam uri路径请求参数 写在方法的参数中,获得请求路径附带的参数。比如:@QueryParam("desc")  String desc
    @DefaultValue 设置@QueryParam参数的默认值 如果@QueryParam没有接收到值,就使用默认值。比如:@DefaultValue("description") @QueryParam("desc") String desc
    @FormParam form传递的参数 接受form传递过来的参数。比如:@FormParam("name")  String userName
    @BeanParam 通过Bena的形式传递参数 接受client传递的bean类型的参数,同时这个bean可以在属性上配置@FormParam用以解决client的属性名称和bean的属性名称不一致的问题。比如:@BeanParam  User user
    @Context 获得一些系统环境信息 通过@Context可以获得以下信息:UriInfo、ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse和HttpHeaders等
    @XmlRootElement 将bean转换为xml

    如果要讲bean以xml或json的格式返回,必须要这个注解。比如:

    @XmlRootElement

    public class User{...}

    @XmlElements
    @XmlElement
  • 相关阅读:
    结对作业——WordCount进阶版
    个人作业2——WordCount
    软工网络16个人作业1
    request内置对象在JSP
    Servlet处理表单
    Web-JSP表单字符验证
    201621123037 《Java程序设计》第14周学习总结
    201621123037 《Java程序设计》第13周学习总结
    转载 写了 35 年代码的老程序员的最大遗憾
    设计OA系统的用户-角色-权限分配
  • 原文地址:https://www.cnblogs.com/milton/p/4559970.html
Copyright © 2011-2022 走看看