REST WebService简单应用
最近项目中WebService采用REST风格的WebService实现。
官方文档地址:
http://jersey.java.net/nonav/documentation/latest/index.html
Jersey的四种行为
对应我们日常说的CRUD.
方法/资源 |
资源集合; URI 如: |
成员资源; URI 如: |
对应的操作 |
POST |
列出资源集合的所有成员。 |
检索标识为 1234 的资源的表示形式。 |
C(创建) |
GET |
使用一个集合更新(替换)另一个集合。 |
更新标记为 1234 的数字资源。 |
R(读取) |
PUT |
在集合中创建数字资源,其ID 是自动分配的。 |
在下面创建一个子资源。 |
U(更新) |
DELETE |
删除整个资源集合。 |
删除标记为 1234 的数字资源。 |
D(删除) |
相关的架包结构
· 核心服务器:jersey-core.jar,jersey-server.jar,jsr311-api.jar,asm.jar
· 核心客户端:(用于测试)jersey-client.jar
· JAXB 支持:(在高级样例中使用)jaxb-impl.jar,jaxb-api.jar,activation.jar,stax-api.jar,wstx-asl.jar
· JSON 支持:(在高级样例中使用)jersey-json.jar
· Spring支持:(在高级样例中使用)jersey-spirng.jar
元注解信息说明
生存周期说明
1. 默认不使用注解,表示生存周期等于request,请求过后自动销毁,默认是线程安全的。
2. application,使用@Singleton注解。生存周期等于整个应用程序的生存周期。
3. session,使用@PerSession注解。生存周期等于一个session请求,session销毁,该rest资源实例也同时销毁。
Bean注解说明
[email protected],路径信息,表示映射出去的访问路径。
范例如下:@Path("/myResource")
2. @Produces,用于限制post和get方法返回的参数类型,支持json、string、xml、html
范例如下:@Produces({"application/xml", "application/json"})
3. @Consumes,用于限制输入的参数的类型,支持json、string、xml、html
范例如下:@Consumes("text/plain")
4. @QueryParam,@DefaultValue,通过request传入的参数,@DefaultValue表示默认参数。
范例如下:@DefaultValue("2") @QueryParam("step") int step,
5. @PathParam ,@ MatrixParam,@ HeaderParam,@ CookieParam和@@ QueryParam FormParam听从以相同的规则。@ MatrixParam提取URL路径段的信息。 @ HeaderParam提取的HTTP头信息。 @ CookieParam提取信息的Cookie饼干宣布相关的HTTP标头。@ FormParam略有特殊,因为它提取请求表示,该类型匹配前面的@Consumes所声明的类型。
范例如下:
@POST
@Consumes("application/x-www-form-urlencoded")
public void post(@FormParam("name") String name) {
6.pojo层面等相关注解,@XmlRootElement,支持JPA注解。
7.Spring相关注解,比如@Autowired(required=true) 、@Qualifier("persionDao")、@Component
@Scope("request")
简单demo的结构如下:
简单的开发代码如下:
package com.easyway.jaxrs.rest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
/**
* 采用JAX-RS方式
* @author longgangbai
* http://localhost:8080/JAXRSWS/services/hello
*
*
* @Path 注解访问的路径
* @GET Http请求的方式
* @Produces 响应结果的形式
*
*/
@Path("/hello")
public class HelloWS {
/**
* 通过HTTP访问到WebService到方式
*
* http://localhost:8080/JAXRSWS/services/hello
*
* 文本格式返回给客户端
* @return
*/
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
return "Hello Jersey";
}
/**
* xml格式返回给客户端
* @return
*/
@GET
@Produces(MediaType.TEXT_XML)
public String sayXMLHello() {
return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
}
/**
* html格式的接受
* @return
*/
@GET
@Produces(MediaType.TEXT_HTML)
public String sayHtmlHello() {
return "<html> " + "<title>" + "Hello Jersey" + "</title>"
+ "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> ";
}
}
Web.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <display-name>JAX-RS REST Servlet</display-name> <servlet-name>JAX-RS REST Servlet</servlet-name> <servlet-class> com.sun.jersey.spi.container.servlet.ServletContainer </servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.easyway.jaxrs.rest</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JAX-RS REST Servlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
index.jsp页面如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<script type="text/javascript" src="jquery/jquery-1.4.2.js"></script>
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
<!--js 调用JAXRS WS 服务返回文本-->
function txtverity() {
$.ajax({
type : "POST",
url : "<%=request.getContextPath()%>/services/hello?tmp="+(new Date()),
dataType : "text",
success : textcallback
});
}
function textcallback(data) {
alert("text="+data);
}
function xmlverity() {
alert("aa");
$.ajax({
type : "POST",
url : "<%=request.getContextPath()%>/services/sayXMLHello?tmp="+(new Date()),
dataType : "html",
success : xmlcallback
});
}
function xmlcallback(data) {
alert("text="+data);
}
</script>
</head>
<body>
<input type="button" id="txtbtn" onclick="txtverity()" value="文本" />
<input type="button" id="jsonbtn" onclick="txtverity()" value="JSON文本"/>
<input type="button" id="xmlbtn" onclick="xmlverity()" value="XML文本"/>
</body>
</html>