天天看點

jfinal 基于JAX-WS釋出webService

webservice介紹

     WebService是一種跨程式設計語言和跨作業系統平台的遠端調用技術。

     WebService平台需要一套協定來實作分布式應用程式的建立。任何平台都有它的資料表示方法和類型系統。要實作互操作性,WebService平台 必須提供一套标準的類型系統,用于溝通不同平台、程式設計語言群組件模型中的不同類型系統。Web service平台必須提供一種标準來描述 Web service,讓客戶可以得到足夠的資訊來調用這個Web service。最後,我們還必須有一種方法來對這個Web service進行遠 程調用,這種方法實際是一種遠端過程調用協定(RPC)。為了達到互操作性,這種RPC協定還必須與平台和程式設計語言無關

WebService平台技術 -- WSDL

        WSDL(Web Services Description Language)就是這樣一個基于XML的語言,用于描述Web Service及其函數、參數和傳回值。它是WebService用戶端和伺服器端都 能了解的标準格式。因為是基于XML的,是以WSDL既是機器可閱讀的,又是人可閱讀的,這将是一個很大的好處。一些最新的開發工具既能根據你的 Web service生成WSDL文檔,又能導入WSDL文檔,生成調用相應WebService的代理類代碼。

  WSDL 檔案儲存在Web伺服器上,通過一個url位址就可以通路到它。用戶端要調用一個WebService服務之前,要知道該服務的WSDL檔案的位址。 WebService服務提供商可以通過兩種方式來暴露它的WSDL檔案位址:

   1.注冊到UDDI伺服器,以便被人查找;

   2.直接告訴給用戶端調用者。

jfinal實作webService

引入jar:

<dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.2.8</version>
        </dependency>
           

web.xml中添加:

<listener>
        <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>
 
    <servlet>
        <servlet-name>SecWebService</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>SecWebService</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
           

在WEB-INF下建立sun-jaxws.xml:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0"
	xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
	<endpoint
		implementation="cn.ac.sec.webservice.api.SecWebService"
		name="Web1" url-pattern="/services/SecWebService" />
</endpoints>
		
           

修改Jfinal的配置檔案:

public void configHandler(Handlers me) {
    me.add(new UrlSkipHandler(".*/services.*",false));
}
           

實作Webservice的類:

@SOAPBinding(style = Style.RPC)
@WebService
public class SecWebService extends Controller {

    public String servcieApi(@WebParam(name="name")String name) {
        return "Hello, " + name + "!";
    }
}
           

運作,通路 http://127.0.0.1:8080/services/WeixinCase?wsdl, 看是否能得到正常的WSDL檔案

jfinal 基于JAX-WS釋出webService

第三方調用方法

public static void main(String[] args) {
		try {  
	        String endpoint = "http://127.0.0.1:8080/services/SecWebService?wsdl";  
	        // 直接引用遠端的wsdl檔案  
	        // 以下都是套路  
	        Service service = new Service();  
	        Call call = (Call) service.createCall();  
	        call.setTargetEndpointAddress(endpoint);  
	        call.setOperationName(new QName("http://api.webservice.bscomc.sec.ac.cn/","serviceApi"));// WSDL裡面描述的接口名稱  
	        call.addParameter("param",  
	                org.apache.axis.encoding.XMLType.XSD_DATE,  
	                javax.xml.rpc.ParameterMode.IN);// 接口的參數  
	        call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 設定傳回類型  
            String temp = "webService接口調用成功";
	        String result = (String) call.invoke(new Object[] { temp });  
	        // 給方法傳遞參數,并且調用方法  
	        System.out.println("result is " + result);  
	    } catch (Exception e) {  
	        System.err.println(e.toString());  
	    }  
	}
           

繼續閱讀