WebService入门

  实现一个简单的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启动时会出现以下错误: 

 

严重: Error configuring application listener of class com.sun.xml.ws.transport.http.servlet.WSServletContextListener
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。

 

posted @ 2013-05-21 12:40  西芒xiaoP  阅读(1961)  评论(0编辑  收藏  举报