JAX-WS(java WebService程式設計)第一篇
阿新 • • 發佈:2019-02-18
1.通過MyEclipse建立基於JAX-WS的WebService
1.1建立webService服務端專案
如圖中所示建立一個WebService專案1.1建立服務類
1.1.1建立一個普通類
在建立了WebService專案後,我們便可以在專案中建立我們自己的類了。 我們建立一個Products.java類,在其中有一個public方法通過這個方法,我們可以取得一個書名的list列表public List<String> getAllProduct(){ List<String> product = new ArrayList<String>(); product.add("java核心技術"); product.add("javaEE開發速成"); product.add("SOA面向方面架構"); return product; }
1.1.2將類釋出為webService服務類
選中WebService專案,單擊滑鼠右鍵new一個web service(如下圖所示),因為我們建立的是服務端,所以我們選擇Web Service選項 單擊next,如下圖所示,因為我們建立的是基於JAX-WS的專案,所以在framework處選擇JAX-WS,在Strategy的選擇上,我們選擇從java類建立服務類,所以選擇第二個。 選擇需要轉換成服務的java類,如果我們選中Generate WSDL in project 那麼IDE會在我們專案的WEB-INF下,建立一個wsdl資料夾,其中儲存生成的wsdl檔案和xsd檔案.我們也可以不選。點選Finish後,我們完成了對服務類的建立。 在完成了對服務類的建立後,我們可以看到在Products.java的源包下多了一個ProductsDelegate.java檔案。 在WEB-INF資料夾中也多了一個sun-jaxws.xml,其程式碼為:
<?xml version = "1.0"?> <endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"> <endpoint name="ProductsPort" implementation="cn.ls.webservice.ProductsDelegate" url-pattern="/ProductsPort"> </endpoint> </endpoints>
同時在web.xml檔案中也自動添加了程式碼:
<servlet>
<description>JAX-WS endpoint - ProductsService</description>
<display-name>ProductsService</display-name>
<servlet-name>ProductsService</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>ProductsService</servlet-name>
<url-pattern>/ProductsPort</url-pattern>
</servlet-mapping>
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
每新增一個服務類,都需要在這兩個檔案中進行註冊,當然myeclipse會自動幫助我們完成這項工作。啟動伺服器,在伺服器啟動成功後,在位址列中輸入http://luosheng:8080/WebService/ProductsPort?wsdl就可以看到瀏覽器中顯示:
這是表示我們的服務類啟用成功了。
1.2建立客戶端專案
由於我們只需要檢視能否訪問服務端程式獲取資訊,所以在這裡我們只需要建立一個java專案即可。 在建立了一個java專案後,選中新建立的java專案,按照建立服務類的方式,建立客戶端,不過在選擇建立內容的時候選擇web service client,如下圖所示:如下圖所示,我們需要選擇WSDl檔案,這裡有兩種方式供我們選擇一種是訪問本地wsdl檔案,一種是通過訪問網路地址來獲取wsdl檔案,圖中我們是以網路地址來獲取wsdl檔案,然後我們需要選擇生成的客戶端類檔案的儲存地址圖中,我們儲存在了cn.ls.client包中,如果我們沒有建立包,那麼可以通過new鍵來建立包。點選next建立客戶端類。 在完成建立後,我們可以在client包中看到剛剛生成的java類。 此時,我們可以通過編寫一個main方法來驗證我們能否成功的呼叫服務端的服務程式。main方法的程式碼為:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
ProductsDelegate products = new ProductsService().getProductsPort();
for(String str:products.getAllProduct()){
System.out.println(str);
}
}
}
執行成功後我們可以看到在控制太成功的列印除了產品資訊:
這樣我們就成功的完成了一次簡單的基於JAX-WS的web service程式設計
2.基於手動的編寫JAX-WS的WebService
在第一節中,我們是通過myeclipse來編譯和生成的webService程式碼檔案,那麼怎麼來通過手動的方式來建立web服務呢!接下來我們就來看看。2.1手動編譯建立服務端類
2.1.1建立編譯服務類
我們還是以剛剛的專案來進行講解。在建立好Products.java類後,如果要通過手動的方式將其變為服務類,還需要對Products.java檔案進行註解。@WebService
public class Products {
@WebMethod
public List<String> getAllProduct(){
List<String> product = new ArrayList<String>();
product.add("java核心技術");
product.add("javaEE開發速成");
product.add("SOA面向方面架構");
return product;
}
}
在程式碼中,@WebService將Products類標註為web服務類,@WebMethod將方法getAllproduct標註為服務類。完成上述步驟後,我們就通過手動的方式來生成相應的wsdl等檔案。開啟系統的cmd介面。進入到專案目錄下。
我們通過命令wsgen來生成相應的wsdl等檔案。如下圖所示:(在執行時需要現在專案下建立wsdl和wssrc兩個資料夾,否則會報錯)
其中:
-wsdl引數代表生成webservice
- s引數代表生成的.java檔案置於何處
-d 引數代表生成的編譯class檔案置於何處(這個可以忽略,我們利用eclipse編譯)
-r 引數代表生成的.wsdl檔案與.xsd檔案生成在何處
-cp引數代表classpath,即Hello.class的所在,為什麼我們的-cp後是這麼長一個路徑呢?請看Eclipse裡工程編譯輸出目錄的路徑就知道了:
完成後,重新整理專案,此時我們可以看到專案中的wsdl資料夾和wssrc資料夾下多出了一些檔案。
我們將wssrc下的檔案拷貝到src下。
2.1.2配置,部署服務類
由於我們是手動生成的服務類,所以我們還需要手動的去修改web.xml和在WEB-INF資料夾下新增sun-jaxws.xml檔案,之前這些工作都是myeclipse幫我們做的。
修改web.xml新增如下程式碼:
<servlet>
<servlet-name>ProductsService</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>ProductsService</servlet-name>
<url-pattern>/ProductsPort</url-pattern>
</servlet-mapping>
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
建立sun-jaxws.xml檔案
<?xml version = "1.0"?>
<endpoints version="2.0"
xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint name="ProductsPort"
implementation="cn.ls.webservice.Products"
url-pattern="/ProductsPort">
</endpoint>
</endpoints>
完成上述步驟後,執行專案,訪問地址相應地址,如http://-luosheng:8080/WebService/ProductsPort?wsdl,能夠在瀏覽器中正確的檢視wsdl檔案,即表示建立成功。
2.2通過服務端的wsdl和xsd檔案生成客戶端java類
將服務端生成的wsdl檔案和xsd檔案拷貝到客戶端專案下,我們通過命令wsimport來完成對客戶端java的生成。 在cmd介面進入客戶端專案資料夾。執行如下圖所示命令:重新整理專案,即可看到生成的服務端java類。通過main方法執行生成的類:
/**
* @param args
*/
public static void main(String[] args) {
Products products = new ProductsService().getProductsPort();
for(String str:products.getAllProduct()){
System.out.println(str);
}
}
此時執行main方法,程式會報錯,為什麼呢?我們開啟ProductsService.java類,可以看到
@WebServiceClient(name = "ProductsService", targetNamespace = "http://webservice.ls.cn/", wsdlLocation = "file:/F:/workspace/WebClient/wsdl/ProductsService.wsdl")
和
static {
URL url = null;
try {
URL baseUrl;
baseUrl = cn.ls.webservice.ProductsService.class.getResource(".");
url = new URL(baseUrl, "file:/F:/workspace/WebClient/wsdl/ProductsService.wsdl");
} catch (MalformedURLException e) {
logger.warning("Failed to create URL for the wsdl Location: 'file:/F:/workspace/WebClient/wsdl/ProductsService.wsdl', retrying as a local file");
logger.warning(e.getMessage());
}
PRODUCTSSERVICE_WSDL_LOCATION = url;
}
通過這兩段程式碼,我們看到在第一段的wsdlLocation和第二段的url中,均為file:/F:/workspace/WebClient/wsdl/ProductsService.wsdl,這是表示的程式執行時,程式獲取wsdl檔案的地址,在這裡我們需要對她進行修改,修改為我們伺服器端相應的wsdl地址,如:http://luosheng:8080/WebService/ProductsPort?wsdl,修改後我們再執行程式,即可以成功的看到正確的執行結果了!