实现一个简单的webservice。
java中有三种webservice规范,分别为JAX-WS、JAX-RS、JAXM&SAAJ。
同时Java中开发webservice的框架有很多,常见的几种jdk6、Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF等。其中jdk6集成了JAX-WS.
本人第一次发博客,参考Fskjb同志。实验过程中遇到很多中问题,比如如何处理XML返回、复杂数据类型等等。常见错误会发在下一个博客中。
创建并发布服务器端应用
1.新建web service project。
设置如下图。
2.建立一个实现类,代码如下:
1 package cug; 2 import java.io.StringWriter; 3 4 import javax.jws.WebService; 5 import javax.xml.parsers.DocumentBuilder; 6 import javax.xml.parsers.DocumentBuilderFactory; 7 import javax.xml.transform.OutputKeys; 8 import javax.xml.transform.Transformer; 9 import javax.xml.transform.TransformerFactory; 10 import javax.xml.transform.dom.DOMSource; 11 import javax.xml.transform.stream.StreamResult; 12 13 import org.w3c.dom.*; 14 @WebService 15 public class XmlTest { 16 public String sayHaha(String request) 17 { 18 return "Haha, " + request + ", O.K. !"; 19 } 20 public double add(double num1,double num2) 21 { 22 return num1+num2; 23 } 24 public String Test() 25 { 26 return "This is a Test"; 27 } 28 public String CreateDom() 29 { 30 Document doc=null ; 31 Element school=null,student=null; 32 Element name = null; 33 Element num = null; 34 Element classes = null; 35 Element address = null; 36 Element tel = null; 37 try{ 38 DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance(); 39 DocumentBuilder dbBuilder=dbFactory.newDocumentBuilder(); 40 doc=dbBuilder.newDocument(); 41 if(doc!=null) 42 { 43 school = doc.createElement("School"); 44 student = doc.createElement("Student"); 45 student.setAttribute("examId", "23"); 46 name = doc.createElement("Name"); 47 name.appendChild(doc.createTextNode("香香")); 48 student.appendChild(name); 49 num = doc.createElement("Num"); 50 num.appendChild(doc.createTextNode("1006010066")); 51 student.appendChild(num); 52 53 classes = doc.createElement("Classes"); 54 classes.appendChild(doc.createTextNode("眼视光5")); 55 student.appendChild(classes); 56 57 address = doc.createElement("Address"); 58 address.appendChild(doc.createTextNode("浙江温州")); 59 student.appendChild(address); 60 61 tel = doc.createElement("Tel"); 62 tel.appendChild(doc.createTextNode("123890")); 63 student.appendChild(tel); 64 school.appendChild(student); 65 doc.appendChild(school); 66 } 67 } 68 catch (Exception e) { 69 e.printStackTrace(); 70 } 71 72 String result = null; 73 74 if (doc != null) 75 { 76 StringWriter strWtr = new StringWriter(); 77 StreamResult strResult = new StreamResult(strWtr); 78 TransformerFactory tfac = TransformerFactory.newInstance(); 79 try 80 { 81 Transformer t = tfac.newTransformer(); 82 t.setOutputProperty(OutputKeys.ENCODING, "gb2312"); 83 t.setOutputProperty(OutputKeys.INDENT, "yes"); 84 t.setOutputProperty(OutputKeys.METHOD, "xml"); // xml, html,// text 85 t.setOutputProperty( 86 "{http://xml.apache.org/xslt}indent-amount", "4"); 87 t.transform(new DOMSource(doc.getDocumentElement()), 88 strResult); 89 } 90 catch (Exception e) 91 { 92 System.err.println("XML.toString(Document): " + e); 93 } 94 result = strResult.getWriter().toString(); 95 } 96 return result; 97 } 98 }
这里只需要一个实现类,不过为了更加规范,一般还是写成接口+实现类的形式。
3.建立 webservice
选择工程名,点击工具栏的new web service按钮。
然后如下配置:
接着(在JAVA BEAN中输入实现类的名称,选择generate wsdl in project):
点击finish后包中多出一个该实现类的代理类XmlTestDelegate.java
4.导入包
工程-属性-build path-add library-myeclipse libraries导入以下两个包:
如果缺少这两个包,tomcat启动时会出现以下错误:
java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServletContextListener
5.启动tomcat,验证并获取WSDL文件
启动tomcat后在浏览器中输入http://localhost:8080/jaxws_src/XmlTestPort并点击页面中的链接查看WSDL文件,如果该文件能正确显示证明服务器端大功告成。
wsdl文件的uri是http://localhost:8080/jaxws_src/XmlTestPort?wsdl(你可能会问URI中的XmlTestPort从何而来,其实这个名字由图4中的Services port设定)
也可以直接运行为Server Application,自动启动Tomcat。
创建客户端调用:
(不要关闭TOMCAT啊,不然。。。。。)
1.新建java project,建立一包(包名安需求)net.
2.选择包点new web services client(参照本文的第二张图)
ps:有别与xfire,客户端不一定是服务端相同类型的web services client,可以是一个普通的工程也OK!!
3.指定wsdl的URI或wsdl的文件路径(见上)。
4.新建一个测试类:
package cug; public class Client { public static void main(String[] args) { XmlTestService service=new XmlTestService(); XmlTestDelegate d=service.getXmlTestPort(); System.out.println(d.createDom()); } }
输出结果:
OK!大功告成!
感谢Fskjb的博客
参考文献:Fskjb http://www.cnblogs.com/Fskjb/archive/2009/08/17/1548370.html
作者:西芒xiaoP
出处:http://www.cnblogs.com/panweishadow/
若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。