您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > webservice实战笔记
Webservices发布说明一。发布环境:Web服务器:WebLogic8.1;开发工具:MyEclipse5.5;Java版本:j2sdk1.4.2_05;数据库:Oracle10g;二。发布方式和过程:采用XFire方式发布;发布前环境准备:WebLogic.jar中的QName.class不能满足XFire的要求,从官网下载qname.jar放在D:\bea\weblogic81\server\lib目录下:然后修改WebLogic的公共类路径:D:\bea\weblogic81\common\bin目录下找到:commEnv.cmd,setWEBLOGIC_CLASSPATH=%JAVA_HOME%\lib\tools.jar;%WL_HOME%\server\lib\weblogic_sp.jar;%WL_HOME%\server\lib\weblogic.jar这一句修改为:setWEBLOGIC_CLASSPATH=%WL_HOME%\server\lib\qname.jar;%JAVA_HOME%\lib\tools.jar;%WL_HOME%\server\lib\weblogic_sp.jar;%WL_HOME%\server\lib\weblogic.jar目的是让WebLogic优先加载qname.jar中的QName.class,此外还可以直接替换weblogic.jar中的QName.class;1。首先将XFire依赖的jar包放在WEB-INF\lib\目录下;XFire依赖包:;在放jar包时,务必确保这些包没有和原来加入web类路径下的jar或class文件冲突(特别是版本不一致),否则将出现异常;2.修改web.xml配置:添加如下:另外此url-pattern要跳过过滤器:将/services/加入如下3.编写要发布的bean:首先写一个接口:该接口可以实现按一句查询语句访问数据库并返回查询的数据的功能;packagelmd.xjy.xfire;importjava.util.List;publicinterfaceIGerneric{/**@paramsql,任意sql语句*@returnList,返回符合条件的整张表的数据,如:ListMapString,Object*/publicListfindAll(Stringsql)throwsException;}然后编写接口实现类:packagelmd.xjy.xfire;importjava.sql.*;importjava.util.*;importnet.risesoft.commons.database.Conn;importlmd.xjy.util.Blob2Str;publicclassGernericimplementsIGerneric{publicGerneric(){//defaultconstructor}/**(non-Javadoc)*@seelmd.xjy.xfire.IGerneric#findAll(java.lang.String)*@paramsql任意查询sql*@return包含一张表的所有行,List的每个元素为一行记录(值对象)*/publicListfindAll(Stringsql){Connectionconn=null;PreparedStatementpstmt=null;ResultSetrs=null;Listlist=newArrayList();ResultSetMetaDatarsmd=null;try{conn=Conn.getConnection();pstmt=conn.prepareStatement(sql);rs=pstmt.executeQuery();rsmd=rs.getMetaData();while(rs.next()){Mapm=newHashMap();//每行一个mapfor(inti=1;i=rsmd.getColumnCount();i++){Stringcol=rsmd.getColumnName(i);if(BLOB.equals(rsmd.getColumnTypeName(i))){Stringsb=newString();Blobblob=rs.getBlob(i);//获取Blob对象if(blob==null){m.put(rsmd.getColumnName(i),);System.out.println(数据库中blob对象为空值);}else{byte[]bytes=blob.getBytes(1,(int)blob.length());//一次性读入内存sb=newsun.misc.BASE64Encoder().encode(bytes);//具体的编码方法m.put(col,sb);System.out.println(blob对象获取成功);}}elseif(CLOB.equals(rsmd.getColumnTypeName(i))){Stringstr=Blob2Str.getStr(rs.getClob(i));if(.equals(str)){m.put(rsmd.getColumnName(i),);System.out.println(数据库中clob对象为空值);}else{m.put(col,str);System.out.println(clob对象获取成功);}}else{m.put(col,rs.getObject(i));}}list.add(m);//按行存入list}}catch(Exceptione){e.printStackTrace();}finally{try{if(rs!=null){rs.close();}if(conn!=null){conn.close();}}catch(Exceptione){e.printStackTrace();}}returnlist;}publicstaticbyte[]getBlob(Stringstr)throwsjava.sql.SQLException,IOException{byte[]bytes=newsun.misc.BASE64Decoder().decodeBuffer(str);returnbytes;}publicstaticvoidmain(String[]args){newGerneric().findAll(select*frominfo_classdefine);}}由于该功能类的返回类型是ListMap这种复杂类型,并且jdk是1.4水平,必须进行xml解析:解析方法:在功能类的包目录下创建同要发布的功能接口同名的*.aegis.xml文件:其内容:?xmlversion=1.0encoding=UTF-8?mappingsmappingmethodname=findAllparameterindex=0componentType=java.lang.String/return-typecomponentType=java.util.MapkeyType=java.lang.String//method/mapping/mappings该类将查询的每一行数据按键值对的形式存入一个HashMap实例中,然后将每个HashMap实例添加进一个List实例中,这样返回的List实例将包含一张表的数据;其中,对CLOB、BLOB等大对象的处理采用转换为一个String类型进行保存和传输;BLOB转换为String采用重新编码生成,CLOB则直接读取字符流转换,具体实现借助于以下工具类(当然可以在要发布的类中实现这些操作,可以供客户端使用):packagelmd.xjy.util;importjava.io.*;importjava.sql.Blob;importjava.sql.Clob;publicclassBlob2Str{publicstaticStringgetStr(Blobblob)throwsjava.sql.SQLException{Stringret=newString();byte[]bytes=blob.getBytes(1,(int)blob.length());//一次性读入内存ret=newsun.misc.BASE64Encoder().encode(bytes);//具体的编码方法returnret;}publicstaticbyte[]getBlob(Stringstr)throwsjava.sql.SQLException,IOException{byte[]bytes=newsun.misc.BASE64Decoder().decodeBuffer(str);returnbytes;}publicstaticStringgetStr(Clobclob){if(clob==null)returnnull;Readeris=null;StringBuffersb=newStringBuffer();BufferedReaderbr=null;try{is=clob.getCharacterStream();br=newBufferedReader(is);Strings=br.readLine();while(s!=null){//执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRINGsb.append(s);s=br.readLine();}}catch(Exceptione){e.printStackTrace();}finally{try{if(br!=null){br.close();}}catch(IOExceptione){e.printStackTrace();}}returnsb.toString();}}4.在src(就是web-inf\classes\)目录下或直接在WEB-INF\下创建文件夹META-INF,在META-INF下创建目录xfire,xfire下创建services.xml文件,如下:?xmlversion=1.0encoding=utf-8?beansxmlns=重启WebLogic,出现如下界面表示成功:6.IE访问:查看webservices列表和wsdl文件:点击[wsdl]就可以看到他的wsdl表述语言:三、调用webservices:新建webservice工程:添加客户端支持库:编写客户端类:通过WSDL文件直接调用程序该方式类似于axis的DII调用方式。只需要得到wsdl文件后放在src或者WEB-INF\classes下即可。也可以通过wsdl的URL地址调用packagelmd.xjy.test;importjava.io.IOException;importjava.net.URL;importorg.codehaus.xfire.client.Client;publicclassWSClient{publicstaticvoidmain(String[]args)throwsIOException,Exception{//本地的写法//Stringwsdl=HelloXfire.wsdl;//对应的
本文标题:webservice实战笔记
链接地址:https://www.777doc.com/doc-2867063 .html