開發環境:
eclipse 3.7+jdk 1.7+tomcat6.0+axis1.4(axis1.4包可以再http://ws.apache.org/axis下載) 解壓axis-bin-1_4.zip這個包可以看到webapps目錄和lib目錄,把webapp目錄下的axis文件夾考到tomcat的webapps目錄下,之後拷貝activation.jar、mail.jar、tools.jar到%TOMCAT_HOME%\webapps\axis\WEB-INF\lib目錄下。啓動tomcat,訪問http://localhost:8080/axis/happyaxis.jsp如果訪問成功,恭喜你!基本的配置你已經做完了。現在來說一下最關鍵的Webservice的發佈。AXIS提供了兩種發佈方式,一種是即時發佈(Instant Deployment),另外一種是定製發佈(CustomDeployment)。即時發佈提供了一種非常簡單的webservice的發佈方式,但是其中限制太多,因此在實際的開發中定製發佈纔是首選。
1.即時發佈jws
即時發佈就是將Java源代碼文件(.java文件)拷貝到%TOMCAT_HOME%/webapps/zxis目錄下:示例如下
TyjcComm09BO.java
publicclass TyjcComm09BO{
publicString getWgtByHeatNoS(String compId, String brand,
String groupName, String partCode){
return“HeatNoS”;
}
publicString getTy04Cm01S(String compId, String brand, String groupName,
String partCode, String heatNo) {
return“Cm01S”;
}
}
把TyjcComm09BO.java文件的後綴改成.jws放到%TOMCAT_HOME%\webapps\axis目錄下(也就是工程發佈的目錄),啓動tomcat(或工程的服務)訪問http://localhost:8080/axis/ TyjcComm09BO.jws,如果看到Click to see the WSDL,這個超鏈接就說名發佈成功(用SOAP ui測試服務端業務邏輯是否都正確),然後編寫客戶端
客戶端代碼如下:
java 代碼
packagecom.chnic.test;
importjava.net.URL;
importjavax.xml.namespace.QName;
importorg.apache.axis.client.Call;
importorg.apache.axis.client.Service;
public class Test {
public static voidmain(String[] args) throws Exception{
StringtargetEendPoint = "http://localhost:8080/axis/ TyjcComm09BO.jws"; (這個地址就是發佈的地址)
Service service =new Service();
Call call = (Call)service.createCall();
call.setOperationName(newQName(targetEendPoint, "getWgtByHeatNoS ")); (第二個參數是方法,後面省略第二個方法,是一樣的)
call.setTargetEndpointAddress(newURL(targetEendPoint));
String result =(String) call.invoke(new Object[]{“compId”,” compId”,” groupName”,” partCode” }); //條件
System.out.println(result);
}
}
2.定製發佈 Custom Deployment - Introducing WSDD
比起即時發佈定製發佈更加煩瑣也更復雜,但是換來的卻是更大的靈活性,因此在實際項目中定製發佈還是不二的選擇。定製發佈需要你自己編寫一個WSDD
代碼如下:
服務端:
第一步,寫好接口和實現類
接口:@WebService和SOAPBinding(style=SOAPBinding.Style.RPC)不可少
/**
* Iwebservice.java
*
* This file was auto-generated from WSDL
* by the Apache Axis 1.4 Apr 22, 2006(06:55:48 PDT) WSDL2Java emitter.
*/
packagecom.wisco.ty.webservice;
importjavax.jws.WebMethod;
importjavax.jws.WebService;
importjavax.jws.soap.SOAPBinding;
/**
* 服務端接口
* @file Iwebservice.java
* @author 姓名
* @date 2014-11-19下午1:51:39
* @version 1.0
*/
@WebService
@SOAPBinding(style= SOAPBinding.Style.RPC)
public interfaceIwebservice extends java.rmi.Remote {
@WebMethod java.lang.String getWgtByHeatNoS(java.lang.Stringarg0, java.lang.String arg1, java.lang.String arg2, java.lang.String arg3)throws java.rmi.RemoteException;
@WebMethod java.lang.StringgetTy04Cm01S(java.lang.String arg0, java.lang.String arg1, java.lang.Stringarg2, java.lang.String arg3, java.lang.String arg4) throwsjava.rmi.RemoteException;
}
實現類:@WebService(endpointInterface ="http://localhost/rcsm.war/services/tyWebservice")不可缺,在客戶端要用到
packagecom.wisco.ty.webservice;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Map;
importjavax.annotation.Resource;
import javax.jws.WebService;
importorg.m6.SpringHolder;
importorg.m6.base.BaseBO;
importorg.springframework.stereotype.Component;
importcom.alibaba.fastjson.JSON;
importcom.bstek.dorado.utils.StringHelper;
importcom.wisco.ty.comm.TyjcComm09BO;
importcom.wisco.ty.webservice.Iwebservice;
/**
* 服務端的業務邏輯
* @file TyjcComm09BO.java
* @date 2014-11-13上午9:31:59
* @version 1.0
*/
@WebService(endpointInterface="http://localhost/rcsm.war/services/tyWebservice")
public classIwebserviceImp implements Iwebservice {
public final static String CLASS_VERSION= "$Id: IwebserviceImp.java,v 1.0 2014-10-30,下午03:27:21 $";
/* (non-Javadoc)
* @seecom.wisco.ty.webservice.Iwebservice#getWgtByHeatNoS(java.lang.String,java.lang.String, java.lang.String, java.lang.String)
*/
public String getWgtByHeatNoS(StringcompId, String brand,
String groupName,String partCode) {
TyjcComm09BOtyjcComm09BO=(TyjcComm09BO)SpringHolder.getApplicationContext().getBean("tyjcComm09BO");
String result =tyjcComm09BO.getWgtByHeatNoS(compId, brand, groupName,
partCode);
return result;
}
/* (non-Javadoc)
* @seecom.wisco.ty.webservice.Iwebservice#getTy04Cm01S(java.lang.String,java.lang.String, java.lang.String, java.lang.String, java.lang.String)
*/
public String getTy04Cm01S(StringcompId, String brand, String groupName,
String partCode,String heatNo) {
TyjcComm09BOtyjcComm09BO=(TyjcComm09BO)SpringHolder.getApplicationContext().getBean("tyjcComm09BO");
String result =tyjcComm09BO.getTy04Cm01S(compId, brand, groupName,
partCode,heatNo);
returnresult;
}
業務(可以寫在實現類中,但是這裏因爲用到公司平臺的hibernate和spring,所以另外調用方法)
package com.wisco.ty.comm;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Map;
importjavax.jws.WebService;
importorg.m6.base.BaseBO;
importorg.springframework.stereotype.Component;
importcom.alibaba.fastjson.JSON;
importcom.bstek.dorado.utils.StringHelper;
import com.wisco.ty.webservice.Iwebservice;
/**
* 服務端具體業務邏輯
* @file TyjcComm09BO.java
* @date 2014-11-13上午9:31:59
* @version 1.0
*/
@Component("tyjcComm09BO")
public classTyjcComm09BO extends BaseBO {
public final static StringCLASS_VERSION = "$Id: TyjcComm09BO.java,v 1.0 2014-10-30,下午03:27:21 $";
public String getWgtByHeatNoS(StringcompId, String brand,
String groupName,String partCode) {
String sql = " SELECTa.heat_no_,sum(b.afm_wgt_) FROM tbty04 a, tbcm01 b "
+ "WHERE a.cm01_id_ = b.cm01_id_ ";
List<Object> listParam= new ArrayList<Object>();
if(StringHelper.isNotEmpty(compId)) {
sql = sql + "AND a.comp_id_ = ? ";
listParam.add(compId);
}
if(StringHelper.isNotEmpty(brand)) {
sql = sql + "AND a.brand_ = ? ";
listParam.add(brand);
}
if(StringHelper.isNotEmpty(groupName)) {
sql = sql +" AND a.group_Name_ = ? ";
listParam.add(groupName);
}
if (StringHelper.isNotEmpty(partCode)){
sql = sql + "AND a.part_code_ = ? ";
listParam.add(partCode);
}
sql = sql + " ANDa.zl_flag_ = 'N' AND b.status_ not in ('04','55') "
+ "group by a.heat_no_ ";
List<Map<String,Object>> listMap = this.getJdbcTemplate()
.queryForList(sql, listParam.toArray());
String result =JSON.toJSONString(listMap);
return result;
}
public String getTy04Cm01S(StringcompId, String brand, String groupName,
String partCode,String heatNo) {
String sql = "SELECTa.BRAND_,a.GROUP_NAME_, a.PART_CODE_,a.PART_NAME_,"
+ "b.Y_MONTH_,b.THICK_,b.WIDTH_,b.LENGTH_,b.LABEL_NO_,b.USED_LABEL_NO_,"
+ "a.HEAT_NO_,b.AFM_WGT_,b.IN_DATE_ FROMTBTY04 a,TBCM01 b "
+ " WHEREa.CM01_ID_ = b.CM01_ID_ ";
List<Object> objList =new ArrayList<Object>();
if(StringHelper.isNotEmpty(compId)) {
sql = sql + "AND a.COMP_ID_ = ? ";
objList.add(compId);
}
if(StringHelper.isNotEmpty(brand)) {
sql = sql + "AND a.BRAND_ = ? ";
objList.add(brand);
}
if (StringHelper.isNotEmpty(groupName)){
sql = sql + "AND a.GROUP_NAME_ = ? ";
objList.add(groupName);
}
if(StringHelper.isNotEmpty(partCode)) {
sql = sql + "AND a.PART_CODE_ = ? ";
objList.add(partCode);
}
if(StringHelper.isNotEmpty(heatNo)) {
sql = sql + "AND a.HEAT_NO_ = ? ";
objList.add(heatNo);
}
List<Map<String,Object>> listMap = this.getJdbcTemplate()
.queryForList(sql,objList.toArray());
String result = JSON.toJSONString(listMap);
return result;
}
}
下面就要發佈服務端:
1、 在web.xmlz中加以下內容:
<display-name>Apache-Axis</display-name>
<listener>
<listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
</listener>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-AxisServlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<display-name>Axis Admin Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AdminServlet
</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<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>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/axis/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>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>
<!-- uncomment this if you want the adminservlet -->
<!--
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/servlet/AdminServlet</url-pattern>
</servlet-mapping>
-->
<!-- <session-config> -->
Default to 5 minute session timeouts
<!-- <session-timeout>5</session-timeout> -->
<!-- </session-config> -->
<!-- currently the W3C havent settled ona media type for WSDL;
http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
for now we go with the basic 'it's XML'response -->
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<welcome-file-listid="WelcomeFileList">
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jws</welcome-file>
</welcome-file-list>
2.Webservice發佈文件:server-config.wsdd
<?xml version="1.0"encoding="UTF-8"?>
<deploymentxmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<handlertype="java:org.apache.axis.handlers.http.URLMapper"name="URLMapper"/>
<service name="tyWebservice"provider="java:RPC">(服務端service名字)
<parametername="className"value="com.wisco.ty.webservice.IwebserviceImp" />(實現類的地址)
<!-- * 代表所有的方法都暴露 -->
<parameter name="allowedMethods"value="*" />
</service>
<transportname="http">
<requestFlow>
<handlertype="URLMapper"/>
</requestFlow>
</transport>
</deployment>
然後就可以啓動工程,同事服務端也發佈了,然後訪問http://localhost/rcsm.war/services就可以看到也可以訪問(http://localhost/rcsm.war/services/tyWebservice?wsdl)只是訪問的界面不一樣(爲了保險就好用soap ui把這個地址放到裏面去測一下),如果沒問題,服務端就發佈成功。
客戶端代碼如下:
packagecom.wisco.ty.comm;
importjava.util.List;
importjavax.xml.namespace.QName;
import org.m6.base.BaseBO;
importorg.springframework.stereotype.Component;
importorg.apache.axis.client.Call;
import org.apache.axis.client.Service;
/**
* 客戶端具體業務邏輯
* @file TyjcComm10BO.java
* @author 姓名</a>
* @date 2014-11-19下午1:53:10
* @version 1.0
*/
@Component("tyjcComm10BO")
@SuppressWarnings("unchecked")
public classTyjcComm10BO extends BaseBO {
public final static StringCLASS_VERSION =
"$Id:TyjcComm10BO.java,v 1.0 2014-10-30,下午03:29:00 $";
@SuppressWarnings("rawtypes")
public String getWgtByHeatNoC(StringcompId,String brand,String groupName,String partCode)throws Exception{
StringtargetEendPoint ="http://localhost/rcsm.war/services/tyWebservice";
Service service =new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(targetEendPoint);
call.setOperationName(newQName(targetEendPoint, "getWgtByHeatNoS")); // 訪問服務端的地址,服務端業務提供的方法
String result = (String) call.invoke(newObject[]{compId,brand,groupName,partCode});
if(result!=null){
return result;
}
return null;
}
@SuppressWarnings("rawtypes")
public String getTy04Cm01C(StringcompId, String brand,
String groupName,String partCode, String heatNo) throws Exception{
String targetEendPoint ="http://localhost/rcsm.war/services/tyWebservice";
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(targetEendPoint);
call.setOperationName(new QName(targetEendPoint,"getTy04Cm01S")); // 訪問服務端的地址,服務端業務提供的方法
String result = (String) call.invoke(newObject[]{compId,brand,groupName,partCode,heatNo});
if(result!=null){
return result;
}
return null;
}
}