下载安装java,并将jdk和jre配置到系统环境变量中。(java 1.8, tomcat 7.0)
因为要使用 wsimport
命令,所以建议使用 JAVA_HOME
和 CLASS_PATH
的方式配置,以确保 wsimport
命令全局访问
使用 Web服务地址 选择需要的web服务类型
以天气服务为例: 天气服务wsdl文档地址
右键另存为到本地,修改wsdl文档的部分内容:将 <s:element ref="s:schema" /><s:any />
替换成 <s:any minOccurs="2" maxOccurs="2"/>
,此文档一共有三处修改,不要遗漏。
使用 wsimport
命令生成jave类
wsimport -keep -d .class文件的输出目录 -s .java文件的输出目录 wsdl文档位置 复制代码
运行后,在指定的输出目录可以看到生成的java文件
以上方法是针对wsdl文档由.net开发的文档,需要修改其内容,再生成java文件,对于非.net开发的,例如手机归属地查询,可以直接使用网络地址生成java文件:
wsimport -keep -d .class文件的输出目录 -s .java文件的输出目录 http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl 复制代码
利用文件生成java文件的方式,切记不要删除.wsdl文件或更改位置,因为.wsdl文件的位置会写到java文件中,如果找不到.wsdl文件会编译不通过。
在eclipse中新建web项目,并配置Tomcat服务,将第一步的java文件拷贝到项目的 src
目录中。
在 src
目录中新建自己的类,代码如下:
package demo; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import cn.com.webxml.ArrayOfString; import cn.com.webxml.WeatherWS; import cn.com.webxml.WeatherWSSoap; @WebServlet(name = "ToolServlet", urlPatterns = "/Tool.do") public class Select extends HttpServlet{ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); String func = request.getParameter("func"); String str = request.getParameter("str"); switch(func){ case "weather" : response.getWriter().write(weather(str)); break; } } public String weather(String str) { WeatherWS factory = new WeatherWS(); // 创建一个WeatherWS工厂 WeatherWSSoap weatherWSSoap = factory.getWeatherWSSoap(); // 根据工厂创建一个WeatherWSSoap对象 ArrayOfString weatherInfo = weatherWSSoap.getWeather(str, null); // 调用WebService提供的getWeather方法 List<String> lstWeatherInfo = weatherInfo.getString(); String weather_str = lstWeatherInfo.get(4); // 返回天气信息中的某一条 return weather_str; } } 复制代码
前端jsp页面,js代码入下:
<script type="text/javascript"> ... function f_weather(){ s_weather = document.getElementById("weather").value; t_code = document.getElementById("t-code").value; if (y_code == t_code){ $.ajax({ url:"<%=application.getContextPath()%>/Tool.do", data:{ "func":"weather", "str":s_weather }, Type:"post", success:function(res){ document.getElementById('r-main').innerHTML = res; }, error:function(err){ alert(err); } }) }else{ alert("验证码不正确"); } } </script> 复制代码
注:调用Web Service接口时遇到的一些问题。
(1)在eclipse中设置项目编码为 UTF-8
,参考 eclipse设置编码格式为utf-8
(2)在 server.xml
中配置编码格式,添加 URIEncoding="UTF-8"
;
<Connector connectionTimeout="20000" port="8888" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/> 复制代码
(3)在java类中返回数据之前,添加 response.setContentType("text/html;charset=UTF-8");
比如查询火车信息的Web Service接口,将方法的第二个参数 null
改为空字符串
public String train(String str) { TrainTimeWebService factory = new TrainTimeWebService(); TrainTimeWebServiceSoap trainTimeWebServiceSoap = factory.getTrainTimeWebServiceSoap(); //ArrayOfString trainInfo = trainTimeWebServiceSoap.getStationAndTimeByTrainCode(str, null); ArrayOfString trainInfo = trainTimeWebServiceSoap.getStationAndTimeByTrainCode(str, ""); List<String> lsttrainInfo = trainInfo.getString(); return res; } 复制代码