最近在做一个综合的接口系统,需要搭建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);
}
}