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;