zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    列表 元组
    前端 3
    前端 2
    python pymysql 表和数据的备份
    python 树 索引
    python 数据库连表查询习题
    python 数据库表查询
    python 数据库usdr 查询
    python set enum 完整性约束
    python 数据库表操作
  • 原文地址:https://www.cnblogs.com/panweishadow/p/3090520.html
Copyright © 2011-2022 走看看