`

webservice开发和使用指南4

阅读更多
 
 
3. 修改web.xml
加入如下代码
<listener>
        <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
    </listener>
   
     <servlet>
           <servlet-name>AxisServlet</servlet-name>
           <display-name>Apache-Axis Servlet</display-name>
           <servlet-class>
               org.apache.axis.transport.http.AxisServlet
           </servlet-class>
     </servlet>
  <servlet>
    <servlet-name>AdminServlet</servlet-name>
    <display-name>Axis Admin Servlet</display-name>
    <servlet-class>
        org.apache.axis.transport.http.AdminServlet
    </servlet-class>
    <load-on-startup>100</load-on-startup>
 </servlet>
  <servlet>
    <servlet-name>SOAPMonitorService</servlet-name>
    <display-name>SOAPMonitorService</display-name>
    <servlet-class>
        org.apache.axis.monitor.SOAPMonitorService
    </servlet-class>
    <init-param>
      <param-name>SOAPMonitorPort</param-name>
      <param-value>5001</param-value>
    </init-param>
    <load-on-startup>100</load-on-startup>
 </servlet>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/servlet/AxisServlet</url-pattern>
 </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>*.jws</url-pattern>
 </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
 </servlet-mapping>
  <servlet-mapping>
    <servlet-name>SOAPMonitorService</servlet-name>
    <url-pattern>/SOAPMonitor</url-pattern>
 </servlet-mapping>
  <!-- uncomment this if you want the admin servlet -->
    <!-- currently the W3C havent settled on a media type for WSDL;
    http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
    for now we go with the basic 'it's XML' response -->
 <mime-mapping>
    <extension>wsdl</extension>
     <mime-type>text/xml</mime-type>
 </mime-mapping>
    <mime-mapping>
    <extension>xsd</extension>
    <mime-type>text/xml</mime-type>
 </mime-mapping>
4.       布署
(1)    WEB-INF下建立文件server-config.wsdd
(2)    文件内容如下:
蓝色部分定义了服务的名称,所用的类 方法.
红色部分定义了服务的方法所用的返回值的自定义类型.
<?xml version="1.0" encoding="gb2312"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
   
       <globalConfiguration>
              <parameter name="adminPassword" value="admin"/>
              <parameter name="enableNamespacePrefixOptimization" value="true"/>
              <parameter name="attachments.Directory" value="D:\jakarta-tomcat-5.0.28\webapps\axis\WEB-INF\attachments"/>
              <parameter name="disablePrettyXML" value="true"/>
              <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
              <parameter name="sendXsiTypes" value="true"/>
              <parameter name="sendMultiRefs" value="true"/>
              <parameter name="sendXMLDeclaration" value="true"/>
              <requestFlow>
                     <handler type="java:org.apache.axis.handlers.JWSHandler">
                            <parameter name="scope" value="session"/>
                     </handler>
                     <handler type="java:org.apache.axis.handlers.JWSHandler">
                            <parameter name="scope" value="request"/>
                            <parameter name="extension" value=".jwr"/>
                     </handler>
              </requestFlow>
       </globalConfiguration>
    <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
       <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
       <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
 <!-- 自定义服务开始 -->
<!-- 单点登陆服务 add by Zhang.P.F -->
 <service name="SSOWebservice" provider="java:RPC">
 <parameter name="allowedMethods" value="*"/>
 <parameter name="className" value="zpf.SSOWebservice"/>
 <operation name="login" returnType="ns:boolean">
    <parameter name="loginid" type="ns:String"/>
       <parameter name="password" type="ns:String"/>
 </operation>
 <operation name="getAllDepts" returnType="ns:ArrayOf_tns2_DepartmentInfo">
   </operation>
 <typeMapping
        xmlns:ns="http://interf.kmwhc.zpf.com"
        qname="ns:DepartmentInfo"
        type="java:zpf.DepartmentInfo"
        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
 />
 <typeMapping
        xmlns:ns="urn:SSOWebservice"
        qname="ns:ArrayOf_tns2_DepartmentInfo"
        type="java:zpf.DepartmentInfo[]"
        serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
        deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
        encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
 />
 </service>
 <!-- 自定义服务结束 -->
    <service name="AdminService" provider="java:MSG">
              <parameter name="allowedMethods" value="AdminService"/>
              <parameter name="enableRemoteAdmin" value="false"/>
              <parameter name="className" value="org.apache.axis.utils.Admin"/>
              <namespace>http://xml.apache.org/axis/wsdd/</namespace>
              <namespace>http://xml.apache.org/axis/wsdd/</namespace>
       </service>
    <service name="Version" provider="java:RPC">
              <parameter name="allowedMethods" value="getVersion"/>
              <parameter name="className" value="org.apache.axis.Version"/>
       </service>
    <transport name="http">
              <requestFlow>
                     <handler type="URLMapper"/>
                     <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
              </requestFlow>
              <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
              <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
              <parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/>
              <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>
              <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
              <parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
       </transport>
    <transport name="local">
              <responseFlow>
                     <handler type="LocalResponder"/>
              </responseFlow>
       </transport>
</deployment>
 文件修改完毕后,重新启动你的应用服务器.

5.       测试

 SSOWebservice
Hi there, this is an AXIS service!
Perhaps there will be a form for invoking the service here...
 6.     编译生成客户端调用包
   我用的ANT进行编译,在配置文件里加入如下代码
<!--登录服务-->
       <java2wsdl output="${client.dir}/SSOWebservice.wsdl"
           className="zpf.SSOWebservice"
           namespace="urn:SSOWebservice"
           location="http://localhost:8080/kmwhc/services/SSOWebservice">
           <mapping namespace="urn:SSOWebservice"
              package="zpf.client" />
       </java2wsdl>
       <wsdl2java url="${client.dir}/SSOWebservice.wsdl"
           output="${client.dir}" deployscope="session" serverSide="yes"
           skeletonDeploy="no" noimports="no" verbose="no" testcase="no">
           <mapping namespace="urn:SSOWebservice"
              package="zpf.client" />
       </wsdl2java>
 编译,生成wsdl文件和客户端代码.
7调用代码:
zpf.client.SSOWebserviceServiceLocator sv=new zpf.client. SSOWebserviceServiceLocator();
zpf.client.SSOWebservice ssp=sv.getWebCaseservice(new java.net.URL("http://localhost:8080/kmwhc/services/SSOWebservice"));
   boolean aa=ssp.login(admin”,”123”);

10.相关文章
10.1 AXIS详细介绍
Apache Axis 是Apache WebService项目中的子项目,其最初起源于IBM的"SOAP4J",应该属于最早的一批用于构造基于SOAP应用的Framework。 目前Apache Axis已经发展到了第三代,其核心是一个SOAP处理器,用于开发包括客户端,服务器端,SOAP Gateway等各种应用。事实上Apache Axis在了1.0版后,其发行版本还包括了完整的J2EE服务器插件, WSDL支持和生成,TCP/IP监视器等组件,从这个意义上来说Apahce Axis已不仅仅是个SOAP框架了,它包含了除了UDDI外对整个Web Service协议栈(Protocol Stack)的支持。
       AXIS研究的时间不长,在下在到的AXIS包中有一个类叫WSDL2Java,从字面意思就能够理解到这个工具是做什么的。既:提供要调用的webservice描述WSDL,然后生成调用的时候需要的JAVA程序,目前为止我也是只研究到这,因为我们在调用另一个公司提供的webservice的时候对方返回的信息就是dataset,我用soap的方法已经没有办法实现了(后来调查是可以实现的,但是相当麻烦),经商议以后决定修改对方的webservice,将返回的dataset强制tostring,然后再返回到JAVA中作处理。虽然解决了问题,但是改动对方的webservice有损webservice的意义,所以就使用了AXIS。从网上查资料的时候查到了WSDL2JAVA这个类。
对于编写基于AXIS方法能够调用.NET的JAVA程序,你必须有一下几个工具:
1、 操作系统
2、 JDK(我使用的是j2sdk1.4.2)
3、 axis.jar
      Axis-schema.jar 1.3的版本中有这个文件。
commons-discovery.jar
commons-logging.jar
jaxrpc.jar
log4j-1.2.8.jar
name.txt
saaj.jar
wsdl4j.jar
4、 集成开发环境(我的是Eclipse3.1.1)
将axis包中的jar文件存到jdk下面,在windows控制台中进入jdk目录,然后运行
WSDL2Java生成的文件总结如下:
Client-side Bindings
Sample:    java org.apache.axis.wsdl.WSDL2Java AddressBook.wsdl

WSDL 子句
生成的Java
为在type区的每个条目
一个Java
一个Holder类,如果此type被用作inout/out参数
为每个portType
一个Java接口
为每个binding
一个Stub
为每个service
一个service接口
一个service实现(作为定位器)

 
Server-side Bindings
Sample: java org.apache.axis.wsdl.WSDL2Java --server-side AddressBook.wsdl

WSDL 子句
生成的Java
为每个binding
一个Skeleton(—skeletonDeploy设为true)
一个实现模板类(供用户修改为自己的实现)
为所有的services
一个deploy.wsdd文件
一个undeploy.wsdd文件

 
命令参数参考:
Usage:
  java org.apache.axis.wsdl.WSDL2Java [options] WSDL-URI
Options:
-h, --help
 打印帮助信息后退出
-v, --verbose
 打印报告信息
-n, --noImports
 只生成直接的WSDL代码文档
-O, --timeout <argument>
 超时秒数(默认45秒, -1表示不限定)
-D, --Debug
 打印调试信息
-W, --noWrapped
 关闭装订(wrapped)文档/文字支持
-s, --server-side
 为web service发布服务端绑定
-S, --skeletonDeploy <argument>
 在deploy.wsdd中展开纲要(true)或执行(false)。
 默认为false。假定server-side.
-N, --NStoPkg <argument>=<value>
 命名空间到包的映射
-f, --fileNStoPkg <argument>
 命名空间到包的映射文件(默认为NStoPkg.properties)


-p, --package <argument>
 用包名称覆盖所有的命名空间到包的映射
-o, --output <argument>
 发行文件的输出目录
-d, --deployScope <argument>
 增加范围到deploy.xml: Application(应用), Request(请求), Session(会话)
-t, --testCase
 为web service发行junit测试用例类
-a, --all
 为所有元素生成代码,包括未引用的元素
-T, --typeMappingVersion
 指示1.1或1.2版. 默认为1.1版(SOAP 1.1适用JAX-RPC. 1.2标志SOAP 1.1编码.)
-F, --factory <argument>
 执行GeneratorFactory接口的用户类名称(扩展Java generation函数)
-i, --nsInclude <namespace>
 包含在生成代码中的特定命名范围(默认为所有命名空间,除非用-x选项)
-x, --nsExclude <namespace>
 从生成代码中排除的特定命名空间(默认为none,排除直到第一个用-i选项包含的命名空间)
-p, --property <name>=<value>
 用户GeneratorFactory的属性名称和值
-H, --helperGen
 为meta数据发行分离Helper类
-U, --user <argument>
 访问WSDL-URI的用户名
-P, --password <argument>
 访问WSDL-URI的密码
-c, --implementationClassName <argument> 用该项作为实现类
假如我要调用的webservice中的laiheng方法,在生成的文件中就有LaihengResponseLaihengResult.Java文件,其中有一块是这样写的:
    public LaihengResponseLaihengResult(
           org.apache.axis.message.MessageElement [] _any) {
           this._any = _any;
}
_any中就有你要的结果了。
写到这里暂时就算写完了吧,其实有好多要写的东西,我这人比较懒,写一篇能够引导新手不走弯路的文章的出发点应该是好的。可是写到这后就没有时间和想法继续写下去了。如果要是看到这篇文章后不明白的地方或者是我写错的地方,请指正。
我的电子邮件是:TTYsonic#gmail.com
10.2       使用Handler来增强Web服务的功能
axis版本是apache axis-bin-1_3,可以到apache网站下载。
10.2.1      环境变量设置
AXIS_HOME
即axis-bin-1_2.zip解压的目录(我的是在 F:\opensource\axis-1_2)
   AXIS_LIB
即 %AXIS_HOME%\lib
10.2.2      导入jar包
将axisa解压缩后,复制lib目录下列jar包到应用目录的lib目录:
saaj.jar
wsdl4j-1.5.1.jar
jaxrpc.jar
commons-logging-1.0.4.jar
commons-discovery-0.2.jar
axis-schema.jar
axis-ant.jar
axis.jar
10.2.3      修改web.Xml
axis需要的servlet复制到应用的web.xml文件里面,注意顺序。重新启动服务,可以访问“/servlet/AxisServlet”试一下,比如:http://10.162.11.70:9080/newsdaoa/servlet/AxisServlet 详细参见web.xml配置文件。
10.2.4      加服务
将server-config.wsdd文件复制到发布应用的WEB-INF目录下,这就是AXIS的配置文件,以后所有的服务发布描述都会在里面找到。
如果还没有server-config.wsdd文件,可以先写一个发布描述文件,然后用axis来生成,以后需要发布新的服务,直接往里面添加即可。
比如有一个HelloWorld.class类,里面有sayHello(String msg)方法,想把它发布webservices,先写发布文件deploy.wsdd文件,即SOAP服务发布描述文件deploy.wsdd
http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
进入dos窗口,执行下列命令:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd 即可生成server-config.wsdd文件。
如果想发布新的服务,直接往server-config.wsdd里面添加service描述,比如想把知识管理模块导入知识功能发布成webservices,对应的程序文件是com.lc.v3.ecp.km.inteface.KmDelegate.java,需要发布的方法是importKm(String kmXmlStr),将此文件编译成class后,放到发布系统的相应目录下,往server-config.wsdd添加下列描述: 
重新启动服务,一个新的webservices就发布成功了,如果系统发布地址是http://10.162.11.70:9080/newsdaoa
10.2.5      给服务添加Handler
J2EE Web 服务中的Handler技术特点非常像Servlet技术中的Filter。我们知道,在Servlet中,当一个HTTP到达服务端时,往往要经过多个Filter对请求进行过滤,然后才到达提供服务的Servlet,这些Filter的功能往往是对请求进行统一编码,对用户进行认证,把用户的访问写入系统日志等。相应的,Web服务中的Handler通常也提供一下的功能:
对客户端进行认证、授权;
把用户的访问写入系统日志;
对请求的SOAP消息进行加密,解密;
为Web Services对象做缓存。
SOAP消息Handler能够访问代表RPC请求或者响应的SOAP消息。在JAX-RPC技术中,SOAP消息Handler可以部署在服务端,也可以在客户端使用。
至于如何开发handler,可以到网上去搜索陈亚强写的《使用Handler来增强Web服务的功能》,人家写的比较好,我就不在这废话了。
比如服务必须有用户名和密码才能访问,可以添加axis自带的检验认证handler,用户名和密码存放在\WEB-INF下的users.lst文件中。handler分别是:
//访问者必须提供用户名和密码,只要用户名和密码正确即可
org.apache.axis.handlers.SimpleAuthenticationHandler
//访问者必须提供指定的用户名和密码,用户名和密码正确即可
//在services中用allowedRoles属性指定访问的用户名
org.apache.axis.handlers.SimpleAuthorizationHandler
如果想给上面的ImportKm服务添加用户校验,并且只允许用户是pubnet,密码是123456的用户访问,首先往users.lst添加用户名和密码,格式是:
pubnet 123456
user1 pass1
user2
user3 pass3
11. 常见问题和解答
1.通过build.xml文件,根据java文件来生成wsdl文件(即:java2wsdl)生成的文件中,相关的参数名称和java文件中的webservice函数的参数名称不对应,但是,可以使用,如何解决?
答: 通过试验,可能是axis本身的一个bug。但是,如果通过修改server-config.wsdd文件,把相关的webservice函数添加到该文件中,然后通过启动服务,来获得wsdl文件,参数名称都和java类中webservice函数参数相互对应。建议,采用修改server-config.wsdd文件。
2.启动axis本身自带的axis server时,总是产生警告:Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled
答:可以添加两个jar文件:mailapi_1_3_1.jar, activation.jar 。详细参见:
http://www.cppblog.com/wform/archive/2006/04/27/mail_activation_jar.html这个是可以忽略的。不过以后构建web services都要用到的,还是添加上的好。
3.青牛和97营业系统交互的webservice的部署方式?
答:相同的一个应用,但是青牛和97的IP地址是不同的。
青牛的访问地址: http://134.96.71.13:8080/axis/ 
97的访问地址:http:// 134.96.4.3:8080/axis
 
12 .参考资源
1.Axis官方网站的帮助文档 参见axis官方网站。http://ws.apache.org/
2.网络相关的文档
3. http://134.96.71.13:8080/axis/ 青牛和97营业系统的webservice部署地址。
4.Spring+Axis2的开发和使用指南。
13 .总结和展望
1.这是个详细的版本。以后发布一个简单版,可以通过短短的100多个字,可以完成全部的操作。
2.可以采用axis2,新的架构,更好的文档。详细axis官方网站。
感谢网上的相关资源。
14.附录
14.1 测试webservice用例代码
在zj114boss_new、dxmp工程中,有源代码可以参照。很好的方式。
/**
     *
     * @throws RemoteException
     * @author zhanglelei
     * @date 2006-11-23 16:43:56
     */
    public void testQnSendMail2() throws RemoteException {
       String soapAddress = "http://134.96.71.142/QnInterface/SendMsgService.asmx";
       try {
           URL endpoint = new URL(soapAddress);
           // Create proxy class
           SendMsgServiceLocator sendMsgServiceLocator = new SendMsgServiceLocator();
          
           // Get the implementation class of the webservice
           SendMsgServiceSoapStub sendMsgServiceSoapStub = (SendMsgServiceSoapStub)sendMsgServiceLocator.getSendMsgServiceSoap(endpoint);
          
           // Finish actual action
           int retVal = sendMsgServiceSoapStub.QnSendMail("zhanglelei@channelsoft.com", "1", "1", "1");
          
           System.out.println("动态调用发送邮件接口返回值为:" + retVal);
       } catch (ServiceException e) {
           e.printStackTrace();
       } catch (MalformedURLException e1) {
           e1.printStackTrace();
       }
    }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics