将webservice嵌套到以完成的web项目中
一、先把webservice服务端写入项目(基于spring)
1、在pom.xml中引入webservice相关的jar依赖
1 <!--webservice开始 --> 2 <!--https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws --> 3 <dependency> 4 <groupid>org.apache.cxf</groupid> 5 <artifactid>cxf-rt-frontend-jaxws</artifactid> 6 <version>3.1.16</version> 7 </dependency> 8 <!--https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-transports-http --> 9 <dependency> 10 <groupid>org.apache.cxf</groupid> 11 <artifactid>cxf-rt-transports-http</artifactid> 12 <version>3.1.6</version> 13 </dependency> 14 <!--webservice结束 -->
2、在web.xml加载启动webservice
1 <!--webservice --> 2 3 <servlet> 4 5 <servlet-name>cxf</servlet-name> 6 7 <servlet-class>org.apache.cxf.transport.servlet.cxfservlet</servlet-class> 8 9 <load-on-startup>1</load-on-startup> 10 11 </servlet> 12 13 <servlet-mapping> 14 15 <servlet-name>cxf</servlet-name> 16 17 <url-pattern>/getkpivalue/*</url-pattern> 18 19 </servlet-mapping>
3、创建webservice相关的spring配置文件:applicationcontext-webservice.xml,内容如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 5 xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" 6 7 xsi:schemalocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd 8 9 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> 10 11 <bean id="userserviceimpls" class="com.unis.webservice.userserviceimpls" /> 12 13 <jaxws:endpoint id="userserviceimplservices" address="/" implementor="#userserviceimpls"> 14 15 </jaxws:endpoint> 16 17 </beans>
4、把服务端代码迁移到项目的src/main/java/com.webservice,如下图:
5、启动项目,并在浏览器中访问地址:http://localhost:8091/getkpivalue?wsdl,如下图:
|
出现以上情况说明webservice服务端成功启动!
代码可参考 https://blog.csdn.net/c99463904/article/details/76018436
备注:使用注解修改wsdl内容
webservice的注解都位于javax.jws包下: @webservice-定义服务,在类上边 targetnamespace:指定命名空间 name:porttype的名称 portname:port的名称 servicename:服务名称 endpointinterface:sei接口地址,如果一个服务类实现了多个接口,只需要发布一个接口的方法,可通过此注解指定要发布服务的接口。 @webmethod-定义方法,在公开方法上边 operationname:方法名 exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法,默认是false @webresult-定义返回值,在方法返回值前边 name:返回结果值的名称 @webparam-定义参数,在方法参数前边 name:指定参数的名称 |
二、使用xml在webservice的客户端与服务端进行传递
1.xml与java对象互转的工具类
1 package com.unis.webservice.util; 2 import java.io.filenotfoundexception; 3 import java.io.filereader; 4 import java.io.filewriter; 5 import java.io.ioexception; 6 import java.io.stringreader; 7 import java.io.stringwriter; 8 9 import javax.xml.bind.jaxbcontext; 10 import javax.xml.bind.jaxbexception; 11 import javax.xml.bind.marshaller; 12 import javax.xml.bind.unmarshaller; 13 14 /** 15 * xml与java对象互转 16 * name: 17 * title:xmlhelper 18 * @author lsk 19 * @date 2019年1月5日 20 */ 21 public class xmlhelper 22 { 23 //有两种情况,一种是xml字符串,一种是xml文件路径 24 25 /** 26 * 将对象直接转换成string类型的 xml输出 27 * 28 * @param obj 29 * @return 30 */ 31 @suppresswarnings("rawtypes") 32 public static string objecttoxml(class clazz,object obj) { 33 // 创建输出流 34 stringwriter sw = new stringwriter(); 35 try { 36 // 利用jdk中自带的转换类实现 37 jaxbcontext context = jaxbcontext.newinstance(clazz); 38 39 marshaller marshaller = context.createmarshaller(); 40 // 格式化xml输出的格式 41 marshaller.setproperty(marshaller.jaxb_formatted_output, 42 boolean.true); 43 marshaller.setproperty("jaxb.encoding", "gb2312"); 44 45 // 将对象转换成输出流形式的xml 46 marshaller.marshal(obj, sw); 47 } catch (exception e) { 48 e.printstacktrace(); 49 } 50 51 //去除xml声明中的standalone 52 return sw.tostring().replace("standalone=\"yes\"", ""); 53 54 } 55 56 /** 57 * 将string类型的xml转换成对象 58 */ 59 @suppresswarnings("rawtypes") 60 public static object xmltoobject(class clazz, string xml) { 61 object xmlobject = null; 62 try { 63 jaxbcontext context = jaxbcontext.newinstance(clazz); 64 // 进行将xml转成对象的核心接口 65 unmarshaller unmarshaller = context.createunmarshaller(); 66 xmlobject = unmarshaller.unmarshal(new stringreader(xml)); 67 } catch (jaxbexception e) { 68 e.printstacktrace(); 69 } 70 return xmlobject; 71 } 72 73 74 /** 75 * 将对象根据路径转换成xml文件 76 * 77 * @param obj 78 * @param path 79 * @return 80 */ 81 public static void converttoxml(object obj, string path) { 82 try { 83 // 利用jdk中自带的转换类实现 84 jaxbcontext context = jaxbcontext.newinstance(obj.getclass()); 85 86 marshaller marshaller = context.createmarshaller(); 87 // 格式化xml输出的格式 88 marshaller.setproperty(marshaller.jaxb_formatted_output, 89 boolean.true); 90 // 将对象转换成输出流形式的xml 91 // 创建输出流 92 filewriter fw = null; 93 try { 94 fw = new filewriter(path); 95 } catch (ioexception e) { 96 e.printstacktrace(); 97 } 98 marshaller.marshal(obj, fw); 99 } catch (jaxbexception e) { 100 e.printstacktrace(); 101 } 102 } 103 104 /** 105 * 将xml的文件路径转换成对象 106 */ 107 @suppresswarnings("rawtypes") 108 public static object convertxmlfiletoobject(class clazz, string xmlpath) { 109 object xmlobject = null; 110 try { 111 jaxbcontext context = jaxbcontext.newinstance(clazz); 112 unmarshaller unmarshaller = context.createunmarshaller(); 113 filereader fr = null; 114 try { 115 fr = new filereader(xmlpath); 116 } catch (filenotfoundexception e) { 117 e.printstacktrace(); 118 } 119 xmlobject = unmarshaller.unmarshal(fr); 120 } catch (jaxbexception e) { 121 e.printstacktrace(); 122 } 123 return xmlobject; 124 } 125 }
2.jaxb的简介与常用注解详解
jaxb(java architecture for xml binding)是一项可以根据xml schema产生java类的技术
jaxbcontext类,是应用的入口,用于管理xml/java绑定信息。
marshaller接口,将java对象序列化为xml数据。
unmarshaller接口,将xml数据反序列化为java对象。
以上这几个是jdk中jaxb相关重要的class和interface
jdk中jaxb相关的重要annotation(注释):
@xmltype,将java类或枚举类型映射到xml模式类型
@xmlaccessortype(xmlaccesstype.field) ,控制字段或属性是否被默认序列化。field表示jaxb将自动绑定java类中的每个非静态的(static)、非瞬态的(由@xmltransient标注)字段到xml。其他值有 xmlaccesstype.property和xmlaccesstype.none。
@xmlaccessororder,控制jaxb绑定类中属性和字段的排序。
@xmljavatypeadapter,包、类、字段,方法、参数级别的注解。解决java日期(date),数字(number)格式化问题。
|
自定义的dateadapter:
1 public class dateadapter extends xmladapter<string, date> { 2 private static final simpledateformat sdf = new simpledateformat("yyyy-mm-dd"); 3 @override 4 public date unmarshal(string date) throws exception{ 5 return sdf.parse(date); 6 } 7 @override 8 public string marshal(date date) throws exception { 9 return sdf.format(date); 10 } 11 }
|
@xmlelementwrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的xml元素(称为包装器)。
|
@xmlrootelement,类级别的注解,将类映射为xml全局元素,也就是根元素。
@xmlelement,字段,方法,参数级别的注解。将java类的一个属性映射到与属性同名的一个xml元素。
属性:
nillable属性可以指定元素的文本值是否可以为空,默认为false
required属性可以指定该元素是否必须出现,默认为false
namespace属性可以指定该元素所属的命名空间
defaultvalue属性可以指定该元素默认的文本值
@xmlattribute,字段和方法级别的注解。将java类的一个属性映射到与属性同名的一个xml属性。
|
只用到以上注解,想了解其他详细的可看: https://blog.csdn.net/lhzjj/article/details/11796713
上一篇: Spring学习之旅(四)Spring工作原理再探
下一篇: 前几天女生们见到我总喊“婊子”