加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService CXF学习(入门篇3):对象传递

发布时间:2020-12-17 00:30:46 所属栏目:安全 来源:网络整理
导读:前面几节都是讲一些理论知识,现在又用一个例子来说明一下,这一节我们就CXF框架对象传递进行讲解。 ??? 第一步:创建传输对象Customer @XmlRootElement(name="Customer") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder = {"name","age"}) publ

前面几节都是讲一些理论知识,现在又用一个例子来说明一下,这一节我们就CXF框架对象传递进行讲解。
??? 第一步:创建传输对象Customer

    @XmlRootElement(name="Customer")
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(propOrder = {"name","age"})
    public class Customer {

	private int age;
	private String name;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

    }


@XmlRootElement-指定XML根元素名称(可选)
@XmlAccessorType-控制属性或方法序列化
??? 四种方案:
??? FIELD-对每个非静态,非瞬变属性JAXB工具自动绑定成XML,除非注明XmlTransient
??? NONE-不做任何处理
??? PROPERTY-对具有set/get方法的属性进行绑定,除非注明XmlTransient
??? PUBLIC_MEMBER -对有set/get方法的属性或具有共公访问权限的属性进行绑定,除非注
??? 明XmlTransient
??? @XmlType-映射一个类或一个枚举类型成一个XML Schema类型

?? 第二步:创建WebService接口

   @WebService
   public interface HelloService {

	public void save(Customer c1,Customer c2);
	
	public void test(String args);
	
	public Customer get(int id);
  }

   


每三步:创建WebService接口实现类

   @WebService
   public class HelloServiceImpl implements HelloService {

	public void save(Customer c1,Customer c2) {

		System.out.println(c1.getAge()+"---"+c2.getAge());
		System.out.println(c1.getName()+"---"+c2.getName());
	}

	public void test(String args) {
		System.out.println(args);
		
	}

	public Customer get(int id) {
		Customer cus = new Customer();
		cus.setAge(100);
		cus.setName("Josen");
		return cus;
	}
	
	

    }
   


第四步:创建服务端

   public class SoapServer {

	public static void main(String[] args){
		//两种方法,任选一种发布WebService接口
                //Endpoint.publish("http://localhost:8080/helloService",new 
                 HelloServiceImpl());
		JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
		factory.setAddress("http://localhost:8080/helloService");
		factory.setServiceClass(HelloServiceImpl.class);
                factory.getInInterceptors().add(new LoggingInInterceptor());		
		factory.getOutInterceptors().add(new LoggingOutInterceptor());
		factory.create();
	}
    }
   


第五步:创建客户端

  public class SoapClient {

	public static void main(String[] args){
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setAddress("http://localhost:8080/helloService");
		factory.setServiceClass(HelloService.class);
                factory.setServiceClass(HelloServiceImpl.class);
                factory.getInInterceptors().add(new LoggingInInterceptor());
		HelloService service = (HelloService)factory.create();
		
		Customer c1 = new Customer();
		c1.setAge(1);
		c1.setName("aaa");
		
		Customer c2 = new Customer();
		c2.setAge(2);
		c2.setName("bbb");
		
		service.save(c1,c2);
		service.test("aaaaaaaaaaaaa");
	}
  }
  


最后,测试程序
? 运行服务端程序,在浏览器地址栏输入http://localhost:8080/helloService?wsdl查看接口是否发布成功。成功则运行一下客户端程序,看看对象传输是否成功。

?? 现在我们来分析一下控制打印的日志信息。

引用

信息: Inbound Message
----------------------------
ID: 1
Address: /HelloWorld
Encoding: UTF-8
Content-Type: text/xml; charset=UTF-8
Headers: {content-type=[text/xml; charset=UTF-8],connection=[keep-alive],Host=[localhost:9000],Content-Length=[184],SOAPAction=[""],User-Agent=[Apache CXF 2.2.2],Content-Type=[text/xml; charset=UTF-8],Accept=[*/*],Pragma=[no-cache],Cache-Control=[no-cache]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:say xmlns:ns1="http://client.itdcl.com/"><text> Josen</text></ns1:say></soap:Body></soap:Envelope>
--------------------------------------
2010-1-9 20:41:56 org.apache.cxf.interceptor.LoggingOutInterceptor$LoggingCallback onClose
信息: Outbound Message
---------------------------
ID: 1
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><text xmlns="http://client.itdcl.com/">hi Josen</text></soap:Header><soap:Body><ns1:sayResponse xmlns:ns1="http://client.itdcl.com/"></ns1:sayResponse></soap:Body></soap:Envelope>
--------------------------------------
2010-01-09 20:41:56.578::INFO:? seeing JVM BUG(s) - cancelling interestOps==0



???? 当客户端向服器发送请求时,服务端LoggingInInterceptor拉截客户端发送过来的SOAP消息,如下:

引用

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns1:sayHi xmlns:ns1="http://client.itdcl.com/">
<text>Josen</text>
</ns1:sayHi>
</soap:Body>
</soap:Envelope>


???? 客户端将请求信息封闭在<soap:Body></soap:Body>中,当然也可以将其放到<soap:Header></soap:Header>,只要在@WebParam中的header设置成true,默认为false;
???? 服务器接到请求之后,响应客户端。同样以SOAP形式将信息封装好发回客户端,SOAP信息如下:

引用
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> <text xmlns="http://client.itdcl.com/">hi Josen</text> </soap:Header> <soap:Body> <ns1:sayResponse xmlns:ns1="http://client.itdcl.com/"></ns1:sayResponse> </soap:Body> </soap:Envelope>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读