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檔案
第三方調用方法
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());
}
}