WebService:Jax_rs_restfull

1,根据上节末尾说的,将soap1.2的注解去掉后,变成1.1,客户端同样可以发送成功。

再将soap1.2的注解加上,再访问,那么客户端发送的是1.1的请求还是1.2的请求呢?

答案是会发送1.1的请求,因为他并不聪明,在无法明确是1.1还是1.2的时候,它都会发送1.1的请求,因为发送1.1的请求,无论服务端是1.1还是1.2,都可以接收。

如何设置客户端请求时使用的soap协议?

通过SoapBindingConfiguration类搞定。客户端实现细节如下:

public class Client {
	public static void main(String[] args) {
		JaxWsProxyFactoryBean bean = new JaxWsProxyFactoryBean();
		//设置soap协议。通过SoapBindingConfiguration,
		SoapBindingConfiguration soap = new SoapBindingConfiguration();
		//SoapVersion是一个接口,ctrl+t何以查看继承树,得知有两个实现类,Soap11,Soap12
		SoapVersion sv = Soap12.getInstance();
		//给这个绑定设置版本
		soap.setVersion(sv);
		//将绑定配置到请求bean中。
		bean.setBindingConfig(soap);
		bean.setAddress("http://192.168.0.104:8989/hello?wsdl");
		bean.setServiceClass(IHelloWorld.class);
		IHelloWorld world = (IHelloWorld) bean.create();
		String s = world.sayHello();
		System.out.println(s);
	}
}

2,RESTfull

RESTfull是基于jax-rs的webservice,它及支持XML也支持JSON,Jax-rs是JavaEE6引入的一个新技术。

Jax-rs即java api for RESTfull Web Service的缩写,是一个Java编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建web服务。Jax-rs使用了JavaSE5引入的Java标准来简化web服务的客户端和服务端的开发和部署。

 

JAX-RS提供了一些标注将一些资源类,一个POJOJava类封装为WEB资源。标注包括:

(1)如果要将服务方法以restfull方式发布,需要给工程添加jsr311.jar(支持jsr)和jettison-1.3.jar(解析JSON)。

(2)添加了以上两个jar包后,就可以开发服务端了。新建一个包,cn.itcast.rs,在这个包中建立一个HelloWorld.java文件,编写这个java文件。

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;

@Path(value="/two/")//设置访问路径
public class HelloWorld {
	@GET  //以get方式访问这个方法。将sayHello方法发布。
	//设置访问路径,如果这样设置,路径是:http://localhost:8080/two/say/
	@Path(value="/say/")
	public void sayHello() {
		System.out.println("Hello restfull!!!");
	}
	
	public static void main(String[] args) {
		JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean();
		bean.setAddress("http://192.168.0.104:8080");//后面没有斜杠
		bean.setServiceBean(new HelloWorld());
		//开启
		bean.create();
	}
}

(3)发布服务,在浏览器地址栏访问:http://192.168.0.104:8080/two?_wadl&_type=xml

返回204是占位访问的意思。那么如何访问呢?

直接在地址栏输入http://192.168.0.104:8080/two/say即可。

(4)如何在请求中添加参数呢?使用注解!

如下设置:

在方法前的@Path中的路径后面添加一个{name}表示接受name参数,sayHello方法需要一个nm参数,但我们接收的是一个name参数,可以通过在参数前添加@PathParam注解来映射。

再访问http://192.168.0.104:8080/two?_wadl&_type=xml,可以看到如下变化:

带有参数的访问可以通过如下形式访问:http://192.168.0.104:8080/two/say/xzm

表示访问say方法,并传递xzm参数给这个方法。可以看到控制台打印:

(5)使发布的方法返回xml格式的数据,

本例返回一个user对象。

首先在同包中建立一个User.java类。

需要为User类加上注解,表明是xml格式数据,

//通过@XmlRootElement(name="user")可以定义xml文档的根元素是<user>
@XmlRootElement(name="user")
public class User {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

开发服务:

@Path(value="/two/")
@Produces(value={"application/xml"}) // 返回xml格式数据
public class HelloXZM {
	
	@GET
	@Path(value="/get/{name}")
	public User getUser(@PathParam("name") String nm) {
		User user = new User();
		user.setName("xzm"+nm);
		user.setAge(22);
		return user;
	}
	
	public static void main(String[] args) {
		JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean();
		bean.setAddress("http://192.168.0.104:8080");
		bean.setServiceBean(new HelloXZM());
		bean.create();
	}
}

在浏览器访问http://192.168.0.104:8080/two/get/xuzhimin,会将xuzhimin作为参数传递给getUser方法。

看到如下内容:

(6)获取JSON格式数据,获取JSON格式的服务方法必须返回一个Javabean。

修改这个注解即可:

@Produces(value={"application/json"})
示例:
User类就是用刚才定义的User。
服务类的开发:
@Path(value="/json/")
@Produces(value="application/json")
public class HelloJson {
	@GET
	@Path(value="/get/{name}")
	public User getJson(@PathParam("name") String nm) {
		User user = new User();
		user.setAge(23);
		user.setName(nm);
		return user;
	}
	
	public static void main(String[] args) {
		JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean();
		bean.setAddress("http://192.168.0.104:8080");
		bean.setServiceBean(new HelloJson());
		bean.create();
	}
}

在浏览器访问http://192.168.0.104:8080/json/get/xiaoqiang

获取如下json格式页面:


(7)如果不能知道用户需要那种格式,可以定义两种格式,用逗号隔开。

@Produces(value={"application/json","application/xml"})

这样定义以后,如果用户没有指定获取什么格式数据,默认返回第一种格式。指定了则返回指定的格式数据。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值