发一下牢骚和主题无关:
基于Axis2和Tomcat的主动化可配置Web Service开辟
目录
1. Simple Service Properties.6
1. simpleService.properties.10
一、背景介绍
为了加快Tomcat环境下基于Axis2引擎的WebService开辟,将开辟Web Service的处置如参数解析,方法调用和结果返回进行了封装,生成一个Axis2Service.jar包,实现了Web Service的输入,处置和输出的可配置,简化了WebService的开辟工作,并应用Axis2的hotupdate和hotdeploy功能,直接从WebService的properties或XML配置文件生成WebService代码,主动编译成class发布,简化了WebService的开辟,并可部署相应的URL转换Servlet,缩短了WebService的调用URL。
二、主动创立流程
1. Web Service Request
用户或系统Server发出Web Service Request请求,包括Request URL以及相应的参数
例如http://10.139.8.167:8080/TestService/beeCommission?
strXMLParameter=<?xml version='1.0' encoding= 'UTF-8'?><requestversion='1.0'><beeCommissionCommand><Parameters><sessionID>112843584</sessionID><startDate>20130101</startDate><endDate></endDate></Parameters></beeCommissionCommand></request>
这是XML格式的RequestParameter;
http://10.139.8.167:8080/TestService/javaMethod?userId=leoliao&orderTime=20130326111259
这是String格式的RequestParameter
2. Web Service名称取得
从服务器上响应上述URL的Servlet收到的的Request URI中取得Web Service的名称。例如上述Web Service Request中,取得Service Name为:TestService
3. Web Service代码生成
Web Service的配置文件分为两种:
一种是XML文件,是全配置的Web Service,输入,执行操作和输出都可配置;
另一种是properties文件,是简单配置Web Service,直接将Web Service Mapping到指定的java方法。
根据Tomcat路径下conf目录中WSConfigure活页夹中所有的web serviceconfigure XML文件及properties文件,依次加载每一个XML文件到WebService对象,加载每一个properties文件到SimpleWebService对象,并生成相应的public java 方法,加上import的Axis2Service jar包中的语句,组成Web Service的java文件,放在Axis2缺省发布class文件作为web service的目录下。
每个Web Service配置文件都市有Debug的开关,如果所有的Web Service的配置文件中的Debug都是关闭的,则Web Service的主动生成和编译就不会运行。(Web Service Debug实现,正式发布后,应该把所有配置文件中的Debug都关掉。)
例如,上述例子中,读取Web Service XMLconfigure文件的路径为:E:\java\Tomcat7022\conf\WSConfigure
生成的Web Service代码文件为TestService.java,存放路径为:
E:\java\Tomcat7022\webapps\axis2\WEB-INF\pojo
4. Web Service代码编译
调用Java 的runtime,执行javac,编译生成的Web Service java代码,生成class文件,被主动发布为Web Service,java代码里面的每一个大众方法,都将发布成一个Web Service方法。
5. Web Service调用
转换短的Web Service调用URL,并处置所有参数,生成新的Web Service URL然后把调用Redirect到新的Web Service URL,实现Web Service调用。
例如:
http://10.139.8.167:8080/TestService/javaMethod?userId=leoliao&orderTime=20130326111259
将被转换为:
http://10.139.8.167:8080/axis2/services/TestService/javaMethod?userId=leoliao&orderTime=20130326111259
三、开辟准备
— Install JDK set System VariableJAVA_HOME
— Install Tomcat apache-tomcat-7.0.22.exe (Tomcat7.exe)
安装完毕后,在IE中输入http://localhost:8080应能看到如下Tomcat的启动界面
如果没法看到此界面,说明Tomcat安装不胜利,请检查相干配置及安装文件并重新安装直至胜利。
— Downloadaxis2-1.6.1-bin.zip,unzip,set System variable AXIS2_HOME
— Download axis2.war,copy toTomcat7 webapps
Tomcat会主动解压axis2.war,在webapps目录中生成一个axis2的活页夹,所有axis2 Web Service引擎的应用文件都在这个目录下。
Axis2安装完毕,在IE中输入http://localhost:8080/axis应能看到如下Axis2的主界面:
如果看不到这个界面,说明Axis2安装不胜利,请检查相干设置,确保Axis2安装胜利。
— 取得Axis2Service.jar包,放入tomcat的lib目录中。
— 在tomcat的conf目录下的web.xml,增加TestService(要开辟的WebService的名称)的servlet注册:
<servlet>
<servlet-name>TestService</servlet-name>
<servlet-class>com.foxconn.cmmsg.itss.URLTransfer</servlet-class>
</servlet>
并mapping到对所有以TestService开始的URL,也就是TestService所包含的所有API拜访路径,都市由这个Servlet来处置:
<servlet-mapping>
<servlet-name>TestService</servlet-name>
<url-pattern>/TestService/*</url-pattern>
</servlet-mapping>
— 应用Axis2用最简单的缺省POJO方式发布Web Service,防止打包成aar文件再发布的繁琐步骤:
直接把编译好的TestService.class文件放到axis2\WEB-INF\pojo目录中
如果没有pojo目录,则建立该目录;
如果须要应用其他目录名称,请修改axis2\WEB-INF\conf\axis2.xml中:
<deployer extension=".class"directory="pojo"class="org.apache.axis2.deployment.POJODeployer"/>
缺省的pojo为其他的目录名。
— 修改axis2\WEB-INF\conf\axis2.xml中:
<parametername="hotdeployment">true</parameter>
启用热发布功能,Tomcat不须要重新启动就能够主动发布Web Service。
— 修改axis2\WEB-INF\conf\axis2.xml中:
<parameter name="hotupdate">true </parameter>
启用热更新功能,Tomcat不须要重新启动就能够更新已发布胜利的Web Service。
四、Web Service配置文件
应用Axis2Servic.jar包所包含的框架进行Web Service的开辟,最重要的工作就是配置Web Service的XML或properties configure文件。这些configure文件缺省路径在Tomcat的conf目录下的WSConfigure文件夹:
1.Simple Service Properties
Web Service的Properties configure配置文件比较简单:
例如simpleService.properties内容如下:
sevice.version =1.0 service版本
service.ame=simpleService service名称
service.debug=true 是不是打开debug
service.datasource=hiverService 数据源JNDI名称
service.classfolder=WSClass 加载类文件的活页夹
Mapping2JavaMethod=ServiceImpl.simpleService service mapping到的java类和公然静态方法名称
Parameters=para1,para2,para3 service的参数列表
Web Service的XMLconfigure配置文件重要分四部分,依次介绍如下:
2. Service Header
<?xml version="1.0" encoding="UTF-8"?>
<service name="JavaMethod" tag="JavaMethod"version="1.0"
debug="true"datasource="hiver" classfolder="WSClass">
<errormessageList>
<errormessage>Success.</errormessage>
<errormessage>Your accountis locked.</errormessage>
<errormessage>Fail to pairyour account.</errormessage>
<errormessage>API version isincorrect.</errormessage>
</errormessageList>
这里定义了WebService方法的名称,表现的Tag,API版本,是不是打开debug,应用的数据源以及如果应用Java方法,引用的javaclass的活页夹。
errormessageList部分可以有一条或多条,是针对此web service定义的error message,次序位置为对应的errorcode。
每个Web Service方法都必须有。
3.RequestParameters
<requestParameters format="String">
<requestParameter>
<name>userId</name>
<tag>userId</tag><!--tag-->
<type>text</type><!--type-->
<required>Yes</required><!--isRequired-->
<mapping>_userid</mapping><!--mappingto field -->
</requestParameter>
….
这里定义了Web Service方法RequestParameter的格式,可以有XML,JSON及STRING(通过URL QueryString)三种格式;随后是各个RequestParameter的具体定义,可以有0到多个RequestParameter。
RequestParameter定义中:
name为parameter的名字,
tag为parameter在XML,JSON及URL中输入时的tag,平日和name保持一致,
type为parameter的类型,可所以text或numeric,double,float,integer,int或digital,
required为parameter是不是必须,如果为1,y,t,yes或true,则此parameter不准为空,
mapping为parameter作为下一步ServiceOperation输入参数时的参数名称。
4. ServiceOperations
<serviceOperations name="{call sp_checkSession(?,?,?) }"
format="sp">
<operationParameter>
<name>_userid</name>
<mode>IN</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>userId</mapping>
</operationParameter>
这里定义了Web Service方法要进行的ServiceOperation,格式可所以SP,name就是调用SP的语句,包括sp名称;或者java,则name就是要执行的java方法的包名及类名;如果此java方法有参数,则name以@@开头。
上面ServiceOperations的各个operationParameter定义。可以有0到多个参数:
name为parameter的名字,
mode为parameter的模式,IN,OUT或INOUT
type为parameter的类型,因为此类型可能要对应到数据库参数类型,所以有CHAR,VARCHAR,FLOAT,DOUBLE,INTEGER,BIGINT,JAVA方法,可以都填VARCHAR
preprocess为parameter的预处置,目前有以下几种:
trim,
tolowercase,
touppercase,
md5,
sha1或sha-1,
base64,
decode(base64 decode),
uuid(随机UUID字符串,value为长度,如果value为空,缺省长度为16),
hex(随机16进制字符串,value为长度,如果value为空,缺省长度为16),
random(随机字符串,value为长度,如果value为空,缺省长度为16),
ip,
format(?),其中?为一整数,对value取证到?位,
hex(?),其中?为一整数,对value转换到16进制?位。
mapping为parameter mapping到Request Parameter的名字,此parameter会取相应的RequestParamter的值;
如果mapping字符串包含.,则为mapping到java方法取值,如果mapping字符串中不包含(…),则为Java方法无参调用;否则,为有参java方法调用,mapping字符串中方法名后括号中的字符串为参数列表,多个参数以@@分隔,参数名 mapping到RequestParamter取值。
5.ResponseOutput
<responseOutput format="xml">
<outputParameter>
<name>Success</name>
<tag>Success</tag>
<mapping>NULL</mapping>
</outputParameter>
这里定义的是Web Service方法返回的格式,有XML,JSON和STRING,以及参数,可以有1到多个参数,其中参数name为errorcode的若值为0,表示胜利,其余值表示失败:
Outputparameter定义中:
name 为parameter名,
tag为parameter表现在XML,JSON或String中的tag,平日和name保持一致,多级tag旁边加.,例如<output><time>这类tag,应设定为output.time,
mapping为parametermapping到ServiceParameter或RequestParameter的名字,
如果mapping字符串为不含.则为参数取值,NULL表示空值,其余表示mapping到Service Parameter或Request Parameter取值;
若mapping字符串包含.,则为mapping到java方法取值,如果mapping字符串中不包含(…),则为Java方法无参调用;否则,为有参java方法调用,mapping字符串中方法名后括号中的字符串为参数列表,多个参数以@@分隔,参数名 mapping到RequestParamter或ServiceParameter取值。
五、Service代码开辟
由于web service的代码已根据配置文件主动生成了,所以这里的代码开辟现实上指的是为了实现web service的特定功能,须要通过反射机制调用的一些java方法的实现。
例如,<serviceOperationsname="ServiceImpl.SampleService@@"
format="java">
此处定义Web Service的serviceOperationsformat为java,那么我们就须要实现其name中指定的class及方法,如本例中,要实现ServiceImpl class中的SampleService方法。具体方法及参数定义可见后面Web Service XML Configure文件的解释。
再比如:<outputParameter>
<name>sellCountList</name>
<tag>NULL</tag>
<mapping>ServiceImpl.getBeeSellCountList</mapping>
</outputParameter>
此处定义此输出参数mapping到ServiceImpl类中的getBeeSellCountList方法,那么我们就须要实现ServiceImpl class中的getBeeSellCountList方法。具体方法及参数定义可见后面Web Service XML Configure文件的解释。
要注意的是,定义在指定class中的方法都必须是静态方法,而且参数次序要和Web Service XML configure中定义一致。同一个class中的方法名及调用参数必须唯一。这些class文件的缺省路径在E:\java\Tomcat7022\conf\WSClass,也可以在web service的configure文件中指定为conf目录下不同的活页夹作为class folder。
六、Web Service开辟实例
此处给出一个simpleService的properties文文件实例和三个现实的Web Service的XML configure 文件的实例。
1. simpleService.properties
sevice.version=1.0
service.name=simpleService
service.debug=true
service.datasource=hiverService
service.classfolder=WSClass
Mapping2JavaMethod= ServiceImpl.simpleService
Parameters=para1,para2,para3
2. login.xml
<?xml version="1.0" encoding="UTF-8"?>
<service name="login" tag="loginCommand"version="1.0" debug="true" datasource="hiver"classfolder="WSClass">
<errormessageList>
<errormessage>Your account is locked.</errormessage>
<errormessage>Fail to pair your account.</errormessage>
<errormessage>API version is incorrect.</errormessage>
</errormessageList>
<!--request parameter -->
<requestParametersformat="xml">
<requestParameter>
<name>name</name>
<tag>name</tag><!--tag-->
<type>text</type><!--type-->
<required>Yes</required><!--isRequired-->
<mapping>myaccount</mapping><!--mappingto field -->
</requestParameter>
<requestParameter>
<name>password</name>
<tag>password</tag>
<type>text</type>
<required>Yes</required>
<mapping>psw</mapping>
</requestParameter>
</requestParameters>
<serviceOperations name="{callsp_login(?,?,?,?,?,?,?,?,?,?,?) }"
format="sp">
<operationParameter>
<name>myaccount</name>
<mode>IN</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>name</mapping>
</operationParameter>
<operationParameter>
<name>psw</name>
<mode>IN</mode>
<type>varchar</type>
<preprocess>md5</preprocess>
<mapping>password</mapping>
</operationParameter>
<operationParameter>
<name>mysessionid</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>mysessionid</mapping>
</operationParameter>
<operationParameter>
<name>myaccountname</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>Name</mapping>
</operationParameter>
<operationParameter>
<name>myemail</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>email</mapping>
</operationParameter>
<operationParameter>
<name>myphone</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>phone</mapping>
</operationParameter>
<operationParameter>
<name>myareas</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>areas</mapping>
</operationParameter>
<operationParameter>
<name>myWMD</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>wmd</mapping>
</operationParameter>
<operationParameter>
<name>myjoindate</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>joindate</mapping>
</operationParameter>
<operationParameter>
<name>myGender</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>Gender</mapping>
</operationParameter>
<operationParameter>
<name>errorcode</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>errorcode</mapping>
</operationParameter>
</serviceOperations>
<responseOutputformat="xml">
<outputParameter>
<name>sessionID</name>
<tag>sessionID</tag>
<mapping>mysessionid</mapping>
</outputParameter>
<outputParameter>
<name>userInfo</name>
<tag>NULL</tag>
<mapping>com.hiver.service.nda.ServiceUtility.getUserInfo(myaccountname@@myemail@@myphone@@myareas@@myWMD@@myjoindate@@myGender)</mapping>
</outputParameter>
</responseOutput>
</service>
3.beeCommission.xml
<?xml version="1.0" encoding="UTF-8"?>
<service name="beeCommssion"tag="beeCommssionCommand" version="1.0" debug="true"datasource="hiver" classfolder="WSClass">
<errormessageList>
<errormessage>Your account is locked.</errormessage>
<errormessage>Fail to pair your account.</errormessage>
<errormessage>API version is incorrect.</errormessage>
</errormessageList>
<!--request parameter -->
<requestParameters format="xml">
<requestParameter>
<name>SessionID</name>
<tag>sessionID</tag><!--tag-->
<type>text</type><!--type-->
<required>Yes</required><!--isRequired-->
<mapping>_sessionid</mapping><!--mappingto field -->
</requestParameter>
<requestParameter>
<name>StartDate</name>
<tag>startDate</tag><!--tag-->
<type>text</type><!--type-->
<required>Yes</required><!--isRequired-->
<mapping>StartDate</mapping><!--mappingto field -->
</requestParameter>
<requestParameter>
<name>EndDate</name>
<tag>endDate</tag><!--tag-->
<type>text</type><!--type-->
<required>Yes</required><!--isRequired-->
<mapping>EndDate</mapping><!--mappingto field -->
</requestParameter>
</requestParameters>
<serviceOperations name="{call sp_checkSession(?,?,?) }"
format="sp">
<operationParameter>
<name>_sessionid</name>
<mode>IN</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>SessionID</mapping>
</operationParameter>
<operationParameter>
<name>beeid</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>beeid</mapping>
</operationParameter>
<operationParameter>
<name>errorcode</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>errorcode</mapping>
</operationParameter>
</serviceOperations>
<responseOutput format="xml">
<outputParameter>
<name>beeCommission</name>
<tag>NULL</tag>
<mapping>ServiceImpl.getBeeCommission(beeid@@StartDate@@EndDate)</mapping>
</outputParameter>
</responseOutput>
</service>
4. javaMethod.xml
<?xml version="1.0"encoding="UTF-8"?>
<servicename="JavaMethod" tag="JavaMethod" version="1.0"
debug="true"datasource="hiver" classfolder="WSClass">
<errormessageList>
<errormessage>Your account islocked.</errormessage>
<errormessage>Fail to pair youraccount.</errormessage>
<errormessage>API version isincorrect.</errormessage>
</errormessageList>
<!--request parameter -->
<requestParametersformat="String">
<requestParameter>
<name>userId</name>
<tag>userId</tag><!--tag -->
<type>text</type><!--type -->
<required>Yes</required><!--isRequired -->
<mapping>_userid</mapping><!--mapping to field -->
</requestParameter>
<requestParameter>
<name>orderTime</name>
<tag>orderTime</tag>
<type>text</type>
<required>Yes</required>
<mapping>_ordertime</mapping>
</requestParameter>
</requestParameters>
<serviceOperationsname="ServiceImpl.SampleService@@"
format="java">
<operationParameter>
<name>_userid</name>
<mode>IN</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>userId</mapping>
</operationParameter>
<operationParameter>
<name>_ordertime</name>
<mode>IN</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>orderTime</mapping>
</operationParameter>
<operationParameter>
<name>errorcode</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>errorcode</mapping>
</operationParameter>
<operationParameter>
<name>JavaReturn</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>_userid</mapping>
</operationParameter>
<operationParameter>
<name>JavaTime</name>
<mode>OUT</mode>
<type>varchar</type>
<preprocess>trim</preprocess>
<mapping>_ordertime</mapping>
</operationParameter>
</serviceOperations>
<responseOutputformat="xml">
<outputParameter>
<name>Success</name>
<tag>Success</tag>
<mapping>NULL</mapping>
</outputParameter>
<outputParameter>
<name>Return</name>
<tag>Out.Return</tag>
<mapping>JavaReturn</mapping>
</outputParameter>
<outputParameter>
<name>Time</name>
<tag>Out.Time</tag>
<mapping>JavaTime</mapping>
</outputParameter>
</responseOutput>
</service>
七、注意事项
1. 数据源加载失败的话,会缺省加载tomcat conf目录下的jdbc_ws.properties
2. 定义在Web Service properties中作为Service mapping及XML配置文件中作为parameter mapping的Java方法,必须是public和static,返回字符串;
3. 定义在XML配置文件中作为Service Operation mapping的java方法,七返回类型为List<String>,其值依次为各个Service Operation输出参数的取值。
4. Tomcat conf目录下WSConfigure活页夹中的所有properties和xml文件,都市被当做service配置文件而加载,只要其中有一个Debug为true,整个Service就会重新生成,编译和主动部署发布。当系统正式运行后,可以把所有的service中的Debug配置的改为false,以进步Web Service的拜访效率。
全部代码及测试工程可到我的资源中下载。
文章结束给大家分享下程序员的一些笑话语录:
关于编程语言
如果 C++是一把锤子的话,那么编程就会变成大手指头。
如果你找了一百万只猴子来敲打一百万个键盘,那么会有一只猴子会敲出一 段 Java 程序,而其余的只会敲出 Perl 程序。
一阵急促的敲门声,“谁啊!”,过了 5 分钟,门外传来“Java”。
如果说 Java 很不错是因为它可以运行在所有的操作系统上,那么就可以说 肛交很不错,因为其可以使用于所有的性别上。