jersey2 + tomcat say hello

jersey2 + tomcat  say hello 

 

直接上代码

 

web.xml

    <servlet>

        <servlet-name>JerseyServlet</servlet-name>

        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

        <!-- 配置自己的资源加载类去加载资源 -->

        <init-param>

            <param-name>javax.ws.rs.Application</param-name>

            <param-value>com.bizfty.file.FileApplication</param-value>

        </init-param>

        <init-param> 

            <param-name>com.sun.jersey.config.property.WadlGeneratorConfig</param-name> 

            <param-value>mil.cnodb.rs.config.CnodbRestWadlGeneratorConfig</param-value> 

        </init-param> 

        <!-- 配置默认的资源包路径,使用默认的配置类去加载资源 -->

        <!-- <init-param> -->

        <!-- <param-name>jersey.config.server.provider.packages</param-name> -->

        <!-- <param-value>com.cisdi.jersey.api</param-value> -->

        <!-- </init-param> -->

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>JerseyServlet</servlet-name>

        <url-pattern>/api/*</url-pattern>

    </servlet-mapping>

 

当然这部分可以使用注解方式 在servlet 3.0之后

 

public class FileApplication extends ResourceConfig {

    public FileApplication() {

        packages("com.bizfty.file.rest");//这个地方是你自己的rest类的存放包

    }

}

 

public class RestWadlGeneratorConfig extends WadlGeneratorConfig {

 

    @Override

    public List<WadlGeneratorDescription> configure() {

 

        return generator(WadlGeneratorApplicationDoc.class)

                .prop("applicationDocsStream", "application-doc.xml")

                .generator(WadlGeneratorGrammarsSupport.class)

                .prop("grammarsStream", "application-grammars.xml")

                .generator(WadlGeneratorResourceDocSupport.class)

                .prop("resourceDocStream", "resourcedoc.xml")

                .descriptions();

 

    }

 

}

-----------------------------------------------------------------------------------------------------------------

以上都是配置文件

 

开始自己的代码

@Path("hello")

public class HelloResource {

 

    @Context

    private UriInfo context;

 

    /**

     * Creates a new instance of HelloResource

     */

    public HelloResource() {

    }

 

    /**

     * Retrieves representation of an instance of com.bizfty.file.rest.HelloResource

     * @param name

     * @return an instance of java.lang.String

     */

    @GET

    @Path("/{name}") 

    @Produces(MediaType.TEXT_PLAIN)

    public String sayHello(@PathParam("name") String name) {

        //TODO return proper representation object

        return "hello "+name;

    }

 

    /**

     * PUT method for updating or creating an instance of HelloResource

     * @param content representation for the resource

     */

    @PUT

    @Consumes(MediaType.APPLICATION_XML)

    public void putXml(String content) {

    }

}

 

----------------------------------------------------------------

访问 wadl

http://localhost:8080/{contextpath}/{url-pattern}/application.wadl

 

访问 hello 的 sayHello 方法

 

http://localhost:8080/{contextpath}/{url-pattern}/hello/mary

(为什么不是sayHello ,呵呵 之前对restful 理解有误。)

返回 response  

  

hello mary

 

 

-------------------------------------------------------------------------------------

/*查询

 * HEAD请求用于获取某个资源的元数据(metadata)–

 * 比如,该资源是否存在,该资源的内容长度是多少等等。

 */

import javax.ws.rs.HEAD;

/*

 * OPTIONS请求用于获取某个资源所支持的Request类型,

 * 在OPTIONS请求的Response中会包含Allow头信息,

 * 比如:

 * Allow: GET HEAD

 * 上述例子表示该资源只支持GET请求与HEAD请求。

 */

import javax.ws.rs.OPTIONS;

/*查询*/

import javax.ws.rs.GET;

/*添加修改  PUT用于创建(Create)或修改(Modify)*/

import javax.ws.rs.PUT;

/*

 *  添加修改 POST请求被定义为创建“从属资源”(拥有父资源的资源)

 * POST用于添加(Add)或增补(Append)

 */

import javax.ws.rs.POST;

/*删除*/

import javax.ws.rs.DELETE;

 ------------------------------------------------------

PUT POST 区别

在HTTP中,PUT被定义为idempotent的方法,POST则不是,这是一个很重要的区别。

 

“Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.”

 

上面的话就是说,如果一个方法重复执行多次,产生的效果是一样的,那就是idempotent的。

 

举一个简单的例子,假如有一个博客系统提供一个Web API,模式是这样http://superblogging/blogs/post/{blog-name},很简单,将{blog-name}替换为我们的blog名字,往这个URI发送一个HTTP PUT或者POST请求,HTTP的body部分就是博文,这是一个很简单的REST API例子。我们应该用PUT方法还是POST方法?取决于这个REST服务的行为是否是idempotent的,假如我们发送两个http://superblogging/blogs/post/Sample请求,服务器端是什么样的行为?如果产生了两个博客帖子,那就说明这个服务不是idempotent的,因为多次使用产生了副作用了嘛;如果后一个请求把第一个请求覆盖掉了,那这个服务就是idempotent的。前一种情况,应该使用POST方法,后一种情况,应该使用PUT方法。

 

也许你会觉得这个两个方法的差别没什么大不了的,用错了也不会有什么问题,但是你的服务一放到internet上,如果不遵从HTTP协议的规范,就可能给自己带来麻烦。比如,没准Google Crawler也会访问你的服务,如果让一个不是indempotent的服务可以用indempotent的方法访问,那么你服务器的状态可能就会被Crawler修改,这是不应该发生的。

 ---------------------------------------------------------------------------------

//获取URI中指定规则的参数

import javax.ws.rs.PathParam;

//当请求参数很多时,比如客户端提交一个修改用户的PUT请求,请求中包含很多项用户信息。这时可以用@BeanParam

import javax.ws.rs.BeanParam;

//POST请求的表单参数中获取数据

import javax.ws.rs.FormParam;

//读取信息存储为一个cookie,并将它绑定到一个方法的参数

import javax.ws.rs.CookieParam;

//HTTP标头( HTTP header)并将它绑定到一个方法的参数

import javax.ws.rs.HeaderParam;

///books/2011;author=mkyong;country=malaysia”

import javax.ws.rs.MatrixParam;

//获取GET请求中的查询参数helloworld/get?featureID=12&userID=123 

import javax.ws.rs.QueryParam;

猜你喜欢

转载自anole1982.iteye.com/blog/2308693