开发环境:
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;
}
}