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);
    }
}

猜你喜欢

转载自747017186.iteye.com/blog/2326263