Intellij IDEA開發WebService步驟例項
Intellij IDEA開發WebService步驟例項
以“基本運算服務的開發與部署。具體內容:實現加、減、乘、除、平方、開平方等常用數學運算 webservice”為例介紹
1)新建專案
a.進入File > New Project…選單開啟新建專案視窗,依次選擇Java、WebServices,Version項選擇Apache Axis,Libraries項選擇 Download。然後點選Next按鈕進入下一頁
(注意:1.要確保電腦聯網,勾選DownLoad是為了下載必要的jar報,這個是需要聯網下載的,否則後面的實驗很難進行 2.Version一項改為 Apache Axis)
b.在下一頁中輸入專案名稱,然後點選Finish按鈕開始下載依賴包。依賴包下載完成後進入新建的專案,選擇專案檔案存放位置,自定義專案名。
2)專案初始結構(有一個自動生成的Java類–HelloWorld)
3)生成WSDL檔案
a.可以修生成的HelloWorld檔案內容,實現常用算數運算,或者自己另外建立一個類編寫原始碼實現常用算數運算(我是直接修改的HelloWorld)
package example; public class HelloWorld { public double add(double a, double b) { return a + b; } public double minus(double a, double b) { return a - b; } public double multiply(double a, double b) { return a * b; } public double divide(double a, double b) { return a / b; } public double power(double a) { return a*a; } public double sqrt(double a) { if (a < 0) { System.out.println("開方數要大於0"); return 0; } else { return Math.sqrt(a); } } }
b.在HelloWorld.java檔案上點選右鍵,選WebServices -> Generate Wsdl From Java Code 。在彈出的窗口裡點OK。
c.這時會發現在專案結構目錄裡多了一個HelloWorld.wsdl檔案。
4)配置Tomcat伺服器及專案結構
a.選擇Run > Edit Configurations…選單,開啟Run/Debug Configurations視窗。
b.在Run/Debug Configurations窗口裡新增+按鈕,在出現的選單裡選擇Tomcat Server > Local。如果看不到Tocmat Server選單項,則點選最下面的29 items more (irelevant)…選單項查詢。
c.然後在新增的Tomcat Server配置頁面中新增配置的Name、Application server和HTTP Port。如果Application server為空,將本地的 Tomcat 安裝地址新增進來。如果本地沒有,從網上下載 Tomcat 7:https://tomcat.apache.org/download-70.cgi
這時配置頁面底部可能會顯示有Warning:No Artifacts marked for deployment(警告:沒有標記要部署的產物)。
點選警告資訊右側的Fix…按鈕切換到Deployment標籤頁。
d.在Deployment標籤頁點選Deploy at the server startup區的+按鈕,選擇Artifacts。
e.新增 Artifact 後的介面如下,已經沒有警告了。點選OK完成執行引數的配置。
f.到這個時候,然後可以執行起服務了,但是訪問服務頁面時還是會報錯。因為還要給部署的 Artifact 新增 Apache Axis 包的依賴。
選擇File> Project Structure…選單。
g.在出現的視窗中選擇Project Settings > Artifacts,會到在新的警告資訊。點選警告資訊右側的Fix…按鈕。
h.在彈出選單裡選擇Add ‘JAX-WS-Apache Axis’ to the artifact。
i.修復完成後警告消失。
5)啟動Tomcat檢視wsdl
a.點選工具欄上的執行或除錯按鈕執行服務。
b.在瀏覽器裡輸入:
http://localhost:8080/services
訪問結果如下:
d.點選HelloWorld(wsdl)能正常檢視wsdl的內容則釋出成功。伺服器端完成。
6)編寫客戶端程式碼呼叫服務
package test;
import org.apache.axis.utils.StringUtils;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class CalculateClient {
public static void main(String[] args) {
// 指定呼叫WebService的URL(這裡是我們釋出後點擊HelloWorld)
String url = "http://localhost:8080/services/HelloWorld?wsdl";
//呼叫的方法
String method = "add";
//呼叫方法的引數列表
Object[] parms = new Object[]{2.0,3.0};
CalculateClient calculateClient = new CalculateClient();
//呼叫方法
String svrAddResult = calculateClient.CallMethod(url, method, parms);
System.out.println(svrAddResult);
String svrMinusResult = calculateClient.CallMethod(url, "minus", new Object[]{5.0,2.0});
String svrMultiplyResult = calculateClient.CallMethod(url, "multiply", new Object[]{2.0,3.0});
String svrDivideResult = calculateClient.CallMethod(url, "divide", new Object[]{8.0,5.0});
String svrPowerResult = calculateClient.CallMethod(url, "power", new Object[]{5.0});
String svrSqrtResult = calculateClient.CallMethod(url, "sqrt", new Object[]{9.0});
System.out.println("5.0 - 2.0 is " + svrMinusResult);
System.out.println("2.0 * 3.0 is " + svrMultiplyResult);
System.out.println("8.0 - 5.0 is " + svrDivideResult);
System.out.println("5.0^2 is " + svrPowerResult);
System.out.println("9.0^(1/2) is " + svrSqrtResult);
}
//實現WebService上釋出的服務呼叫
public String CallMethod(String url, String method, Object[] args) {
String result = null;
if(StringUtils.isEmpty(url)) {
return "url地址為空";
}
if(StringUtils.isEmpty(method)) {
return "method地址為空";
}
Call rpcCall = null;
try {
//例項websevice呼叫例項
Service webService = new Service();
rpcCall = (Call) webService.createCall();
rpcCall.setTargetEndpointAddress(new java.net.URL(url));
rpcCall.setOperationName(method);
//執行webservice方法
double rslt = (double) rpcCall.invoke(args);
result = String.valueOf(rslt);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
7)執行客戶端程式檢視結果
可能會遇到的問題:
1.在啟動Tomcat後,執行客戶端程式碼遇到錯誤:“org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.”
解決辦法:找到web->WEB-INF下的server-config.wsdd檔案定位到下面的內容做修改:
去掉紅框部分
2.地洞Tomcat後,在瀏覽器輸入http://http://localhost:8080/services結果為404
解決辦法:在WEB-INF下新建web.xml檔案並複製以下內容到web.xml(若有這個檔案可直接修改為以下內容)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Apache-Axis</display-name>
<servlet>
<display-name>Apache-Axis Servlet</display-name>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet>
<display-name>Axis Admin Servlet</display-name>
<servlet-name>AdminServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<display-name>SOAPMonitorService</display-name>
<servlet-name>SOAPMonitorService</servlet-name>
<servlet-class>org.apache.axis.monitor.SOAPMonitorService</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5101</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/servlet/AdminServlet</url-pattern>
</servlet-mapping>
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
</web-app>