首先:需要用到的jar包axis-ant.jar,axis.jar,wsdl4j-1.5.1.jar
1、然后server-config.wsdd 文件的配置:
<?xml version="1.0" encoding="UTF-8"?>
<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="adminPassword" value="admin" />
<parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl" />
<parameter name="sendXsiTypes" value="true" />
<parameter name="sendMultiRefs" value="true" />
<parameter name="sendXMLDeclaration" value="true" />
<parameter name="axis.sendMinimizedElements" value="true" />
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session" />
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request" />
<parameter name="extension" value=".jwr" />
</handler>
</requestFlow>
</globalConfiguration>
<handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder" />
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" />
<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />
<handler name="soapmonitor" type="java:org.apache.axis.handlers.SOAPMonitorHandler">
<parameter name="wsdlURL" value="/axis/SOAPMonitorService-impl.wsdl"/>
<parameter name="namespace" value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
<parameter name="serviceName" value="SOAPMonitorService"/>
<parameter name="portName" value="Demo"/>
</handler>
<handler name="logging" type="java:com.aa.aa.util.LogHandler" />
<!--此处编写 自己的Action 即 需要 调用 远程Service相关的 功能-->
<service name="QueryDataAction" provider="java:RPC">
<requestFlow>
<handler type="soapmonitor" />
<handler type="logging" />
</requestFlow>
<responseFlow>
<handler type="soapmonitor"/>
</responseFlow>
<parameter name="allowedMethods" value="*" />
<parameter name="className" value="com.aa.aa.querydata.action.QueryDataAction" />
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper" />
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
</requestFlow>
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder" />
</responseFlow>
</transport>
</deployment>
2、web.xml配置---
<listener>
<listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
</listener>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet>
<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>/showAllAxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
3、过滤器----由于web.xml配置文件中,struts2的映射是/*,自定义一个过滤器,放行webservice请求
public class WsFilter extends StrutsPrepareAndExecuteFilter {
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
System.out.println("----------------------");
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
if (request.getRequestURI().contains("?wsdl")
|| request.getRequestURI().contains("showAllAxisServlet")
|| request.getRequestURI().contains("/services")) {
chain.doFilter(request, response);
} else {
try {
prepare.setEncodingAndLocale(request, response);
prepare.createActionContext(request, response);
prepare.assignDispatcherToThread();
if (excludedPatterns != null
&& prepare.isUrlExcluded(request, excludedPatterns)) {
chain.doFilter(request, response);
} else {
request = prepare.wrapRequest(request);
ActionMapping mapping = prepare.findActionMapping(request,
response, true);
if (mapping == null) {
boolean handled = execute.executeStaticResourceRequest(
request, response);
if (!handled) {
chain.doFilter(request, response);
}
} else {
execute.executeAction(request, response, mapping);
}
}
} finally {
prepare.cleanupRequest(request);
}
}
}
}
4、前台 点击 按钮 通过Action再请求 service:
jsonArray的包:import net.sf.json.JSONArray;
public void aa(){
①参数 list List<Object> list, List<Object> list1
②将 list转为 json数组格式
JSONArray listJson = JSONArray.fromObject(list);
JSONArray list1Json = JSONArray.fromObject(list1);
③将list封装到map
Map map=new HashMap();
//是退回 还是 第一次插入
map.put("listJson ", listJson );
map.put("list1Json ", list1Json );
④调 接口的方法
query(map);
}
/**
* 调用 外部提供的 接口,
* @return
*/
private void query(Map params) throws RuntimeException {
Service service = new Service();
XMLRead reader = new XMLRead();
try {
// 封装参数xml字符串
String inXml = packageParamsXml(params);
Call call = (Call) service.createCall();
//此处为 wenservice服务器端的 url
String targetEendPoint = "http://192.168.88.128:81/country/services/SaveDataServiceImpl?wsdl";
//设置地址
call.setTargetEndpointAddress(new java.net.URL(targetEendPoint));
//设置要执行的方法
call.setOperationName(new QName(targetEendPoint,"saveCheckData"));//WSDL里面描述的接口名称
//接口的参数
call.addParameter(new QName(targetEendPoint, "inXml"), XMLType.SOAP_STRING, ParameterMode.IN);
//设置返回类型
call.setReturnType(new QName(targetEendPoint, "response"), String.class);
//设置返回的类型
//call.setReturnType(org.apache.axis.Constants.XSD_STRING);
//执行,调用webservice
String result = (String) call.invoke(new Object[]{inXml});
TreeMap m = reader.parseXml(result);
if ("0".equals(m.get("ifSuccess"))) {
throw new RuntimeException();
}
System.out.println("返回的结果是:"+result);
/* QName qn = new QName("urn:ParData","params1");
call.registerTypeMapping(ParData.class, qn,
new org.apache.axis.encoding.ser.BeanSerializerFactory(ParData.class,qn),
new org.apache.axis.encoding.ser.BeanDeserializerFactory(ParData.class,qn));
// 设置返回类型
call.setReturnType(qn, ParData.class);
call.setOperationName(qn);
call.addParameter("params1", qn, javax.xml.rpc.ParameterMode.IN);
ParData params1 = new ParData();
ParData ret = (ParData) call.invoke(new Object[] { params1 });
System.out.println("return value is " + ret);*/
} catch (Exception e) {
e.printStackTrace();
}
}
//封装 参数,将 参数 转换成 xml 格式,webservice的调用 所能传递的参数格式 xml
private String packageParamsXml(Map params) {
StringBuffer sbBuf = new StringBuffer();
sbBuf.append("<?xml version='1.0' encoding='utf-8'?><tobacco action='"+params.get("action")+"'>");
sbBuf.append("<dataset listJson ='"+params.get("listJson ")+"'/>");
sbBuf.append("<dataset list1Json ='"+params.get("list1Json ")+"'/>");
sbBuf.append("</tobacco>");
return sbBuf.toString();
}