WebService实战
来源:互联网 发布:java大学教程 pdf 编辑:程序博客网 时间:2024/05/17 04:39
wsld中几种数据类型的处理
我们通过wsld来生成的java代码,都会把参数和返回值包装成一个类。
1)wsdl2java命令
2) 参数类中对象作为属性
在返回的参数类中,我们加上一个成员变量address,address为Address类的一个实例。我们看看wsld文件中wsdl:type标签中的表述。
<wsdl:types><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://test.chm.com/" elementFormDefault="unqualified" targetNamespace="http://test.chm.com/" version="1.0"> <xs:element name="parameterName" type="tns:paramType"/> <xs:element name="resultName" type="tns:resultType"/> <xs:complexType name="paramType"> <xs:sequence> <xs:element minOccurs="0" name="name" type="xs:string"/> <xsd:element name="address" type="tns:address"></xsd:element><!-- 关键点--> </xs:sequence> </xs:complexType> <xs:complexType name="resultType"> <xs:sequence> <xs:element minOccurs="0" name="helloResult" type="xs:string"/> </xs:sequence> </xs:complexType> <xsd:complexType name="address"> <xsd:sequence> <xsd:element name="shoolAddress" type="xsd:string"></xsd:element> <xsd:element name="homeAddress" type="xsd:string"></xsd:element> </xsd:sequence> </xsd:complexType></xs:schema></wsdl:types>
再看看参数类
@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "paramType", propOrder = { "name", "address"})public class ParamType { protected String name; @XmlElement(required = true) protected Address address; public String getName() { return name; } public void setName(String value) { this.name = value; } public Address getAddress() { return address; } public void setAddress(Address value) { this.address = value; }}
3) 返回值类中集合作为参数
我们看一下wsld中关键部分
<wsdl:types><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://test.chm.com/" elementFormDefault="unqualified" targetNamespace="http://test.chm.com/" version="1.0"> <xs:element name="parameterName" type="tns:paramType"/> <xs:element name="resultName" type="tns:resultType"/> <xs:complexType name="paramType"> <xs:sequence> <xs:element minOccurs="0" name="name" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="resultType"> <xs:sequence> <xs:element minOccurs="0" name="helloResult" type="xs:string"/> <xsd:element name="addrList" type="tns:addr" minOccurs="0" maxOccurs="unbounded"></xsd:element> </xs:sequence> <!-- 关键点 --> </xs:complexType> <xsd:complexType name="addr"> <xsd:sequence> <xsd:element name="shoolAddress" type="xsd:string"></xsd:element> <xsd:element name="homeAddress" type="xsd:string"></xsd:element> </xsd:sequence> </xsd:complexType></xs:schema> </wsdl:types>
对应生成的返回类
@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "resultType", propOrder = { "helloResult", "addrList"})public class ResultType { protected String helloResult; protected List<Addr> addrList; public String getHelloResult() { return helloResult; } public void setHelloResult(String value) { this.helloResult = value; } public List<Addr> getAddrList() { if (addrList == null) { addrList = new ArrayList<Addr>(); } return this.addrList; }}
4) 参数类中枚举类型的属性
我们看一下wsld中关键代码部分
<wsdl:types><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://test.chm.com/" elementFormDefault="unqualified" targetNamespace="http://test.chm.com/" version="1.0"> <xs:element name="parameterName" type="tns:paramType"/> <xs:element name="resultName" type="tns:resultType"/> <xs:complexType name="paramType"> <xs:sequence> <xs:element minOccurs="0" name="name" type="xs:string"/> <xsd:element name="grade" type="tns:grade"></xsd:element> <!-- 一个枚举类型的成员变量 --> </xs:sequence> </xs:complexType> <xs:complexType name="resultType"> <xs:sequence> <xs:element minOccurs="0" name="helloResult" type="xs:string"/> </xs:sequence> </xs:complexType> <xsd:simpleType name="grade"> <!-- 声明枚举类型 --> <xsd:restriction base="xsd:string"> <xsd:enumeration value="excellent"></xsd:enumeration> <xsd:enumeration value="medium"></xsd:enumeration> <xsd:enumeration value="pass"></xsd:enumeration> </xsd:restriction> </xsd:simpleType></xs:schema></wsdl:types>
5) 返回值为空
wsld中空类型的表示
<xsd:complexType> <xsd:sequence/></xsd:complexType>
6)文件上传
在wsld中如何表示一个文件的上传?用字节数组,然后就是IO的操作了
<xs:complexType name="paramType"> <xs:sequence> <xs:element minOccurs="0" name="name" type="xs:string"/> <xsd:element name="file" type="xsd:base64Binary"></xsd:element> <!-- 关键点 --> </xs:sequence> </xs:complexType>
对应生成的java代码
@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "paramType", propOrder = { "name", "file"})public class ParamType { protected String name; @XmlElement(required = true) protected byte[] file; public String getName() { return name; } public void setName(String value) { this.name = value; } public byte[] getFile() { return file; } public void setFile(byte[] value) { this.file = value; }}
对于小文件这样传输是没问题,但是对于大的文件(几兆以上吧)就可能报内存溢出的错误了,那么我们需要使用另一种方法,Using MTOM(SOAP Message Transmission Optimization Mechanism ),可到连接这个地址查看
<xs:complexType name="paramType"> <xs:sequence> <xs:element minOccurs="0" name="name" type="xs:string"/> <xsd:element name="file" type="xsd:base64Binary" xmime:expectedContentTypes="application/octet-stream"/> <!-- --> </xs:sequence></xs:complexType>
@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "paramType", propOrder = { "name", "file"})public class ParamType { protected String name; @XmlElement(required = true) @XmlMimeType("application/octet-stream") protected DataHandler file; public String getName() { return name; } public void setName(String value) { this.name = value; } public DataHandler getFile() { return file; } public void setFile(DataHandler value) { this.file = value; }}
cxf默认情况下没有开启对MTOM的支持,我们需要同时在客户端和服务端开启对MTOM的支持。
客户端
StudentService ss = new StudentService(wsdlURL, SERVICE_NAME); People port = ss.getStudentPort(); SOAPBinding binding = (SOAPBinding) ((BindingProvider)port).getBinding(); binding.setMTOMEnabled(true); System.out.println("Invoking sayGood..."); com.chm.test.ParamType parameters = new ParamType(); DataSource dataSource = new FileDataSource(new File("D:/test.xls")); parameters.setFile(new DataHandler(dataSource)); parameters.setName("aa"); port.sayGood(parameters);
服务端
Object implementor = new StudentPortImpl(); String address = "http://localhost:8080/myservice3"; Endpoint ep = Endpoint.publish(address, implementor); SOAPBinding binding = (SOAPBinding)ep.getBinding(); binding.setMTOMEnabled(true);
cxf与spring集成
web.xml
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:jaxws="http://cxf.apache.org/jaxws" <!-- 增加命名空间 --> xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml"/> <!--<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>--> <!--<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>--> <jaxws:endpoint id="myservice" implementor="com.chm.test.MyServiceImpl" address="/myserver"></jaxws:endpoint></beans>
客户端
<jaxws:client id="service" address="http://localhost:8080/myserver" serviceClass="com.chm.test.MyService"></jaxws:client>
0 0
- WebService实战
- WebService实战
- [原创]JBuilder+WebService实战
- 实战Webservice (axis)
- webservice脚本开发实战
- php webservice实战
- AXIS2部署WebService实战
- Cxf WebService实战
- cxf+spring webservice实战
- restful webservice实战
- 实战WebService II: SOAP篇
- webservice视频教程-基于SOA 思想下的WebService实战
- 实战WebService II: SOAP篇(基于php)
- 实战WebService II: SOAP篇(基于php)
- WS(webService) 的简单应用、实战案例
- Eclipse+Axis2+android构建WebService实战总结
- 实战WebService II: SOAP篇(基于php)
- 使用C++.NET调用webservice实战
- 八大排序算法-堆排序
- PCA原理及人脸识别应用
- 泰课在线逃离地球
- 之嵌入式微处理器的结构和类型(2.1)------嵌入式微处理器与接口知识
- java中的同步与异步
- WebService实战
- 【机房收费系统】总结知识点
- dinic 板子
- Java基础查漏补缺:(开篇)为什么要在即将找工作的时候还在看Java基础
- ROS学习--(四)创建ROS Package
- fatal error LNK1169: 找到一个或多个多重定义的符号
- HTML5基础11----HTML5布局的使用,div布局
- PHP文件操作之读写
- linux下tomcat6.0与jdk安装详细步骤 .