webservice的筹建
最近在做一个综合的接口系统,需要搭建webservice上网查了好多资料,觉得jdk自带的搭建方式很简单,并且是轻量级的。下面看例子:
定义对外的接口SayHiService:
package service; import java.util.Date; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; /** * 作为测试的WebService接口 * * @author Johness * */ @WebService @SOAPBinding(style = SOAPBinding.Style.RPC) public interface SayHiService { /** * 执行测试的WebService方法 */ @WebMethod void SayHiDefault(); /** * 执行测试的WebService方法(有参) * * @param name */ @WebMethod void SayHi(@WebParam(name = "name") String name); /** * 得到json字符串 * @return */ @WebMethod String getJson(); /** * 执行测试的WebService方法(用于时间校验) * * @param clentTime 客户端时间a * @return 0表示时间校验失败 1表示校验成功 */ @WebMethod @WebResult(name = "valid") int CheckTime(@WebParam(name = "clientTime") Date clientTime); }
接口实现SayHiServiceImp:
package service.imp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import service.SayHiService; /** * 作为测试的WebService实现类 * * @author Johness * */ @WebService(endpointInterface = "service.SayHiService") @SOAPBinding(style = SOAPBinding.Style.RPC) public class SayHiServiceImp implements SayHiService { @Override public void SayHiDefault() { System.out.println("Hi, Johness!"); } @Override public void SayHi(String name) { System.out.println("Hi, " + name + "!"); } @Override public int CheckTime(Date clientTime) { // 精确到秒 String dateServer = new java.sql.Date(System.currentTimeMillis()) .toString() + " " + new java.sql.Time(System.currentTimeMillis()); String dateClient = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .format(clientTime); return dateServer.equals(dateClient) ? 1 : 0; } @Override public String getJson() { // TODO Auto-generated method stub return "123456789"; } }
服务发布,服务发布有两种类型,第一种是直接发布,第二种是基于web的发布。
第一种发布:
两个参数,一个是写发布的地址,另外是webservice接口的实现类的实例。
package mian; import javax.xml.ws.Endpoint; import service.imp.SayHiServiceImp; public class Main { /** * 发布WebService * 简单 */ public static void main(String[] args) { Endpoint.publish("http://localhost:8080/testjws/service/sayHi", new SayHiServiceImp()); System.out.println("publish success~"); } }
第二种发布:
在web-info下新建一个配置文件sun-jaxws.xml,保证编码为UTF-8。
implementation:是实现类
url-pattern:发布的路径名称(项目名除外)
<?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <endpoint name="SayHiService" implementation="service.imp.SayHiServiceImp" url-pattern="/service/sayHi" /> </endpoints>
web.xml的配置
住的注意的是,servlet的配置url-patten要和sun-jaxws.xml的url-pattern必须相同。
<listener> <listener-class> com.sun.xml.ws.transport.http.servlet.WSServletContextListener </listener-class> </listener> <servlet> <servlet-name>SayHiService</servlet-name> <servlet-class> com.sun.xml.ws.transport.http.servlet.WSServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>SayHiService</servlet-name> <url-pattern>/service/sayHi</url-pattern> </servlet-mapping>
配置好了之后,直接启动服务器即可。
访问
在浏览器直接输入:http://localhost:8080/testjws/service/sayHi?wsdl访问。
接口方法测试
服务启动之后怎么去测试呢?一般使用jdk自带工具wsimport生成客户端:
在命令行下输入:
D:\>"%JAVA_HOME%\bin\wsimport" -keep -d .\wsclient -p client http://localhost:8080/testjws/service/sayHi?wsdl直接生成测试的代码。
package test; import java.util.Date; import java.util.GregorianCalendar; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import client.SayHiService; import client.SayHiServiceImpService; public class Test { public static void main(String[] args) throws DatatypeConfigurationException { // 获取service SayHiService service = new SayHiServiceImpService().getSayHiServiceImpPort(); // sayhi service.sayHiDefault(); service.sayHi("Ahe"); System.out.println(service.getJson()); // checktime // 这里主要说一下时间日期的xml传递,方法还略显复杂 // GregorianCalendar calender = new GregorianCalendar(); // calender.setTime(new Date(System.currentTimeMillis())); // XMLGregorianCalendar xmldate = DatatypeFactory.newInstance().newXMLGregorianCalendar(calender); // System.out.println(service.checkTime(xmldate)); } }
其中SayHiService service = new SayHiServiceImpService().getSayHiServiceImpPort();当中的SayHiService 与SayHiServiceImpService都是客户端生成的,不是原始的webservice接口当中的类。这个要特别注意。客户端生成的代码在这里没有写出来。这里只提供怎么调用测试即可。
在提供一个测试:
package test.client; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import com.alibaba.fastjson.JSONObject; import hw.hlatform.secg.utils.viewmodel.ws.base.BaseHead; import hw.hlatform.secg.utils.viewmodel.ws.base.Common; import hw.hlatform.secg.utils.viewmodel.ws.login.LoginBody; public class TestMain { public static void main(String[] args) throws Exception { URL url = new URL("http://localhost:8082/api/services/secgMSWebservice?wsdl"); QName qname = new QName("http://impl.ws.service/", "PublicServiceImpService"); Service service = Service.create(url, qname); PublicService hello = service.getPort(PublicService.class); BaseHead head=new BaseHead(); head.setAppId("1"); head.setAuthorKey("1"); head.setToken("1"); head.setService(Common.Login); LoginBody body=new LoginBody(); body.setLoginCode("15101069284"); body.setLoginPass("062C683DC9D180950DB3CDA053DA4AB3"); body.setAction("0"); body.setTimestamp("2016-09-20 10:47:47"); String result=hello.callService(JSONObject.toJSONString(head), JSONObject.toJSONString(body));//调用接口方法 System.out.println(result); } }