WEB Service
详细步骤:
WebService概念:它可以让一个程序透明的调用互联网程序,不用管具体实现细节,只要WebService公开了服务接口,远程客户端就可以调用服务。Webservice基于HTTP协议,它是分布式应用程序的发展趋势。
Apache Axis是一个开源的WebSerbive运行引擎,现在拥有1.x和2.x两个版本。本文讲解Axis2.x版本,该版本较Axis1.x版本在体系结构上进行了重写,具有更高的效率、更加模块化也更加面向XML。Axis应该是最早一批SOAP(简单对象访问协议),该协议提供了标准的RPC方法来调用WebService。SOAP、RPC是建立在HTTP请求响应模式上的。
1.环境准备:
IDE:Eclipse3.6
依赖的JAR文件:
www.apache.org(Apache官方网站)上去下载:
下载地址:http://axis.apache.org/axis2/java/core/download.cgi
此处下载最新版本1.6.2版本的Binary Distribution zip文件。
配置Eclipse,Eclipse自带了开发WebService的工具。
打开Eclipse-->点击菜单windows-->Preferences-->WebServices-->Axis2Preferences-->设置Axis2 runtime location为Axis2下载后并解压的核心包的位置:
选择后Eclipse会自动检测包是否正确。如果successfully提示表示设置正确。
2.在Eclipse创建一个WebProject时,点击Configuration的Modify会出现下图界面(或者选择我们工作区间的项目,选择的是fsew工程,工程右键->Preferences->Project Facets选项卡):
勾选Axis2 Web Services按OK,项目集成web service。(项目的Dynamic Web Module版本不能低于2.2,高于2.5版本)
成功后会发现在WEB-INF文件夹下会多出一个axis2-web的文件夹,这个是Axis2的项目文件夹。
3.开发实例
在fsew工程的src下新建一个名为com.ac.ms.MSService的类:
package com.ac.ms;
importjava.util.List;
importjava.util.Map;
importorg.springframework.jdbc.core.JdbcTemplate;
importcom.ac.core.config.Config;
public class MSService {
JdbcTemplatejdbcTemplate=null;
public String getSapmleDate(String startDate,StringendDate) {
jdbcTemplate=Config.getInstance().getJdbcTemplate();
StringBufferjson=new StringBuffer();
json.append("{");
StringBuffersql=new StringBuffer();
sql.append(" select a.ID,b.INDICATORNAME,a.AREA_NAME,a.SP_NAME,a.SAMPLE_AREA,a.SAMPLE_DATE,a.SUP_NAME ");
sql.append(" from v_sample02 a,V_indicator b ");
sql.append(" where 1=1 ");
sql.append(" and to_char(a.SAMPLE_DATE, 'yyyy-mm-dd') >= '"+startDate+"' ");
sql.append(" and to_char(a.SAMPLE_DATE, 'yyyy-mm-dd') <= '"+endDate+"' ");
sql.append(" and (a.DEPT_CODE = 'zhongxin' or a.state = 'U2') ");
sql.append(" and b.sampleid=a.ID ");
sql.append(" order by a.ID ");
String sampId=null;
int count=0;
List rs= jdbcTemplate.queryForList(sql.toString());
for (inti=0;i<rs.size();i++) {
Map map=(Map)rs.get(i);
if(sampId==null||!map.get("ID").toString().trim().equals(sampId)){
if(sampId!=null){
json.append("'},");
}
count++;
json.append("{'group':test"+count+",");
json.append("'name':test"+count+",");
json.append("'销售场所':"+map.get("SP_NAME").toString()+",");
json.append("'抽样区域':"+map.get("SAMPLE_AREA").toString()+",");
json.append("'食品产地':"+map.get("AREA_NAME").toString()+",");
json.append("'监管环节':"+map.get("SUP_NAME").toString()+",");
json.append("'抽样日期':"+map.get("SAMPLE_DATE").toString()+",");
json.append("'检测项目':'"+map.get("INDICATORNAME").toString()+",");
}else{
json.append(map.get("INDICATORNAME").toString()+",");
}
sampId=map.get("ID").toString().trim();
}
json.append("}");
returnjson.toString();
}
}
在Eclipse中将鼠标放在刚才建立的MSService.java上点击右键,弹出菜单选择Web Service再选择Create Web Service,会弹出下图的界面:
上下分别有个滑块,把上面的滑块滑至最上端(为Test service)。把下方滑块滑至第二格(Develop client)表示生成当前服务的客户端代码(完成后会在Eclipse中会自动生成一个名字为:[当前工程名+Client]的工程),同时选中publish the Web Service(公开这个Web Service),最后选择发布运行的版本是Web service runtime:Apache Axis2。点击下一步直至完成。步骤如图:
此处选择是services.xml文件,内容大致为:
<servicename="MSService"><!—服务名-->
<Description>
Please Type your service description here<!—描述信息-->
</Description>
<messageReceivers><!—基本默认。如果接口方法不带参数就只需要配置RPCInOnlyMessageReceiver-->
<messageReceivermep="http://www.w3.org/2004/08/wsdl/in-only"class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceivermep="http://www.w3.org/2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parametername="ServiceClass"locked="false">com.ac.ms.MSService</parameter><!—你要发布的类-->
</service>
我们保持默认设置,使用默认的就行,点击下一步。
继续保持默认设置,点击下一步。
当前设置Port Name(端口名)选择:当前工程名+SOAP11HttpSoap11Endpoint。并勾选下面的Generate a JUnit test case to the service。其它选项保持默认点击完成。
完成后可以看到Web Service Explorer中可以看到我们刚刚对外公开的MSService服务,如下图:
选中左边窗口中的MSService服务,找到并点击右边窗口中的Type(类型)为SOAP的服务绑定Name。
进入下图界面:
当前列出了当前公开服务可用的方法,当前服务只有一个getSapmleDate方法。点击Operations下Name为getSapmleDate的方法,进入下图的界面:
当前列出了当前公开服务的方法及参数。当前的唯一方法getSapmleDate有2个String类型的参数startDate和endDate。
点击Add,转到下图:
为当前公开服务的getSapmleDate方法传入2个String类型的startDate参数“2012-01-01”和endDate参数“2012-01-31”,点击Go按钮。此时下面的Status(状态窗口)中会显示调用该方法后的结果。点击Source可以浏览到已经被SOAP分装好该服务的XML文件。
此时你会发现工程web-inf下面多出三个文件:conf,modules,services。其中,我们的接口就在services目录下面。
现在启动服务器会抛出异常,这是因为Eclipse在自动加载生成该项目时有几个问题需要手动修复,下面分别列出:
问题一:会抛出异常:java.lang.ClassNotFoundException: org.apache.axis2.transport.http.AxisAdminServlet
是因为生动生成的web.xml文件中所指定的AxisAdminServlet包路径有错。
自动生成的源码如下:
<servlet>
<display-name>Apache-Axis Servlet</display-name>
<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>/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>
<display-name>Apache-Axis Admin Servlet Web Admin</display-name>
<servlet-name>AxisAdminServlet</servlet-name>
<servlet-class>org.apache.axis2.transport.http.AxisAdminServlet</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisAdminServlet</servlet-name>
<url-pattern>/axis2-admin/*</url-pattern>
</servlet-mapping>
注意红色字体部分,我们可以去看一下所下载的Axis2的源包。AxisAdminServlet类所在的包路径并不在下列这个路径中org.apache.axis2.transport.http,该类是属于包org.apache.axis2.webapp下。(如果修改后还有异常,注释掉AxisAdminServlet这个servlet,对我们发布没有影响)
问题二:会抛出异常:java.lang.ClassNotFoundException: org.apache.http.HttpResponseFactory,是因为少JAR包。将开始下好的HttpCore4.1-alpha1包解压后主文件夹下的lib文件夹下有httpcore-4.1-alpha1.jar包。将其拷贝到WEB-INF下的lib文件夹中。(1.6.2版本没有这个异常)
重启服务器,正常启动成功,在浏览器地址栏输入:http://localhost:8080/fsew/axis2-web/
进入主页,如下图:表示Axis2部署成功:
点击Validate进入验证Axis2环境界面:
这个页面会加册Axis2运行必备的一些库是否已具备,如果看到下列图中的绿色字体表示环境已搭建成功:
再次返回主页,点击Service,可以看到当前可用的Service列表。默认有一个名为“Version”的WebService。
再次返回主页,点击Adminnistation,进入管理控制台的登录界面:(如果注释了web.xml中的AxisAdminServlet,这个是访问不到的)
输入username(用户名)和password(密码)。默认用户名为:admin,密码为:axis2。
点击登录进入Axis2管理控制平台:
可点击左边的Available Service产看当前可用的Service列表。
4.Eclipse生成的Client工程
在Eclipse中找到自动生成的客户端工程,默认名称是fsewClient。在src下有一个和webservice接口包名一样的包目录com.ac.ms。其中2个类文件MSServiceCallbackHandler和MSServiceStub。我们自己新建一个测试类Test,如图:
可以在MSServiceStub中修改地址。测试的Test类文件内容为:
package com.ac.ms;
importjava.rmi.RemoteException;
import org.apache.axis2.AxisFault;
public class Test {
/**
* @paramargs
*/
public static void main(String[] args) throws RemoteException {
// TODO Auto-generated method stub
try {
MSServiceStub stub=new MSServiceStub();
MSServiceStub.GetSapmleDategetSapmleDate=new MSServiceStub.GetSapmleDate();
getSapmleDate.setStartDate("2012-01-01");
getSapmleDate.setEndDate("2012-01-31");
String ret=stub.getSapmleDate(getSapmleDate).get_return();
System.out.print(ret);
e.printStackTrace();
}
}
}
最后右键,运行java application就可以再控制台看到相应的结果了。
在linux上部署:
地址:http://192.168.23.84/fsew/services/MSService?wsdl
拷贝/fsew/WebRoot/axis2-web目录及目录下面的所有文件到/usr/local/tomcat6/webapps/fsew/目录下。
拷贝/fsew/WebRoot/WEB-INF/services、/fsew/WebRoot/WEB-INF/modules和/fsew/WebRoot/WEB-INF/conf到/usr/local/tomcat6/webapps/fsew/WEB-INF/目录下。
最后,/fsew/WebRoot/WEB-INF/lib中axis2插件自己加的架包全部添加到/usr/local/tomcat6/webapps/fsew/ WEB-INF/lib目录
客户端设置超时时间_serviceClient.getOptions().setTimeOutInMilliSeconds(600000L);
服务端设置超时时间修改conf下的axis2.xml的requestTimeout参数大小不能大于ConfigContextTimeoutInterval的值