顺应SOA潮流,玩玩WebServices

        最近SOA很火,SOA实现服务整合,其中最核心的部分就是WebService,笔者对WebService还停留在菜鸟级,于是从网上下载了axis开发包,尝试了一下WebSerivce的开发和部署。
         一、开发工具:MyEclipse5.0M2+Eclipse3.2.0+JDK1.5.0_12+axis2-1.3-RC2-bin+axis2-1.3-RC2-war
 +proxool-0.9.0RC2+SqlServer2000+Tomcat5.5.20,以上工具的下载地址我就不细说了,如果读者对哪个工具的下载地址不了解,请在这篇文章后给我留言。
          二、开发环境:
         1.将下载的Axis开发包axis2-1.3-RC2-bin.zip解压,将其中的axis2-1.3-RC2 目录拷贝到D:\;添加环境变量AXIS2_HOME=D:\axis2-1.3-RC2;在path变量中添加: D:\axis2-1.3-RC2。 
         2.启动Eclipse(我的Eclipse安装在D:\eclipse3.2,workspace安装在D:\eclipse3.2\workspace),新建一个web项目testwebservice,然后在项目的build path中添加axis2的UserLibrary(D:\axis2-1.3-RC2\*.jar)。
         3.将D:\axis2-1.3-RC2\samples\quickstartaxiom下的目录和文件拷贝到D:\eclipse3.2\workspace\testwebservice;删除D:\eclipse3.2\workspace\testwebservice\resources\META-INF\StockQuoteService.wsdl;将D:\eclipse3.2\workspace\testwebservice\build.xml进行修改:将<property name="AXIS2_HOME" value="../.."/>更改为
 <property name="AXIS2_HOME" value="${env.AXIS2_HOME}"/>
         4.将下载的axis2-1.3-RC2-war.zip解压,将其中的axis2.war拷贝到D:\Tomcat 5.5\webapps\,启动Tomcat后,axis2.war被自动解压为axis2目录;将数据库驱动程序包mssqlserver.jar、msbasejar、msutil.jar以及proxool数据源proxool-0.9.0RC2.jar都拷贝到D:\Tomcat 5.5\webapps\axis2\WEB-INF\lib,并且将上面的jar包添加的项目的build path中。
         三、开发过程:
         1.在SQLServer中新建数据库test,在查询分析器中执行下面的命令:
         USE test;
         
CREATE TABLE stock        
        {
              symbol 
varchar(10);
              price 
varchar(20);
          };
         
INSERT INTO stock values('WSO','100');

         将管理员sa的密码改为lzqdiy。
         2.在D:\eclipse3.2\workspace\testwebservice\src新建文件proxool.xml,内容如下:
 
<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
  
<!-->proxool>
    <alias>oracle</alias>
    <driver-url>jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SID=ldb)(SERVER=DEDICATED)))
    </driver-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <driver-properties>
      <property name="user" value="xdh"/>
      <property name="password" value="manager"/>
    </driver-properties>
    <maximum-connection-count>100</maximum-connection-count>
    <minimum-connection-count>1</minimum-connection-count>
    <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
  </proxool
-->
  
<proxool>
    
<alias>sqlserver</alias>
    
<driver-url>jdbc:microsoft:sqlserver://192.168.1.6:1433;databasename=test
    
</driver-url>
    
<driver-class>com.microsoft.jdbc.sqlserver.SQLServerDriver</driver-class>
    
<driver-properties>
      
<property name="user" value="sa"/>
      
<property name="password" value="lzqdiy"/>
    
</driver-properties>
    
<maximum-connection-count>100</maximum-connection-count>
    
<minimum-connection-count>20</minimum-connection-count>
    
<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
  
</proxool>
</something-else-entirely>

        3. 新建类dbc\DBConnection.java,内容如下:
package dbc;

import java.sql.*;
import org.logicalcobwebs.proxool.ProxoolException;
import org.logicalcobwebs.proxool.configuration.JAXPConfigurator;

