學習WEB SERVICE一例 (2006-7-12)
學習WEB SERVICE一例? (2006-7-12)一.環(huán)境
?? 本例環(huán)境:winxp home,oracle 9i,axis1.3,tomcat4.1,開發(fā)環(huán)境eclipse3.01.
?? 順便說一下如何發(fā)布axis:將下載的axis-bin-1.3包中的axis目錄(里面有WEB-INF目錄)COPY到%tomcat4.1%\webapps\下即可.
二.示例說明
?? 1.目的:???? 驗證一下WEB SERVICE中,如何返回JavaBean.
?? 2.服務說明: 查詢人員信息,每個人員有這樣幾個字段:id,name(姓名),age(年齡),birthday(生日),salary(工資),phones(多個電話,以數組實現).
?? 3.服務名稱: getPersonList(),返回一個Person的數組. (該方法是類DBQueryService中的一個方法)
?? 4.JAVA類:?? DBQueryService(設計本例最初是從數據庫表中取數據,故以DB開頭),提供WEB SERVICE服務的類
?????????????? Person:JavaBean.包含返回的數據.
? ?
三.示例開發(fā)過程
?? 1.編寫Person JavaBean源代碼如下:
??? package demo1;
??? import java.util.*;
??? public class Person {
?? ?private int????? id;
?? ?private String?? name;
?? ?private int????? age;
?? ?private Date???? date;
?? ?private double?? salary;
?? ?private String[] phones;
?? ?
?? ?public Person(){}
?? ?
?? ?///setter method
?? ?public void setId(int id){
?? ??? ?this.id=id;
?? ?}
?? ?
?? ?public void setName(String name){
?? ??? ?this.name=name;
?? ?}
?? ?
?? ?public void setAge(int age){
?? ??? ?this.age=age;
?? ?}
?? ?
?? ?public void setDate(Date date){
?? ??? ?this.date=date;
?? ?}
?? ?
?? ?public void setSalary(double salary){
?? ??? ?this.salary=salary;
?? ?}
?? ?
?? ?public void setPhones(String[] phones){
?? ??? ?this.phones=phones;
?? ?}
?? ?
?? ?////getter method
?? ?public int getId(){
?? ??? ?return id;
?? ?}
?? ?
?? ?public String getName(){
?? ??? ?return name;
?? ?}
?? ?
?? ?public int getAge(){
?? ??? ?return age;
?? ?}
?? ?
?? ?public Date getDate(){
?? ??? ?return date;
?? ?}
?? ?
?? ?public double getSalary(){
?? ??? ?return salary;
?? ?}
?? ?
?? ?public String[] getPhones(){
?? ??? ?return phones;
?? ?}
??? }
?? ?
?? 2.編寫DBQueryService,源代碼如下:
?? ?package demo1;
?? ?import java.sql.*;
??????? import java.util.Date;
??????? public class DBQueryService {
?? ?
?? ???? public Person[] getPersonList(){
?? ??? ?Person[] persons=null;
?? ??? ?
?? ??? ?try{
?? ??? ??? ?String driverName = "oracle.jdbc.driver.OracleDriver";
?? ??? ??? ?String url??????? = "jdbc:oracle:thin:@127.0.0.1:1521:oradb";
?? ??? ??? ?
?? ??? ??? ?Class.forName(driverName);
?? ??? ??? ?Connection conn??? = DriverManager.getConnection(url,"wlz","wlz");
?? ??? ??? ?Statement? stmt1?? = conn.createStatement();
?? ??? ??? ?ResultSet? rscount = stmt1.executeQuery("select count(id) from ws_demo");
?? ??? ??? ?
?? ??? ??? ?//取得行數,以動態(tài)建立數組
?? ??? ??? ?rscount.next();
?? ??? ??? ?int rowNums=rscount.getInt(1);
?? ??? ??? ?if(rowNums>0){
?? ??? ??? ??? ?persons=new Person[rowNums];
?? ??? ??? ?}else{
?? ??? ??? ??? ?return persons; //返回空值
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ??? ??? ??? ?
?? ??? ??? ?//取出結果集
?? ??? ??? ?Statement stmt2=conn.createStatement();
?? ??? ??? ?ResultSet rs=stmt2.executeQuery("select * from ws_demo order by id");
?? ??? ??? ?for(int i=0;i<rowNums;i++){
?? ??? ??? ??? ?if(rs.next()){
?? ??? ??? ??? ??? ?Person person=new Person();
?? ??? ??? ??? ??? ?person.setId(rs.getInt("id"));
?? ??? ??? ??? ??? ?person.setName(rs.getString("name"));
?? ??? ??? ??? ??? ?person.setAge(rs.getInt("age"));
?? ??? ??? ??? ??? ?person.setDate(rs.getDate("birthday"));
?? ??? ??? ??? ??? ?person.setSalary(rs.getDouble("salary"));
?? ??? ??? ??? ??? ?String[] phones=new String[]{rs.getString("phone"),rs.getString("mobile")};
?? ??? ??? ??? ??? ?person.setPhones(phones);
?? ??? ??? ??? ??? ?persons[i]=person;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ??? ?stmt1.close();
?? ??? ??? ?stmt2.close();
?? ??? ??? ?rscount.close();
?? ??? ??? ?rs.close();
?? ??? ??? ?conn.close();? //正常來說,conn.close()應放在finally里面
?? ??? ?}catch(Exception e){
?? ??? ??? ?System.out.println("---------------------------------");
?? ??? ??? ?System.out.println(e.getMessage());
?? ??? ??? ?e.printStackTrace();
?? ??? ??? ?System.out.println("---------------------------------");
?? ??? ?}
?? ??? ?
?? ??? ??? ?
?? ??? ?/*
?? ??? ?//如果不想用數據庫,使用下面代碼,將上面try{}catch{}間的代碼注釋掉,從學習的效果來說,是一樣的。
?? ??? ?persons=new Person[2];? //暫且用兩個練練手
?? ??? ?
?? ??? ?Person p0=new Person();
?? ??? ?p0.setId(1);
?? ??? ?p0.setName("張三豐");
?? ??? ?p0.setAge(100);
?? ??? ?p0.setDate(new Date());????????? //暫時用當天
?? ??? ?p0.setSalary(1055.62);
?? ??? ?String[] phone0=new String[]{"0XX-2391XXXX","13X00000001"};
?? ??? ?p0.setPhones(phone0);
?? ??? ?
?? ??? ?persons[0]=p0;
?? ??? ?
?? ??? ?Person p1 =new Person();
?? ??? ?p1.setId(2);
?? ??? ?p1.setName("張無忌");
?? ??? ?p1.setAge(30);
?? ??? ?p1.setDate(new Date());????????? //暫時用當天
?? ??? ?p1.setSalary(1578.94);
?? ??? ?String[] phone1=new String[]{"0XX-2391XXXX"};
?? ??? ?p1.setPhones(phone1);
?? ??? ?
?? ??? ?persons[1]=p1;
?? ??? ?*/
?? ??? ?
?? ??? ?
?? ??? ?return persons;
?? ?}
?? ?
?? ?//main僅用于測試是否能從數據庫返回數據,變成服務時,可將其刪除
?? ?public static void main(String[] args){
?? ??? ?
?? ??? ?DBQueryService service=new DBQueryService();
?? ??? ?Person[] p=service.getPersonList();
?? ??? ?System.out.println("???????????? the query result is: \n-----------------------------------------------------------------------------------------");
?? ??? ?System.out.println("id\tname\tage\tbirthday\t\t\tsalary\tphones");
?? ??? ?System.out.println("-----------------------------------------------------------------------------------------");
?? ??? ?String[] phones;
?? ??? ?
?? ??? ?for(int i=0;i<p.length;i++){
?? ??? ??? ?Person person=p[i];
?? ??? ??? ?phones=person.getPhones();
?? ??? ??? ?String s=person.getId()+"\t"+person.getName()+"\t"+person.getAge()+"\t"+person.getDate()+"\t"+person.getSalary()+"\t";
?? ??? ??? ?for(int j=0;j<phones.length;j++){
?? ??? ??? ??? ?if(phones[j]!=null){
?? ??? ??? ??? ??? ?s+=phones[j]+"\t";
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?System.out.println(s);
?? ??? ?}
?? ??? ?System.out.println("-----------------------------------------------------------------------------------------");
?? ?}
??? }
????? ?
????? ?
?? 3.數據庫建表語句(ORACLE 9i,各位看官可將其改成其他數據庫)
????? create table ws_demo(
???????? id?????? int,
???????? name???? varchar2(20),
???????? age????? smallint,
???????? birthday date,
???????? salary?? number(10,2),
???????? phone??? varchar2(20),
???????? mobile?? varchar2(20),
???????? primary? key (id)
????? )
???? 至于數據,就得你自己來添加了.
? ?
?? 4.發(fā)布服務
????? 1),將編譯好的兩個類(怎么編譯?不用我說了吧.值得注意的一點就是類路徑要包含axis的幾個jar文件),COPY到%tomcat4.1%\webapps\axis\WEB-INF\classes\demo1里(demo1是兩個類的包名)
????? 2).將下面的XML代碼COPY進%tomcat4.1%\webapps\axis\WEB-INF里的server-config.wsdd.(這個文件從哪來,是執(zhí)行org.apache.axis.client.AdminClient得來的,具體可參考別人資料.)
???????? <service name="DBQueryService" provider="java:RPC">
??????????? <parameter name="allowedMethods" value="*"/>
??????????? <parameter name="className" value="demo1.DBQueryService"/>
??????????? <beanMapping languageSpecificType="java:demo1.Person" qname="ns:Person" xmlns:ns="urn:DBQueryService"/>
???????? </service>
????? 至此,發(fā)布完畢.讓我們看一下,啟動tomcat4.1,在IE中打入地址 http://localhost:8080/axis/services/DBQueryService?wsdl,
????? 如果IE顯示一堆XML,說明發(fā)布成功.
??? ?
? ?
?? 5.客戶端調用
???? 本例采用DII方式調用(根據試驗,將DII代碼放在JSP中也可運行),源代碼:
???? package demo1;
??? import org.apache.axis.client.Service;
??? import org.apache.axis.client.Call;
??? import org.apache.axis.encoding.ser.BeanSerializerFactory;
??? import org.apache.axis.encoding.ser.BeanDeserializerFactory;
??? import javax.xml.namespace.QName;
??? import java.net.URL;
??? import java.text.SimpleDateFormat;
??? public class DemoClient {
?? ?public static void main(String[] args) throws Exception {
?? ??? ?String endPoint="http://localhost:8080/axis/services/DBQueryService";
?? ??? ?Service service=new Service();
?? ??? ?Call call=(Call)service.createCall();
?? ??? ?call.setTargetEndpointAddress(new URL(endPoint));
?? ??? ?QName qn=new QName("urn:DBQueryService","DBQueryService");
?? ??? ?call.registerTypeMapping(Person.class,qn,
?? ??? ??? ??? ????????????????? new BeanSerializerFactory(Person.class,qn),
?? ??? ??? ??? ??? ??? ??? ??? ? new BeanDeserializerFactory(Person.class,qn));
?? ??? ?call.setOperationName(new QName("urn:DBQueryService","getPersonList"));
?? ??? ?call.setReturnType(qn,Person[].class); //靈機一動想出來的。
?? ??? ?Person[] persons=(Person[])call.invoke(new Object[]{});
?? ??? ?if(persons==null) System.out.println("abc");
?? ??? ?printData(persons);
?? ?}
?? ?
?????? ?
?? ?public static void printData(Person[] persons){
?? ??? ?SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
?? ??? ?
?? ??? ?if(persons==null){
?? ??? ??? ?System.out.println("the result is null.");
?? ??? ??? ?return;
?? ??? ?}
?? ??? ?
?? ??? ?System.out.println("the query result is: \n-----------------------------------------------------------------------------------------");
?? ??? ?System.out.println("id\tname\tage\tbirthday\tsalary\tphones");
?? ??? ?System.out.println("-----------------------------------------------------------------------------------------");
?? ??? ?String[] phones;
?? ??? ?for(int i=0;i<persons.length;i++){
?? ??? ??? ?Person person=persons[i];
?? ??? ??? ?phones=person.getPhones();
?? ??? ??? ?String s=person.getId()+"\t"+person.getName()+"\t"+person.getAge()+"\t"+sdf.format(person.getDate())+"\t"+person.getSalary()+"\t";
?? ??? ??? ?for(int j=0;j<phones.length;j++){
?? ??? ??? ??? ?if(phones[j]!=null){
?? ??? ??? ??? ??? ?s+=phones[j]+"\t";
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?System.out.println(s);
?? ??? ?}
?? ??? ?System.out.println("-----------------------------------------------------------------------------------------");
?? ?}
??? }
四.點評
?? 本例有選擇的使用int,String,double,String[]等JAVA數據,及一個JavaBean(Person)數組,來驗證WEB SERVICE與JAVA中的數據傳遞(其實你也看到,這種轉換是自動進行的),
?? 在編程當中值得注意的是:
???? 1.遵守JavaBean規(guī)范,要有一個默認構造函數,每個屬性要有對應的setter和getter方法.
???? 2.JavaBean可實現嵌套,如Person中可以再定義一個Address類的JavaBean.
???? 3.本例中未涉及自定義序列化和反序列化.
五.本示例效果:(采用不連接數據庫的代碼)
the query result is:
-----------------------------------------------------------------------------------------
id??? name???? age??? birthday????? salary???? phones
-----------------------------------------------------------------------------------------
1??? 張三豐??? 100??? 2006-07-13??? 1055.62??? 0XX-2391XXXX??? 13X00000001???
2??? 張無忌??? 30? ?? 2006-07-13??? 1578.94??? 0XX-2391XXXX???
-----------------------------------------------------------------------------------------
posted on 2006-07-13 10:50 2195113 閱讀(2689) 評論(0) 編輯 收藏 所屬分類: Web Service