【WebService】第四章、Axis1.4发布WebService
来源:互联网 发布:陕西广电网络总公司 编辑:程序博客网 时间:2024/05/16 14:23
本章节主要介绍Axis1.4发布WebService。这里只说明发布相关内容,调用方法后续会说明。
1、下载安装
下载地址:http://archive.apache.org/dist/axis/
本案例中使用的版本 :http://archive.apache.org/dist/axis/axis/java/1.4/axis-bin-1_4.zip
下载完成之后解压文件,得到目录如下
目录说明:
docs:存放Axis的说明文档。
lib:存放Axis的二进制发布包,(如果你想在你项目中使用就导入这里的包)。
samples:官方给的一些简单案例。
webapps:里面放了一个axis项目,放到tomcat的webapps下可以直接使用。
xmls:相关说明文档。
maven安装:大多数情况下我们只是想在自己的web项目中引入这项技术,我们只需要导入jar包即可。
- <dependency>
- <groupId>axis</groupId>
- <artifactId>axis</artifactId>
- <version>1.4</version>
- </dependency>
- <dependency>
- <groupId>axis</groupId>
- <artifactId>axis-wsdl4j</artifactId>
- <version>1.5.1</version>
- </dependency>
- <dependency>
- <groupId>javax.mail</groupId>
- <artifactId>mail</artifactId>
- <version>1.4.7</version>
- </dependency>
2、即时发布JWS
步骤:编写一个不带包名的java类→修改后缀为jws→将文件拷贝到项目根目录下。
例如本例中:新建java类,将下载的axis1_4中webapps下的axis文件夹拷贝到tomcat的webapps下,启动tomcat。
- publicclass HelloJWS {
- public String sayHello(String name){
- return"jws = " + name;
- }
- }
访问这个路径:http://127.0.0.1:8080/axis/HelloJWS.jws?wsdl 在浏览器上就可以看到wsdl了,表示发布服务成功。
JWS方式总结:
1. 即时发布方式比较简单,写个类一丢就可以了。
2. 类不能有包名,而且如果你只有class或者jar包则不可以使用这种方式。
3. 所以可以看出,这种方式只能发布特别特别简单的服务。不适用企业开发,所以了解就好了。
3、定制发布
定制发布的步骤:
定制发布就是需要自己写配置文件然后指定哪些方法是需要发布的,哪些方法不需要发布。所以这种比较好。
一般来说定制发布的步骤如下:
1. 新建一个web工程。
2. 导入jar包,如果使用maven管理jar包则使用上面给出的maven依赖即可。
3. 像正常项目那样编写业务类。
4. 修改web.xml文件,添加一个访问地址,用于访问wsdl文件。
5. 写一个deploy.wsdd文件,配置哪些方法需要发布,哪些不用。然后在cmd命令行执行一个命令读取这个文件。
服务就发布了。如果想取消则可以写一个undeploy.wsdd文件,同样的命令执行这个文件即可。(下面会详细说明)
6. 访问wsdl,看看服务是否发布成功。
注意: 上述步骤的第4步是为了生成server-config.wsdd文件。如果你直接编辑server-config.wsdd文件。那么就
不用那么麻烦了。所以我比较喜欢直接编辑server-config.wsdd文件。
定制发布的详细流程:
1. 创建一个maven工程,并添加依赖导入jar包,编辑一个普通的方法用于发布。
上图就是整个项目的结构了。其中WEB-INF目录下的deploy.wsdd表示写入其中的配置会被发布。undeploy.wsdd则用于取消发布。
2. 修改web.xml文件,增加一个访问路径。所以如果你想看看项目一共发布了多少个服,访问这个路径即可。
- <!DOCTYPE web-app PUBLIC
- "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd" >
- <web-app>
- <servlet>
- <servlet-name>AxisServlet</servlet-name>
- <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>AxisServlet</servlet-name>
- <url-pattern>/services/*</url-pattern>
- </servlet-mapping>
- </web-app>
- <deploymentxmlns="http://xml.apache.org/axis/wsdd/"
- xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
- <!-- name: 服务名随便写。 -->
- <servicename="SayHello"provider="java:RPC">
- <parametername="className"value="com.ztesoft.axis.ws.HelloImpl"/>
- <!-- value表示哪些方法需要发布,*表示全部的public方法。 -->
- <!-- 如果想指定方法名,方法名与方法名用逗号隔开 -->
- <parametername="allowedMethods"value="*"/>
- <!-- 指定命名空间 -->
- <namespace>http://www.ztesoft.com/axis/sayHello</namespace>
- </service>
- </deployment>
4. 部署项目到tomcat,并且启动项目。这个时候访问 http://127.0.0.1:8080/axis/services(因为web.xml配置了这个servlet路径,
所以访问这个路径)你会发现有两个服务,AdminService 和 Version。因为我们还没有生成server-config.wsdd文件,所以只有两个。
5. 通过命令行执行命令读取deploy.wsdd生成server-config.wsdd文件发布服务。项目的WEB-INF目录下
- java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -l http://127.0.0.1:8080/axis/services deploy.wsdd
如果你看到上面两行内容,说明执行成功了。-l 后面的路径就是你在web.xml中配置的AxisServlet路径这个时候该目录下会生成
一个server-config.wsdd文件。这时访问 http://127.0.0.1:8080/axis/services。你就会发现多出来一个服务。点击SayHello的wsdl
你就可以看见服务描述了。
如果不想发布这个服务了,则同样执行上面的命令,将deploy.wsdd换成undeploy.wsdd即可。undeploy.wsdd内容如下
执行之后就看不到该服务了。下面的服务名就是上面可以随便写的name。
- <deploymentxmlns="http://xml.apache.org/axis/wsdd/">
- <servicename="SayHello" />
- </deployment>
1. 定制发布比即时发布方便很多,可以自由定义。所以一般用这种,而且不需要添加任何注解只需要配置一个文件即可。
2. deploy.wsdd以及undeploy.wsdd的目的都是为了生成或者修改server-config.wsdd。所以直接编辑server-config.wsdd就可以了。
3. 完整的server-config.wsdd文件如下。
- <?xmlversion="1.0"encoding="UTF-8"?>
- <deploymentxmlns="http://xml.apache.org/axis/wsdd/"
- xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
- <globalConfiguration>
- <parametername="sendMultiRefs"value="true"/>
- <parametername="disablePrettyXML"value="true"/>
- <parametername="adminPassword"value="admin"/>
- <parametername="dotNetSoapEncFix"value="true"/>
- <parametername="enableNamespacePrefixOptimization"value="false"/>
- <parametername="sendXMLDeclaration"value="true"/>
- <parametername="attachments.implementation"value="org.apache.axis.attachments.AttachmentsImpl"/>
- <parametername="sendXsiTypes"value="true"/>
- <requestFlow>
- <handlertype="java:org.apache.axis.handlers.JWSHandler">
- <parametername="scope"value="session"/>
- </handler>
- <handlertype="java:org.apache.axis.handlers.JWSHandler">
- <parametername="scope"value="request"/>
- <parametername="extension"value=".jwr"/>
- </handler>
- </requestFlow>
- </globalConfiguration>
- <handlername="URLMapper"type="java:org.apache.axis.handlers.http.URLMapper"/>
- <handlername="LocalResponder"type="java:org.apache.axis.transport.local.LocalResponder"/>
- <handlername="Authenticate"type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
- <transportname="http">
- <requestFlow>
- <handlertype="URLMapper"/>
- <handlertype="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
- </requestFlow>
- <parametername="qs:list"
- value="org.apache.axis.transport.http.QSListHandler"/>
- <parametername="qs:wsdl"
- value="org.apache.axis.transport.http.QSWSDLHandler"/>
- <parametername="qs.list"
- value="org.apache.axis.transport.http.QSListHandler"/>
- <parametername="qs.method"
- value="org.apache.axis.transport.http.QSMethodHandler"/>
- <parametername="qs:method"
- value="org.apache.axis.transport.http.QSMethodHandler"/>
- <parametername="qs.wsdl"
- value="org.apache.axis.transport.http.QSWSDLHandler"/>
- </transport>
- <transportname="local">
- <responseFlow>
- <handlertype="LocalResponder"/>
- </responseFlow>
- </transport>
- <!-- 想要添加或者取消修改一下内容即可,AdminService与Version注销不提供服务。 -->
- <servicename="SayHello"provider="java:RPC">
- <parametername="allowedMethods"value="*"/>
- <parametername="className"value="com.ztesoft.axis.ws.HelloImpl"/>
- <namespace>http://www.ztesoft.com/axis/sayHello</namespace>
- </service>
- </deployment>
4、高级特性Handler & Chain
上面说了直接编辑server-config.wsdd即可发布服务,所以下面就不再使用命令行方式。
Handler:
有时候我们有一些特别的需求,比如当执行我们提供的服务时,希望有一些拦截动作。例如拦截一些非法的用户,
或者统计下这个服务被调用了多少次等很奇怪的问题。对于这种问题一般做法就是设置拦截器。就是在执行你的服务
前执行某些方法,执行之后在执行某些方法。Handler就是做这类事情的。项目结构如下:
具体步骤:
1. 写两个类,继承BasicHandler。类分别叫BeforeHandle,AfterHandler。
2. 配置server-config.wsdd,将这两个方法加入到服务中。
详细步骤:
1. 创建类并继承BasicHandler
- package com.ztesoft.axis.ws;
- import org.apache.axis.AxisFault;
- import org.apache.axis.MessageContext;
- import org.apache.axis.handlers.BasicHandler;
- publicclass BeforeHandleextends BasicHandler {
- /**
- */
- privatestaticfinallong serialVersionUID = -1804045183252961242L;
- @Override
- publicvoid invoke(MessageContext msgContext)throws AxisFault {
- String someParam = (String) this.getOption("someParam");
- System.out.println("前置方法,这里会第一个被调用");
- System.out.println("server-config.wsdd中配置的自定义参数 :" + someParam);
- }
- }
- package com.ztesoft.axis.ws;
- import org.apache.axis.AxisFault;
- import org.apache.axis.MessageContext;
- import org.apache.axis.handlers.BasicHandler;
- publicclass AfterHandlerextends BasicHandler{
- /**
- */
- privatestaticfinallong serialVersionUID = -1077633556581583559L;
- @Override
- publicvoid invoke(MessageContext msgContext)throws AxisFault {
- System.out.println("后置方法,执行完服务后调用我。我是第三个被调用的。");
- }
- }
- <!-- 添加一个自定义的handler -->
- <handler name="beforeHandler"type="java:com.ztesoft.axis.ws.BeforeHandle">
- <!-- 这里还可以设置自定义参数,在类中使用this.getOptions("someParam") 获取参数 -->
- <parametername="someParam"value="好好学习,天天向上"/>
- </handler>
- <handlername="afterHandler"type="java:com.ztesoft.axis.ws.AfterHandler"/>
- <servicename="SayHello"provider="java:RPC">
- <parametername="allowedMethods"value="*"/>
- <parametername="className"value="com.ztesoft.axis.ws.HelloImpl"/>
- <namespace>http://www.ztesoft.com/axis/sayHello</namespace>
- <!-- 添加handler -->
- <requestFlow>
- <handlertype="beforeHandler"/>
- </requestFlow>
- <responseFlow>
- <handlertype="afterHandler"/>
- </responseFlow>
- </service>
Chain:
如果我有一连串的方法需要被调用,那该怎么办呢?将Handler一个一个的连接起来组成一个链就是chain。
步骤:
1. 新建一个类继承SimpleChain。
2. 将这个类提供的服务像Handler一样配置到server-config.wsdd中。
详细步骤:
1. 新建类
- package com.ztesoft.axis.ws;
- import org.apache.axis.SimpleChain;
- publicclass BeforeChainextends SimpleChain{
- /**
- */
- privatestaticfinallong serialVersionUID = 7781745675745772330L;
- // 写在构造器重即可
- public BeforeChain(){
- BeforeHandle beforeHandle = new BeforeHandle();
- AfterHandler afterHandler = new AfterHandler();
- // 执行顺序与添加顺序一致。
- this.addHandler(beforeHandle);
- this.addHandler(afterHandler);
- }
- }
- package com.ztesoft.axis.ws;
- import org.apache.axis.SimpleChain;
- publicclass AfterChainextends SimpleChain {
- /**
- */
- privatestaticfinallong serialVersionUID = -620214048210047247L;
- public AfterChain(){
- BeforeHandle beforeHandle = new BeforeHandle();
- AfterHandler afterHandler = new AfterHandler();
- // 执行顺序与添加顺序一致。
- this.addHandler(afterHandler);
- this.addHandler(beforeHandle);
- }
- }
2. 修改配置文件
- <!-- 添加自定义Chain -->
- <chain name="beforeChain">
- <handlertype="java:com.ztesoft.axis.ws.BeforeChain"/>
- </chain>
- <chainname="afterChain">
- <handlertype="java:com.ztesoft.axis.ws.AfterChain"/>
- </chain>
- <service name="SayHello"provider="java:RPC">
- <parametername="allowedMethods"value="*"/>
- <parametername="className"value="com.ztesoft.axis.ws.HelloImpl"/>
- <!-- 添加handler -->
- <requestFlow>
- <chaintype="beforeChain"/>
- </requestFlow>
- <responseFlow>
- <chaintype="afterChain"/>
- </responseFlow>
- </service>
Handler与Chain只是一种拦截作用,Axis也默认提供了一些拦截的类。例如:有个Handler叫做Authenticate。
利用他可以实现用户权限控制,即调用方法的时候需要提供用户名密码,只有正确的才能调用。利用Handler和
Chain我们也可以做一些日志记录等相关内容,或者报文记录。配置在全局拦截里面,globalConfiguration节点即可。
5、自带调试工具tcpmon
有时候我们想查看我们发送与请求的内容,这个时候我们该怎么做呢?tcpmon也许是一个很不错的选择。tcpmon主要
起到一个拦截的作用,原理如下,本来我们是直接访问8080端口的。使用tcpmon之后,我们访问地址改成8081(可以自
己定义)接着请求的内容被记录下来,然后tcpmon将请求的内容一模一样的转到8080。处理完成之后服务器将处理内容
回给tcpmon,tcpmon记录返回内容。在将处理结果转发给我们。
该工具集成到了axis包中,查找org.apache.axis.utils.tcpmon ,运行这个类的main方法即可看见
点击Add按钮,修改请求地址端口为红色的端口。发起服务调用即可看到下面接受与发送的消息了。
总结:
通过拦截webservice的请求我们发现,webservice采用http的方式传递数据。传输的数据是满足soap规则的xml文档。
由此可以证明 WebService = HTTP + SOAP + WSDL
6、额外注意事项
Axis技术发布服务就暂时写到这里了。如果博文中有什么不对的地方请指出,我会第一时间修订过来。这里只说了如何
发布一个服务,关于调用则会在后续章节详细说明。
7、附录一些最终的配置文件
web.xml配置
- <!DOCTYPE web-app PUBLIC
- "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd" >
- <web-app>
- <servlet>
- <servlet-name>AxisServlet</servlet-name>
- <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>AxisServlet</servlet-name>
- <url-pattern>/services/*</url-pattern>
- </servlet-mapping>
- </web-app>
server-config.wsdd配置文件详细。
- <?xmlversion="1.0"encoding="UTF-8"?>
- <deploymentxmlns="http://xml.apache.org/axis/wsdd/"
- xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
- <globalConfiguration>
- <parametername="sendMultiRefs"value="true"/>
- <parametername="disablePrettyXML"value="true"/>
- <parametername="adminPassword"value="admin"/>
- <parametername="dotNetSoapEncFix"value="true"/>
- <parametername="enableNamespacePrefixOptimization"value="false"/>
- <parametername="sendXMLDeclaration"value="true"/>
- <parametername="attachments.implementation"value="org.apache.axis.attachments.AttachmentsImpl"/>
- <parametername="sendXsiTypes"value="true"/>
- <requestFlow>
- <handlertype="java:org.apache.axis.handlers.JWSHandler">
- <parametername="scope"value="session"/>
- </handler>
- <handlertype="java:org.apache.axis.handlers.JWSHandler">
- <parametername="scope"value="request"/>
- <parametername="extension"value=".jwr"/>
- </handler>
- </requestFlow>
- </globalConfiguration>
- <handlername="URLMapper"type="java:org.apache.axis.handlers.http.URLMapper"/>
- <handlername="LocalResponder"type="java:org.apache.axis.transport.local.LocalResponder"/>
- <handlername="Authenticate"type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
- <transportname="http">
- <requestFlow>
- <handlertype="URLMapper"/>
- <handlertype="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
- </requestFlow>
- <parametername="qs:list"value="org.apache.axis.transport.http.QSListHandler"/>
- <parametername="qs:wsdl"value="org.apache.axis.transport.http.QSWSDLHandler"/>
- <parametername="qs.list"value="org.apache.axis.transport.http.QSListHandler"/>
- <parametername="qs.method"value="org.apache.axis.transport.http.QSMethodHandler"/>
- <parametername="qs:method"value="org.apache.axis.transport.http.QSMethodHandler"/>
- <parametername="qs.wsdl"value="org.apache.axis.transport.http.QSWSDLHandler"/>
- </transport>
- <transportname="local">
- <responseFlow>
- <handlertype="LocalResponder"/>
- </responseFlow>
- </transport>
- <!-- 添加一个自定义的handler -->
- <handlername="beforeHandler"type="java:com.ztesoft.axis.ws.BeforeHandle">
- <!-- 这里还可以设置自定义参数,在类中使用this.getOptions("someParam") 获取参数 -->
- <parametername="someParam"value="好好学习,天天向上"/>
- </handler>
- <handlername="afterHandler"type="java:com.ztesoft.axis.ws.AfterHandler"/>
- <!-- 添加自定义Chain -->
- <chainname="beforeChain">
- <handlertype="java:com.ztesoft.axis.ws.BeforeChain"/>
- </chain>
- <chainname="afterChain">
- <handlertype="java:com.ztesoft.axis.ws.AfterChain"/>
- </chain>
- <servicename="SayHello"provider="java:RPC">
- <parametername="allowedMethods"value="*"/>
- <parametername="className"value="com.ztesoft.axis.ws.HelloImpl"/>
- <namespace>http://www.ztesoft.com/axis/sayHello</namespace>
- <!-- 添加handler或者Chain -->
- <requestFlow>
- <!-- <handler type="beforeHandler"/> -->
- <chaintype="beforeChain"/>
- </requestFlow>
- <responseFlow>
- <!-- <handler type="afterHandler"/> -->
- <chaintype="afterChain"/>
- </responseFlow>
- </service>
- </deployment>
阅读全文
0 0
- 【WebService】第四章、Axis1.4发布WebService
- 【WebService】第四章、Axis1.4发布WebService
- Axis1.4发布WebService
- 【WebService】第六章、Axis1.4发布的webservice如何调用
- myeclipse利用axis1.4发布webservice
- axis1.4 发布webservice的问题
- WebService笔记之即时发布(Axis1.4)
- 使用axis1.4发布WebService简单示例
- Axis1.4 快速入门 发布WebService服务端、生成WebService客户端
- Webservice-----------axis1.4
- WebService笔记之定制发布(wsdd)(Axis1.4)
- Axis1.4调用Cxf发布的webservice服务
- Spring boot 集成Axis1.4 ,使用wsdd文件发布webservice
- Axis1.4开发webservice总结
- axis1.4 WebService架构搭建
- webservice+axis1.4接口开发
- axis1.4开发webservice实例
- Webservice 命令行搭建axis1.4
- noip2017 复习计划
- The best front-end hacking cheatsheets — all in one place.
- 深度学习之损失函数与激活函数的选择
- 布局改变时的过场动画
- 线段树[模板]
- 【WebService】第四章、Axis1.4发布WebService
- java反射机制
- github使用注意点
- latex 字母,字符上面 画斜线
- #BZOJ3700#发展城市(O(1)LCA+分析讨论)
- 腾讯android电话面试一
- 深度学习中的注意力机制
- vue 结合饿了么element-ui
- LintCode 爬楼梯