??xml version="1.0" encoding="utf-8" standalone="yes"?>
首先我们下蝲一?a title="weblogic8.1.3" target="_blank">weblogic8.1.3Qjdk和axis的下载参照Tomcat+axis那片文章里的下蝲安装和设|?/p>
下蝲好后我们安装weblogicQ一直按下一步即?/p>
安装完成后运行Configuration Wizard来新建域配置Q一直按下一步,直到输入UserNameQPassword and DescriptionQ我们这里都讄成weblogicQ,然后在按下一步直到完?/p>
然后我们下载的axis压羃包下的webapp目录下的axis目录拯到C:\bea\user_projects\domains\mydomain\applications下面
׃axis中的一些jar包和weblogic中的有冲H,所以要修改C:\bea\user_projects\domains\mydomain\startWebLogic.cmd文gQ优先用axis的jarQ将其中?br />
set
CLASSPATH=%WEBLOGIC_CLASSPATH%;%POINTBASE_CLASSPATH%;%JAVA_HOME%\jre\lib\rt.jar;%CLASSPATH%;%WL_HOME%\server\lib\webservices.jar
Ҏ(gu)
set
CLASSPATH=%AXISCLASSPATH%;%WEBLOGIC_CLASSPATH%;%POINTBASE_CLASSPATH%;%JAVA_HOME%\jre\lib\rt.jar;%WL_HOME%\server\lib\webservices.jar
?br />
set
CLASSPATH=%CLASSPATH%;%WEBLOGIC_CLASSPATH%;%POINTBASE_CLASSPATH%;%JAVA_HOME%\jre
\lib\rt.jar;%WL_HOME%\server\lib\webservices.jarQ这里必M证将AXISCLASSPATH加入?
CLASSPATH环境变量中)(j)
保存q行q个文g启动weblogic控制収ͼ如下?br />
启动好之后打开ieQ在url中输?a href="http://localhost:7001/console">http://localhost:7001/consoleQ输入用户名和密码进入Weblogic Server Console
点击展开部v节点--点击WEB应用E序模块--然后点击旁边的部|新的新的应用程序模块,?x)出现选择web应用的窗口,如下?br />
选择相应目录下的web应用E序Q我们选择axisQ如下图
点击目标模块按钮Q接着在出现的H口中点击部|即可(q里我发现如果不在环境变量CLASSPATH中设|?AXISCLASSPATH%Ӟ部v报错)(j)完成后如下图
q是我们可以点击试选项中的链接Q也可以在ie中输?a href="http://localhost:7001/axis/">http://localhost:7001/axis/Q如果出C下界面,说明配置成功
q时我们可以按照tomcat+axis那篇文章所说的发布web服务?/p>
遇到的问?br /> weblogic+axis的最大问题是2者间jar包的冲突Q客L(fng)调用web服务时会(x)? NullPointerException错误Q网上都说是axis的saaj.jar和weblogic的webservices.jar冲突Q须? saaj.jar加在webservices.jar前面Q我按网上这么加了也没用Q后来我把整个AXISCLASSPATH都加C最前面Q就如我上面 所说的那样Q嘿Q他好了,我晕俄,|上的h也不知道是怎么成功?/p>
q有一U说法就是在web-inf目录下加weblogic.xmlQ网上的Z没说要加到哪个web-inf下,我想惛_有我的axis目录下有web-inf吧,加他下面了Qweblogic.xml的内容如?br />
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
q?
样也可以解决客户端调用web服务时会(x)报NullPointerException的错误,但是我发现这样做的后果是点击axis的service?
wsdl时出现无法显C页面。所以经q我不断的调试,只有像我前面说的那样修改startWebLogic.cmd中的set
CLASSPATH应该算是最完美的方法了Q配q个东西的时候网上查了好久,都是千篇一律,说得没头没尾Q所以说q是得自己去实践阿(实践是检验真理的
唯一标准?img src="http://blog.hexun.com//CuteSoft_Client/CuteEditor/images/emteeth.gif" onload="var image=new Image();image.src=this.src;if(image.width alt="" />0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" alt="" align="absmiddle" border="0">Q?/p>
注:(x)在部|好的web应用E序的web-inf中加入weblogic.xml需要重新部|web应用E序
修改了startWebLogic.cmd需重新执行startWebLogic.cmdQ以便修改v作用
我在一个干净的winxp sp2,JDK1.4.2.05,weblogic8.1.3的环境下部v了axis1.4Q和同事在家q程调用获得成功
相关E序安装目录
JDK C:\j2sdk1.4.2_05
weblogic C:\bea
axis1.4 C:\axis14Qlib下有一些jar需另外当,老实说我也不知道哪些起了作用Q只是把|上所说得涉及(qing)到的jar都找来了Q嘿嘿)(j)
相关环境变量讄
AXIS_HOME=C:\axis14
AXIS_LIB=%AXIS_HOME%\lib
AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\activation.jar;%AXIS_LIB%\xmlrpc-2.0.jar
JAVA_HOME=C:\j2sdk1.4.2_05
CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%AXISCLASSPATH%;
Path前加?JAVA_HOME%\bin
所需软g
tomcat Q?a >http://tomcat.apache.org/index.html
axis Q?a >http://ws.apache.org/axis/
jdk Q?a >http://java.sun.com/javase/downloads/index.jsp
jaf Q?a >http://java.sun.com/products/javabeans/jaf/downloads/index.html
xmlrpc Q?a >http://ws.apache.org/xmlrpc
XML解析?br />
Xalan Q?a >http://archive.apache.org/dist/xml/xalan-j/
Xerces Q?a >http://xml.apache.org/dist/xerces-j/
本例讲解axis定制发布
本实例采?br /> j2sdk1.4.2_05Qtomcat5.0.28Qaxis1.4Qjbuilder X / Eclipse3.2
首先axis解压至相应目录,如d:\下,安装tomcat至c:\tomcat5Q安装jdk至c:\ j2sdk1.4.2_05
然后d:\axis\webapp目录下的axis目录copy至c:\tomcat5\webapps目录?
讄a(chn)xis的环境变?/strong>
AXIS_HOME=d:\axis
AXIS_LIB=%AXIS_HOME%\lib
AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\activation.jar;%AXIS_LIB%\xmlrpc-2.0.jar
Qxml-apis.jar, xercesImpl.jar属于Xerces或Xalan, activation.jar属于jaf, xmlrpc-2.0.jar属于xmlrpcQ?/p>
1Q?配置完成后启动tomcatQ在览器中键入http://localhost:8080/axisQ将昄如下画面
2Q在C:\Tomcat5\webapps\axis\WEB-INF目录下徏立一个src目录Q用于存放源E序
接着~写服务端程序server.AxisReturn
package server;
public class AxisReturn {
public String ReturnMsg(String servicesName) {
return "Axis Return: "+ servicesName;
}
}
?/span>?
此我们利用了Jbuilder X作ؓ(f)我们javaE序的开发工P利用Jbuilder新徏工程中的Project for Existing
CodeC:\Tomcat5\webapps\axis\WEB-INF下的E序?qing)目录导入作为Jbuilder的一个工E来操作
~译AxisReturnE序QJbuilder会(x)把编译后的class文g自存攑֜C:\Tomcat5\webapps\axis\WEB-INF\classes\server目录?br />
3Q编写wsdd文gQ此处命名ؓ(f)deploy.wsddQ其内容?/strong>
<deployment xmlns=http://xml.apache.org/axis/wsdd/
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="AxisReturn" provider="java:RPC">
<parameter name="className" value="server.AxisReturn"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
?/span>每个service׃表服务端的一个程序,如有多个可l添加serviceQ相兛_数请查阅axis文档
?/span>此处的deployment代表发布服务Q如改ؓ(f)undeployment则ؓ(f)撤销服务
4Q发布服?br />
打开windows的命令窗口,转到wsdd文g的存攄录下Q此处ؓ(f)C:\Tomcat5\webapps\axis\WEB-INF\src\server
在命令窗口中键入
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
如果成功显C?lt;Admin>Done processing</Admin>
?/span>如失败,则检查AXISCLASSPATH是否讄正确Qtomcat端口是否为默认的8080
?/span>在这里有一个问题需注意Q不是在axis目录下还是其他虚拟目录下Q如直接执行q条命o(h)Q都在axis的目录下发布serviceQ如果想发布在其他的目录下,如pscsaxisQ则应执?br />
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/pscsaxis/services/AdminService deploy.wsdd
-cp表示在AXISCLASSPATH环境变量中检索org.apache.axis.client.AdminClientҎ(gu)
5Q生成client stub文g
?/span>在命令窗口中目录{至C:\Tomcat5\webapps\axis\WEB-INF\classes
然后执行
java
-cp %AXISCLASSPATH% org.apache.axis.wsdl.Java2WSDL -oAxisReturn.wsdl
-lhttp://localhost:8080/axis/services/AxisReturn -nAxisReturn
server.AxisReturn
会(x)在C:\Tomcat5\webapps\pscsaxis\WEB-INF\classes下生成AxisReturn.wsdl文g
接着在执?br />
java -cp %AXISCLASSPATH% org.apache.axis.wsdl.WSDL2Java AxisReturn.wsdl -p client
会(x)在C:\Tomcat5\webapps\axis\WEB-INF\classes\client目录下生成四个java文g
AxisReturn_PortType.java
AxisReturnService.java
AxisReturnServiceLocator.java
AxisReturnSoapBindingStub.java
这四个文g剪切至C:\Tomcat5\webapps\pscsaxis\WEB-INF\src\client目录下,q编?
6Q编写客L(fng)
利用生成client stub文g~写
package client;
public class ClientAxisReturn {
public static void main(String args[]) {
try {
AxisReturnService service = new client.AxisReturnServiceLocator();
client.AxisReturn_PortType client = service.getAxisReturn();
String retValue = client.returnMsg("BaoSteel");
System.out.println(retValue);
}
catch (Exception e) {
System.err.println("Execution failed. Exception: " + e);
}
}
}
~写完后Q编译运行即可得到返回结?br />
?/span>如需传入多个参数Q需在String retValue = client.returnMsg("BaoSteel");q句中增加参敎ͼ?br />
String retValue = client.returnMsg("BaoSteel","PSCS_IMS");
?/span>相应的服务端也要更改Q如
package server;
public class AxisReturn {
public String ReturnMsg(String servicesNameQString serviceID) {
return "Axis Return: "+ servicesName+ serviceID;
}
}
利用发布服务的wsdl的URL~写
package client;
import org.apache.axis.AxisFault;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.encoding.XMLType;
public class ClientAxisReturnWsdl {
public static void main(String args[]) throws Exception{
String endPoint =
http://190.2.63.239:8080/pscsaxis/services/AxisReturn?wsdl;
Service service = new Service();
Call call = (Call) service.createCall();
Object result;
try {
call.setTargetEndpointAddress(new java.net.URL(endPoint));
call.setOperationName("ReturnMsg");
call.addParameter("OP1", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);
result = (Object) call.invoke(new Object[] {"BaoSteel"});
}
catch (AxisFault fault) {
result = "Error is: " + fault.toString();
}
System.out.println(result);
}
}
~写完后Q编译运行即可得到返回结?br />
?/span>如许增加参数Q则需d语句
call.addParameter("OP1", XMLType.XSD_STRING, ParameterMode.IN);
参数名OP1改ؓ(f)其他Q如OP2
在result = (Object) call.invoke(new Object[] {" BaoSteel "});q句中增加参敎ͼ?br />
result = (Object) call.invoke(new Object[] {" BaoSteel "," PSCS_IMS "});
?/span>相应的服务端也要更改Q如
package server;
public class AxisReturn {
public String ReturnMsg(String servicesNameQString serviceID) {
return "Axis Return: "+ servicesName+ serviceID;
}
}
★在q里Q我们的服务端只有一个方法供我们调用Q如果我们需要调用多个服务端的方法,则可在服务端中加入其他方法,如我们在增加一个xxMsg
package server;
public class AxisReturn {
public String ReturnMsg(String servicesName,String systemID) {
return "Axis Return: "+ str+servicesName+systemID;
}
public String xxMsg(String serviceName,String systemID) {
return "XX Return: "+ str+serviceName+systemID;
}
}
★修改完后将其编译,q将其注销后重新发布,反之需要重起tomcatQ否则服务将不被更新
★利用生成client stub文g~写的客L(fng)E序Q还需重新生成client stub文gQƈ其~译Q在客户端程序中调用其相应得Ҏ(gu)卛_
SOAPMonitor的配|?/strong>
?
布了Web服务以后Q如何观察请求和响应数据呢?记录q行日志是一U传l且有效的方法,但对于调试程序来讲还不够方便和直观。值得ƣ慰的是QAxis为我
们提供了在客L(fng)观察SOAPh和响应流数据的工具SoapMonitorQ经q适当配置后,可以实时地观察到Web服务的SOAPh和响应数据?
SoapMonitor是一个Java AppletE序Q通过览器下载到客户端运行。下面就介绍SoapMonitor的配|和使用Ҏ(gu)?br />
在C:\Tomcat5\webapps\axis的目录下有一个SOAPMonitorApplet.java的程序,axis默认没有l我们编译,我们需要自p行编?br />
打开windows命o(h)H口Q{到C:\Tomcat5\webapps\axis目录下,执行
javac -classpath %AXIS_HOME%\lib\axis.jar SOAPMonitorApplet.java
~译完成后需要发布服务,我们需要徏立一个wsdd文gdeploy-monitor.wsddQ内容如?br />
<deployment xmlns=http://xml.apache.org/axis/wsdd/
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<handler name="soapmonitor"
type="java:org.apache.axis.handlers.SOAPMonitorHandler">
<parameter name="wsdlURL" value="/axis/SOAPMonitorService-impl.wsdl"/>
<parameter name="namespace" value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
<parameter name="serviceName" value="SOAPMonitorService"/>
<parameter name="portName" value="Demo"/>
</handler>
<service name="SOAPMonitorService" provider="java:RPC">
<parameter name="allowedMethods" value="publishMessage"/>
<parameter name="className" value="org.apache.axis.monitor.SOAPMonitorService"/>
<parameter name="scope" value="Application"/>
</service>
</deployment>
?/span>需要注意的是红色的那句语句Q如果是在我们自qweb应用目录下的话需Ҏ(gu)自己的目录?br /> 建立完成后执行命令进行发?br /> java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/AdminService deploy-monitor.wsdd
发布SOAPMonitor服务后,q要对被监测的Web服务q行配置。方法是先注销该Web服务Q然后修改该服务对应的WSDD文gQ在其中增加h和响应的配置Q否则是观测不到SOAPh和响应流的。以我们上面的程序ؓ(f)例,deploy.wsdd修改?/p>
<deployment xmlns=http://xml.apache.org/axis/wsdd/
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="AxisReturn" provider="java:RPC">
<requestFlow>
<handler type="soapmonitor"/>
</requestFlow>
<responseFlow>
<handler type="soapmonitor"/>
</responseFlow>
<parameter name="className" value="server.AxisReturn"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
增加?br />
<requestFlow>
<handler type="soapmonitor"/>
</requestFlow>
<responseFlow>
<handler type="soapmonitor"/>
</responseFlow>
q两D?
然后我们通过点击http://localhost:8080/axis/主页上的SOAPMonitor或直接访?a href="http://localhost:8080/axis/SOAPMonitor">http://localhost:8080/axis/SOAPMonitorQ点击start或stop启动或停止监控,然后我们q行客户端程序,SOAPMonitor?x)监控到h和响应流Q如下图
?/span>? q里Q我们需要注意一个配|问题,如果tomcat下有多个axis应用Q设|了多个SOAPmonitorQ我们则需要更改SOAPmonitor的端 口(axis默认配置的是5001Q,否则?x)生冲H,q行SOAPmonitor时会(x)无法启动Q提Cthe soap monitor is unable to communcate with the serverQ解x法如下:(x)
打开C:\Tomcat5\webapps\axis\WEB-INF目录下的web.xmlQ找?br />
<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>
q段Q将其中?001Ҏ(gu)5002Q依此类?br />
ȝQ?/strong>
量发布websrrvice的文件夹和axis分开攄
建立多个axis应用Ӟ应注意一些端口的讄Q命令的参数讄以及(qing)一些命令执行的路径讄{,否则?x)生一些错误,如ClassNotFoundQservice发布错误{的错误
server-config.wsdd
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns:java="
xmlns:handler="
xmlns="
xmlns:xsi="
name="defaultClientConfig" xsi:type="deployment">
<globalConfiguration>
<parameter name="disablePrettyXML" value="true"/>
<parameter name="dotNetSoapEncFix" value="true"/>
<parameter name="enableNamespacePrefixOptimization" value="false"/>
<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="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
<handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>