基于應用層釋出WebService服務
1: 建立業務邏輯類,并且添加@WebService注解, 通過: Endpoint.publish(位址, 端點)
注意: MyEclipse8,10自帶JDK1.6版本釋出WS會報錯
釋出的位址: http://IP位址/名稱 WSDL位址: http://IP位址/名稱?wsdl
2: 采用wsimport 解析WSDL檔案. 格式如下:
wsimport http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL
wsimport -s . http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL
wsimport -s . -p a.b.c http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL
3: 哪些方法,可以 釋出成WS服務的方法 隻有public 修飾(非 final static)的方法,才可以被釋出, 采用注解@WebMethod(exclude=true)
可以取消對public方法的釋出
AJAX: 可以調用WS服務嗎, 必須了解 WSDL 和 SOAP
無論是采用HttpClient 和Java代碼調用、 WSDL浏覽器通路, 傳輸的都是基于XML的SOAP格式,是以如果AJAX直接發送
SOAP格式則應該也可以通路遠端WS服務
通過AJAX 發送SOAP格式,的确可以通路WS服務, 而且傳回來的也是SOAP格式,但是此方法目前已經不推薦使用, 目前的浏覽器很多都支援跨域請求(為了安全)
AJAX調用本地的Java Bean 即可
下面是一個簡單釋出自己WebService的例子:
package com.ws.demo;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/**
自己釋出一個WS服務,給第三方用戶端調用
* 1: 建立一個方法,然後給要釋出的類添加@WebService
* 2: 釋出WebService
*/
@WebService
public class MyWebService {
public String showName(String name){
System.out.println("name:"+name);
return "你好:"+name;
}
/**
* 在main方法中釋出自己的WebService
* @param args
*/
public static void main(String[] args) {
String address="http://127.0.0.1:8888/hello";
/**
* jdk對Endpoint文檔的說明:
* 使用在此類中定義的靜态方法建立端點。一個端點總是綁定到一個 Binding(http://127.0.0.1:8888/hello) 和一個實作者(new MyWebService()),
* 這兩項都是在建立端點時設定的。
* MyWebService 端點(也是WS實作類,類上面必須要有 @WebService
*/
Endpoint.publish(address,new MyWebService());
System.out.println(address+"?wsdl");
}
}
接下來如何把自己釋出的WebService如何通過wsimport指令到處java類,可以看博文 http://blog.csdn.net/chenchudongsg/article/details/39154687
下面是
WSDL(WEB服務描述語言)的圖檔解析:

下面是Ajax通路WebService的例子:
注意的是先要通過wsimport到處WebService服務的java類:截圖如下:
jsp頁面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<script type="text/javascript" src="js/jquery-1.3.js"></script>
<script type="text/javascript">
$(function(){
//這是一種不常用的方法
$("#btn1").click(function(){
$.ajax({
type:"POST",
url:"http://127.0.0.1:8888/hello",// 由于Webservice釋出時是http://127.0.0.1:8888/hello,不可寫成http://localhost:8888/hello
data:"<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'"+
" xmlns:q0='http://demo.ws.com/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' "+
"xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>"+
"<soapenv:Body>"+
"<q0:showName>"+
"<arg0>ddd</arg0>"+
"</q0:showName>"+
"</soapenv:Body>"+
"</soapenv:Envelope>",
success:function(result){
alert($(result).find("return").text());
},
contentType:"text/xml;charset=UTF-8"
});
});
//Ajax請求中常用的方法
$("#btn2").click(function(){
$.post("AjaxServlet",{
name:$("#key").val()
},function(result){
alert(result);
});
});
});
</script>
</head>
<body>
<input type="button" value="跨域沒有權限通路" id="btn1"/>
<input type="button" value="Ajax通路WebService" id="btn2"/>
<form method="post" action="127.0.0.1:7000" >
關鍵字<input type="text" name="key" id="key"><br/>
<input type="submit" value="送出">
</form>
</body>
</html>
寫一個Servlet接受Ajax請求:
package com.client.demo1;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AjaxServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String name=request.getParameter("name");
MyWebServiceService ms=new MyWebServiceService();
MyWebService ws= ms.getMyWebServicePort();
System.out.println(ws.showName(name));
response.getWriter().write(ws.showName(name));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
注解修改WSDL:
package com.ws.demo1;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/**
自己釋出一個WS服務,給第三方用戶端調用
* 1: 建立一個方法,然後給要釋出的類添加@WebService
* 2: 釋出WebService
* 3、如果想要修改WS PORT 名稱、參數 傳回值的名稱,則可以添加相應的注解
*/
@WebService(
name="MyWebService1", // 真正的服務類的名稱,
portName="MyWebServicePort1", // 端口名稱
serviceName="MyWebServiceService1", // 服務名,預設是MyWebService+Service
targetNamespace="a.b.c" // 指定解析存儲類的包名
)
public class MyWebService {
public @WebResult(name="result1") String showName(@WebParam(name="name1") String name){
System.out.println("name:"+name);
return "你好:"+name;
}
/**
* 在main方法中釋出自己的WebService
* @param args
*/
public static void main(String[] args) {
String address="http://127.0.0.1:8888/hello";
/**
* jdk對Endpoint文檔的說明:
* 使用在此類中定義的靜态方法建立端點。一個端點總是綁定到一個 Binding(http://127.0.0.1:8888/hello) 和一個實作者(new MyWebService()),
* 這兩項都是在建立端點時設定的。
* MyWebService 端點(也是WS實作類,類上面必須要有 @WebService
*/
Endpoint.publish(address,new MyWebService());
System.out.println(address+"?wsdl");
}
}