public class DBConnection
{
    
public static final String ORACLE = "oracle";

    
public static final String SQLSERVER = "sqlserver";

    
private static boolean initialized = false;

    
public static Connection getConnection() throws SQLException
    {

        
return getConnection(DBConnection.SQLSERVER);
    }

    
public static Connection getConnection(String aliasName)
            
throws SQLException
    {
        Connection connection 
= null;
        
if (!initialized)
        {

            init();
        }

        connection 
= DriverManager.getConnection("proxool." + aliasName);

        
if (connection != null)
        {
            
return connection;
        } 
else
        {
            
throw new NullPointerException(
                    
"Didn't get connection, which probably means that no Driver accepted the URL");
        }

    }

    
private static void init()
    {
        String fileName 
= "D:/eclipse3.2/workspace/testwebservice/src/proxool.xml";
        
try
        {

            JAXPConfigurator.configure(fileName, 
false);
            
// The false means non-validating
            Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
        } 
catch (ClassNotFoundException e)
        {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (ProxoolException e)
        {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
        initialized 
= true;
    }

}

         4.修改D:\eclipse3.2\workspace\testwebservice\src\samples\quickstart\service\axiom\StockQuoteService.java
  1 /*
  2  * Licensed to the Apache Software Foundation (ASF) under one
  3  * or more contributor license agreements. See the NOTICE file
  4  * distributed with this work for additional information
  5  * regarding copyright ownership. The ASF licenses this file
  6  * to you under the Apache License, Version 2.0 (the
  7  * "License"); you may not use this file except in compliance
  8  * with the License. You may obtain a copy of the License at
  9  *
 10  * http://www.apache.org/licenses/LICENSE-2.0
 11  *
 12  * Unless required by applicable law or agreed to in writing,
 13  * software distributed under the License is distributed on an
 14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 15  * KIND, either express or implied. See the License for the
 16  * specific language governing permissions and limitations
 17  * under the License.
 18  */
 19 package samples.quickstart.service.axiom;
 20 
 21 import javax.xml.stream.XMLStreamException;
 22 import javax.xml.namespace.QName;
 23 
 24 import org.apache.axiom.om.OMAbstractFactory;
 25 import org.apache.axiom.om.OMElement;
 26 import org.apache.axiom.om.OMFactory;
 27 import org.apache.axiom.om.OMNamespace;
 28 
 29 import dbc.DBConnection;
 30 
 31 import java.sql.Connection;
 32 import java.sql.ResultSet;
 33 import java.sql.SQLException;
 34 import java.sql.Statement;
 35 public class StockQuoteService {
 36 
 37     private String namespace = "http://quickstart.samples/xsd";
 38     
 39     public  Connection getConnection() throws SQLException
 40     {
 41         return DBConnection.getConnection();
 42     }
 43 
 44     public OMElement getPrice(OMElement element) throws XMLStreamException {
 45         element.build();
 46         element.detach();
 47 
 48         OMElement symbolElement = element.getFirstElement();
 49         String symbol = symbolElement.getText();
 50 
 51         String returnText = "42";
 52         
 53         Connection con=null;
 54         Statement st=null;
 55         ResultSet rs=null;
 56         String price=null;
 57         try
 58         {
 59             con = getConnection();
 60             st=con.createStatement();
 61             rs=st.executeQuery("select price from stock where symbol='"+symbol+"'");
 62             
 63             while(rs.next())
 64             price = rs.getString("price");
 65         } catch (SQLException e)
 66         {
 67             // TODO Auto-generated catch block
 68             e.printStackTrace();
 69         }
 70         finally{
 71             if(rs!=null)
 72             {
 73                 try
 74                 {
 75                     rs.close();
 76                 } catch (SQLException e)
 77                 {
 78                     // TODO Auto-generated catch block
 79                     e.printStackTrace();
 80                 }
 81             }
 82             if(st!=null)
 83             {
 84                 try
 85                 {
 86                     st.close();
 87                 } catch (SQLException e)
 88                 {
 89                     // TODO Auto-generated catch block
 90                     e.printStackTrace();
 91                 }
 92             }
 93             if(con!=null)
 94             {
 95                 try
 96                 {
 97                     con.close();
 98                 } catch (SQLException e)
 99                 {
100                     // TODO Auto-generated catch block
101                     e.printStackTrace();
102                 }
103             }
104         }
105         
106         if(price != null){
107             returnText  = price;
108         }
109         OMFactory fac = OMAbstractFactory.getOMFactory();
110         OMNamespace omNs =
111             fac.createOMNamespace(namespace, "ns");
112         OMElement method = fac.createOMElement("getPriceResponse", omNs);
113         OMElement value = fac.createOMElement("return", omNs);
114         value.addChild(fac.createOMText(value, returnText));
115         method.addChild(value);
116         return method;
117     }
118 
119     public void update(OMElement element) throws XMLStreamException {
120         element.build();
121         element.detach();
122 
123         OMElement symbolElement = element.getFirstChildWithName(new QName(namespace, "symbol"));
124         String symbol = symbolElement.getText();
125 
126         OMElement priceElement = element.getFirstChildWithName(new QName(namespace, "price"));
127         String price = priceElement.getText();
128 
129         Connection con=null;
130         Statement st=null;
131         try
132         {
133             con = getConnection();
134             st=con.createStatement();
135             st.executeUpdate("update stock set price='"+price+"' where symbol='"+symbol+"'");
136             
137         } catch (SQLException e)
138         {
139             // TODO Auto-generated catch block
140             e.printStackTrace();
141         }
142         finally{
143             
144             if(st!=null)
145             {
146                 try
147                 {
148                     st.close();
149                 } catch (SQLException e)
150                 {
151                     // TODO Auto-generated catch block
152                     e.printStackTrace();
153                 }
154             }
155             if(con!=null)
156             {
157                 try
158                 {
159                     con.close();
160                 } catch (SQLException e)
161                 {
162                     // TODO Auto-generated catch block
163                     e.printStackTrace();
164                 }
165             }
166         }
167     }
168 }
169 
我在其中添加了访问数据库的语句和获得数据库连接的方法。运行build.xml中的compile编译这个类,如果成功,在D:\eclipse3.2\workspace\testwebservice\build\classes\samples\quickstart\service\axiom下就会生成StockQuoteService.class,
     5.打开Dos窗口,进入D:\eclipse3.2\workspace\testwebservice\build\classes目录输入下面的命令来生成WSDL文件
java2wsdl -cp . -cn samples.quickstart.service.axiom.StockQuoteService -of StockQuoteService.wsdl
将StockQuoteService.wsdl 拷贝到D:\eclipse3.2\workspace\testwebservice\resources\META-INF\
     6.在WebRoot下新建test.jsp
<%@ page language="java"  
import
="samples.quickstart.clients.*" 
import
="org.apache.axiom.om.*" 
import
="org.apache.axis2.Constants"
import
="org.apache.axis2.addressing.EndpointReference"
import
="org.apache.axis2.client.Options"
import
="org.apache.axis2.client.ServiceClient"
pageEncoding
="GBK"
%>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>
    
<base href="<%=basePath%>">
    
    
<title>My JSP 'test.jsp' starting page</title>
    
    
<meta http-equiv="pragma" content="no-cache">
    
<meta http-equiv="cache-control" content="no-cache">
    
<meta http-equiv="expires" content="0">    
    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    
<meta http-equiv="description" content="This is my page">
    
<!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    
-->

  
</head>
  
  
<body>
    This is my JSP page. 
<br>
    
<%
     EndpointReference targetEPR 
= 
        
new EndpointReference(
                              
"http://localhost:8080/axis2/services/StockQuoteService");
    try {
            
            
            OMElement getPricePayload 
= AXIOMClient.getPricePayload("WSO");
            OMElement updatePayload 
= AXIOMClient.updatePayload("WSO"123.42);
            Options options 
= new Options();
            options.setTo(targetEPR);
            options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

            ServiceClient sender 
= new ServiceClient();
            sender.setOptions(options);

            sender.fireAndForget(updatePayload);
            out.println(
"price updated");
            Thread.sleep(
3000);
            OMElement result 
= sender.sendReceive(getPricePayload);

            
String response1 = result.getFirstElement().getText();
            out.println(
"Current price of WSO: " + response1);
            
        } catch (Exception e) {
            e.printStackTrace();
            out.println(e.getMessage());
        }
    
     
%>
  
</body>
</html>
      7.运行build.xml中的generate.service,如果成功后,会在D:\eclipse3.2\workspace\testwebservice\build下生成StockQuoteService.aar,将它拷贝到D:\Tomcat 5.5\webapps\axis2\WEB-INF\services \
      8.在使用MyEclipse提供的部署功能将testwebservice这个web项目发布到Tomcat上。
      9.重启Tomcat后,打开IE,输入http://localhost:8080/testwebservice/test.jsp,如果你看到下面的信息,表明运行成功!
This is my JSP page.
price updated Current price of WSO: 123.42

本程序的项目结构图如下:


posted on 2007-08-26 11:13 我为J狂 阅读(1494) 评论(0)  编辑  收藏 所属分类: WebService


只有注册用户登录后才能发表评论。


网站导航:
 
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(11)

随笔分类(48)

文章分类(29)

常去逛逛

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