axis webservice 实验

使用axis创建webservice
1.下载axis jar包(在此文件夹中已存在)


2.创建一个web project 项目名称为axistest
在web.xml中添加axis相关配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>axistest</display-name>
  
  <servlet>  
    <display-name>Apache-Axis Servlet</display-name>  
    <servlet-name>AxisServlet</servlet-name>  
    <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>  
</servlet>  
  
<servlet>  
    <display-name>Axis Admin Servlet</display-name>  
    <servlet-name>AdminServlet</servlet-name>  
    <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>  
    <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>AdminServlet</servlet-name>  
    <url-pattern>/servlet/AdminServlet</url-pattern>  
</servlet-mapping>  
  
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>




3.在项目下新建一个包并创建一个类 SendInfo(该类中模拟服务端发送xml文件给客户端,之后客户端解析这个xml文件)


package com;


import java.io.IOException;
import java.io.StringWriter;


import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.XMLOutputter;


public class SendInfo {

public String sendYDSSInfo(){
Document document = new Document();
//根节点
Element root = new Element("SyncYDCGSS");
//CurrentMonth节点
Element currentMonth = new Element("CurrentMonth");
Element year = new Element("Year");
Element month = new Element("Month");
year.setText("2017");
month.setText("5");
currentMonth.addContent(year);
currentMonth.addContent(month);

Element DataArea = new Element("DataArea");
for(int i=0;i<2;i++){
Element info = new Element("YDSS");
if(i==0){
createInfoElement(info,"projectType","工程");
createInfoElement(info,"projectName","房屋工程");
}else{
createInfoElement(info,"projectType","物资");
createInfoElement(info,"projectName","生活物资");
}
createInfoElement(info,"isGZ","0");
createInfoElement(info,"gzReason","采用特定专利");
createInfoElement(info,"yearPlanAmount","21");
createInfoElement(info,"yearTenderAmount","21");
createInfoElement(info,"yearMoney","6116.87");
createInfoElement(info,"yearPlanAmountGZ","19");
createInfoElement(info,"executePlanAmount","2");
createInfoElement(info,"yearTenderGZ","19");
createInfoElement(info,"executeTenderGZ","4");
createInfoElement(info,"yearMoneyGZ","5336.87");
createInfoElement(info,"executeMoneyGZ","36.94");
createInfoElement(info,"yearPlanAmountQT","2");
createInfoElement(info,"executePlanAmountQT","0");
createInfoElement(info,"yearTenderQT","2");
createInfoElement(info,"executeTenderQT","0");
createInfoElement(info,"yearMoneyQT","780.00");
createInfoElement(info,"executeMoneyQT","0.00");
createInfoElement(info,"amountRate","100.00");
createInfoElement(info,"moneyRate","100.00");
createInfoElement(info,"createDate","2017-01-01");
createInfoElement(info,"updateDate","2017-04-01");
DataArea.addContent(info);
}

root.addContent(currentMonth);
root.addContent(DataArea);
document.setRootElement(root);

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root/>";
try {
StringWriter sw = new StringWriter();
XMLOutputter out = new XMLOutputter();
out.output(document, sw);
xml = sw.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return xml;
}

public String sendFGZDETAIL(){
Document document = new Document();
//根节点
Element root = new Element("SyncFGZDETAIL");

Element DataArea = new Element("DataArea");
for(int i=0;i<2;i++){
Element info = new Element("ZBMX");
if(i==0){
createInfoElement(info,"bjId","1");
createInfoElement(info,"tyep1","C工程");
}else{
createInfoElement(info,"bjId","2");
createInfoElement(info,"tyep1","B服务");
}
createInfoElement(info,"tyep2","0");
createInfoElement(info,"tyep3","01卷烟材料");
createInfoElement(info,"tyep4","04卷烟纸");
createInfoElement(info,"tyep5","03卷烟纸(全资三产)");
createInfoElement(info,"infoName","03卷烟纸(全资三产)");
createInfoElement(info,"purchase","北京卷烟厂");
createInfoElement(info,"name","20160101第一标段");
createInfoElement(info,"budget","27172.95");
createInfoElement(info,"procurement","单一来源");
createInfoElement(info,"reasonNo","中烟版[2012]313第16条");
createInfoElement(info,"otherReasonNO","其它");
createInfoElement(info,"createDate","2017-01-01");
createInfoElement(info,"updateDate","2017-05-01");
DataArea.addContent(info);
}

root.addContent(DataArea);
document.setRootElement(root);

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root/>";
try {
StringWriter sw = new StringWriter();
XMLOutputter out = new XMLOutputter();
out.output(document, sw);
xml = sw.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return xml;
}

private void createInfoElement(Element info, String elementName, String userId) {
Element temp = new Element(elementName);
temp.setText(userId);
info.addContent(temp);

}
}




4.配置server-config.wsdd,在WEB-INF下新建server-config.wsdd文件,内容如下:


<deployment xmlns="http://xml.apache.org/axis/wsdd/"  
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
  
    <!-- 处理器 -->  
    <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" />  
          
    <!-- 一个服务 -->  
    <!-- provider="java:RPC"  webservice是以javabean的形式提供的-->  
    <service name="helloWorldService" provider="java:RPC">  
        <!-- 指定类名 -->  
        <parameter name="className" value="com.HelloWorld" />  
        <!-- 类中允许访问的方法 -->  
        <parameter name="allowedMethod" value="*"></parameter>  
    </service>
    
    <service name="SendInfoService" provider="java:RPC">  
        <!-- 指定类名 -->  
        <parameter name="className" value="com.SendInfo" />  
        <!-- 类中允许访问的方法 -->  
        <parameter name="allowedMethod" value="*"></parameter>  
    </service>  
      
    <!-- 指定处理器 -->  
    <transport name="http">  
        <requestFlow>  
            <handler type="URLMapper"/><!-- 引用上边的 -->  
        </requestFlow>  
    </transport>  
      
</deployment>


注意:
wsdd文件标签节点说明:


deployment:表明这是一个axis部署描述文件;


service:axis提供的一个web service服务。service标签中parameter allowedMethod用于指定一个以空格分隔的方法名,只有这些方法可以通过web service访问。也可以将这个值指定为“*”表示所有的方法都可以访问。


provider:服务类型,共有四种,分别是RPC,Document,Wrapped和Message。详见org.apache.axis.providers包的API文档;


parameter:用来设置Axis的各种属性;


requestFlow:局的请求Handlers,在调用实际的服务之前调用;


transport:定义了服务器端的传输方式


5.将项目部署到Tomcat上,启动项目就可以了。
在浏览器中输入  http://localhost:8080/axistest/services   出现内容,说明webservice 发布成功 ,之后点wsdl,就可以看到相关协议的内容(不清楚wsdl是什么,好像是什么协议之类的,具体的查查)




6.在axistest(服务端)项目中创建一个测试类进行测试
测试类如下
package test;


import java.net.MalformedURLException;  
import java.rmi.RemoteException;  
  
import javax.xml.namespace.QName;  
import javax.xml.rpc.ServiceException;  
  
import org.apache.axis.client.Call;  
import org.apache.axis.client.Service; 


public class Client {


public static void main(String[] args) {
Service service = new Service();  
        try {  
              
            Call call = (Call) service.createCall();  
            //设置地址   
           call.setTargetEndpointAddress(new java.net.URL("http://localhost:8080/axistest/services/SendInfoService?wsdl"));  //这个URL就是在点wsdl后浏览器地址栏中的内容
            //设置要执行的方法   
           //call.setOperationName(new QName("http://com","sayHello"));
           
           call.setOperationName(new QName("http://com","sendYDSSInfo"));   //这个是点wsdl后,页面上的一个内容,前面的是空间域名(好像是这个),后面这个是方法名
            //设置要传入参数,如果没有要传入的参数,则不要写这个   
            //call.addParameter("msg", org.apache.axis.Constants.XSD_STRING,javax.xml.rpc.ParameterMode.IN);  
            //设置返回的类型   
            call.setReturnType(org.apache.axis.Constants.XSD_STRING);  
             
            String name = "花非花雾非雾";  
           //执行,调用webservice   
           String result = (String) call.invoke(new Object[]{});      //现在的写法是不带参数的方法,如果要将上面的name作为参数传进去的话,可以这样写   String result = (String) call.invoke(new Object[]{name}); 
            System.out.println("返回的结果是:"+result);  
              
        } catch (ServiceException e) {  
            e.printStackTrace();  
        } catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}  




}


}




运行之后就会在控制台上输出相关内容










上面这个是在服务端进行测试,主要是看看,有没有什么问题,下面说的是创建客户端,在客户端调用服务端的方法


1.编写一个 client.bat,可以通过Axis的相关工具,可以自动从WSDL文件中生成Web Service的客户端代码
client.bat内容如下
set Axis_Lib=F:\axis\axistest\WebRoot\WEB-INF\lib      ---这个是axis.jar 包所在的位置
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
 
set Output_Path=F:\my                    ------这个是在已存在的文件夹,之后生成的客户端代码会放在my文件夹中
 
set Package=com.qiusu.client            -----这个是客户端的代码所在的包


%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% http://10.128.220.56:9020/axistest/services/SendInfoService?wsdl
---这个是刚才浏览器地址栏中的内容
注意最后一行地址一定要跟在  %Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% 后面,不要换行,换行之后就执行不了,无法生成客户端代码




2.双击client.bat,生成客户端代码
注意:在双击的时候,服务端一定是要运行状态


3.新建一个web project  项目名:theclient,并将刚生成的客户端代码复制到src下




4.创建一个测试类,进行测试
package com.qiusu.test;


import java.rmi.RemoteException;


import javax.xml.rpc.ServiceException;


import com.qiusu.client.SendInfoService_ServiceLocator;


public class Test {


public static void main(String[] args) throws RemoteException, ServiceException {
/*SendInfoService_ServiceLocator service = new SendInfoService_ServiceLocator();
String ydss = service.getSendInfoService().sendYDSSInfo();
System.out.println(ydss);*/

ReadXml readXml = new ReadXml();
int i=0;
if(i==0){
//保存月度实施数据并从数据库中读取
readXml.readYDSSXML();
}else if(i==1){
//保存非公招明细并从数据库中读取
readXml.readFGZDetail(); 
}

}
}


说明:注释的代码可以直接测试,为注释的是我封装的方法用于读取服务端的方法,然后将读取的xml文件保存到数据库中(我用的数据库是DB2)




参考网站:
http://blog.csdn.net/hfhwfw/article/details/6099670

http://www.williamlong.info/archives/701.html

可能遇到的问题

1.如果发布到tomcat上面可以运行,但是发布到weblogic上却提示数组角标越界,这个问题的原因可能是因为jar包冲突
和可以正常部署的war包中的jar包比较一下,确定是哪个jar包的问题


2.部署成功之后,如果服务端用到了hibernate。在服务端测试的时候数据保存之类的操作都没有问题,但是在客户端调用的时候,却报 
org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/***/***/entity/Zbmx.hbm.xml
出现这个错误,可以修改Zbmx.hbm.xml 文件的头信息
原来的头信息
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">


修改后的头信息
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">




这样改完之后就可以访问了




















猜你喜欢

转载自blog.csdn.net/u013764330/article/details/80198259