概述
参考资料:
http://blog.csdn.net/apei830/article/details/5448897
axis2的官网
http://axis.apache.org/axis2/java/core/docs/pojoguide.html
1、先来构建web端,搭建服务平台
a、从这 http://axis.apache.org/axis2/java/core/download.cgi 下载 axis2-1.6.2-war.zip
然后将里面的 axis2-web文件夹复制到你新建的java web的WerRoot下面
将axis2WEB-INFlib包里面的jar复制到你的lib下
b、然后配置你的web.xml文件 加上AxisServlet配置 并且修改你项目的首页
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <welcome-file-list>
- <welcome-file>/axis2-web/index.jsp</welcome-file>
- </welcome-file-list>
- <servlet>
- <servlet-name>AxisServlet</servlet-name>
- <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>AxisServlet</servlet-name>
- <url-pattern>/services/*</url-pattern>
- </servlet-mapping>
- </web-app>
c、构建你对外发布的服务 这里测试用的 如下 包含对外两个方法
一个输入文本 返回文本
一个上传二进制文件 返回布尔值
- package com.undergrowth.ws.test;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import javax.activation.DataHandler;
- public class WSTest {
- public String sayHello(String name){
- return name+"tHello Worldt"+"WebServices Axis2";
- }
- public boolean uploadWithDataHandle(DataHandler dHandler,String fileName){
- FileOutputStream fos=null;
- try {
- File file=new File("d:/upload_res/");
- if(!file.exists()) file.mkdir();
- fos=new FileOutputStream(new File(file,fileName));
- writeFileToOutput(fos,dHandler.getInputStream());
- System.out.println("上传成功!");
- fos.close();
- } catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- return false;
- }finally{
- if(fos!=null){
- try {
- fos.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- return true;
- }
- private void writeFileToOutput(FileOutputStream fos, InputStream inputStream) throws IOException {
- // TODO Auto-generated method stub
- int n=0;
- byte[] data=new byte[1024*8];
- while((n=inputStream.read(data))!=-1){
- fos.write(data,0,n);
- }
- }
- }
d、向AXIS2的框架描述你要提供的服务 即services.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <serviceGroup>
- <service name=""sayHello"">
- <description>Web Service例子</description>
- <parameter name="ServiceClass">com.SayHello</parameter>
- <messageReceivers>
- <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
- </messageReceivers>
- </service>
- </serviceGroup>
<service name=""sayHello""> 即是服务地址中 http://localhost:7001/Axis2Test/services/sayHello?wsdl 的名字
<parameter name="ServiceClass">com.SayHello</parameter> 即是SayHello类在src下的路径
对于services.xml文件的位置 只用放在你项目的web-inf下面即可 当然还有很多种放置方式
对于services.xml的文件位置 我查看了AsixServlet源码 有如下这么一段 关于services.xml的放置位置的
当然中间经过很多转换 最终是在 WarBasedAxisConfigurator类下有这么一个方法
- public void loadServices() {
- String repository = config.getInitParameter("axis2.repository.path");
- if (repository != null) {
- super.loadServices();
- log.debug((new StringBuilder()).append(
- "loaded services from path: ").append(repository)
- .toString());
- return;
- }
- String repository = config.getInitParameter("axis2.repository.url");
- if (repository != null) {
- loadServicesFromUrl(new URL(repository));
- log.debug((new StringBuilder())
- .append("loaded services from URL: ").append(repository)
- .toString());
- return;
- }
- loadServicesFromWebInf();
- if (config.getServletContext().getRealPath("") != null
- || config.getServletContext().getRealPath("/") != null) {
- super.loadServices();
- log.debug("loaded services from webapp");
- return;
- }
- try {
- URL url = config.getServletContext().getResource("/WEB-INF/");
- if (url != null) {
- loadServicesFromUrl(url);
- log.debug("loaded services from /WEB-INF/ folder (URL)");
- }
- } catch (MalformedURLException e) {
- log.info(e.getMessage());
- }
- return;
- }
接下来有一个方法
- private void loadServicesFromWebInf() {
- try {
- InputStream servicexml = config.getServletContext()
- .getResourceAsStream("/WEB-INF/services.xml");
- if (servicexml != null) {
- HashMap wsdlServices = new HashMap();
- ArchiveReader archiveReader = new ArchiveReader();
- String path = config.getServletContext()
- .getRealPath("/WEB-INF");
- if (path != null)
- archiveReader.processFilesInFolder(new File(path),
- wsdlServices);
- org.apache.axis2.description.AxisServiceGroup serviceGroup = DeploymentEngine
- .buildServiceGroup(servicexml, Thread.currentThread()
- .getContextClassLoader(), "annonServiceGroup",
- configContext, archiveReader, wsdlServices);
- axisConfig.addServiceGroup(serviceGroup);
- }
- } catch (AxisFault axisFault) {
- log.info(axisFault);
- } catch (FileNotFoundException e) {
- log.info(e);
- } catch (XMLStreamException e) {
- log.info(e);
- }
- }
看上面那个方法 就是从web-inf下面获取services.xml文件啊 然后调用
- axisConfig.addServiceGroup(serviceGroup);
添加axisConfig.addServiceGroup 添加ajaxService
附 目录结构如下:
e、经过上面几步 发布项目 测试
http://localhost:7001/Axis2Test/
http://localhost:7001/Axis2Test/services/sayHello?wsdl
2、构建客户端 客户端也有很多中方式 这里采用 RPCServiceClient 进行调用
调用HelloWorld
- package com.undergrowth.webservices;
- import javax.xml.namespace.QName;
- import org.apache.axis2.AxisFault;
- import org.apache.axis2.addressing.EndpointReference;
- import org.apache.axis2.rpc.client.RPCServiceClient;
- public class RPCClientHelloWorld {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- //1.创建webServices客户端
- RPCServiceClient rpClient=new RPCServiceClient();
- rpClient.getOptions().setTo(new EndpointReference("http://localhost:8888/Axis2Web/services/WSTest"));
- //2.设置调用参数
- QName opEntryQNama=new QName("http://test.ws.undergrowth.com","sayHello");
- //输入参数
- Object[] opEntryArgs=new Object[]{"google"};
- //返回参数
- Class[] returnClassArgs=new Class[]{String.class};
- //3,进行调用
- System.out.println(rpClient.invokeBlocking(opEntryQNama, opEntryArgs, returnClassArgs)[0]);
- } catch (AxisFault e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
调用文件上传
- package com.undergrowth.webservices;
- import javax.activation.DataHandler;
- import javax.activation.FileDataSource;
- import javax.xml.namespace.QName;
- import org.apache.axis2.AxisFault;
- import org.apache.axis2.addressing.EndpointReference;
- import org.apache.axis2.rpc.client.RPCServiceClient;
- public class RPCClientUploadFile {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- //1.创建webServices客户端
- RPCServiceClient rpClient=new RPCServiceClient();
- rpClient.getOptions().setTo(new EndpointReference("http://localhost:8888/Axis2Web/services/WSTest"));
- //2.设置调用参数
- QName opEntryQNama=new QName("http://test.ws.undergrowth.com","uploadWithDataHandle");
- //输入参数
- Object[] opEntryArgs=new Object[]{new DataHandler(new FileDataSource("/csg.jpg")),"csg.jpg"};
- //返回参数
- Class[] returnClassArgs=new Class[]{Boolean.class};
- //3,进行调用
- System.out.println("上传结果为:"+rpClient.invokeBlocking(opEntryQNama, opEntryArgs, returnClassArgs)[0]);
- } catch (AxisFault e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
我是部署在weblogic下的,服务能访问,但调用的使用出现了这个问题:
java.lang.IllegalArgumentException
我在网上搜索了一下,在WEB-INF下加上weblogic.xml
在里面加上如下代码:
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
可能是JAR包冲突的问题
完整的weblogic.xml内容为:
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<jsp-descriptor>
<jsp-param>
<param-name>compileFlags</param-name>
<param-value>-g</param-value>
</jsp-param>
<jsp-param>
<param-name>keepgenerated</param-name>
<param-value>true</param-value>
</jsp-param>
<jsp-param>
<param-name>pageCheckSeconds</param-name>
<param-value>1</param-value>
</jsp-param>
</jsp-descriptor>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
<context-root>Axis2Test</context-root>
</weblogic-web-app>
最后
以上就是紧张曲奇为你收集整理的axis2_1.6.2之构建web端和客户端的全部内容,希望文章能够帮你解决axis2_1.6.2之构建web端和客户端所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复