天天看點

WebService之釋出自己的WebService例子以及WSDL解析,Ajax通路WebService以及注解修改WSDL

基于應用層釋出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服務描述語言)的圖檔解析:

WebService之釋出自己的WebService例子以及WSDL解析,Ajax通路WebService以及注解修改WSDL

下面是Ajax通路WebService的例子:

 注意的是先要通過wsimport到處WebService服務的java類:截圖如下:

WebService之釋出自己的WebService例子以及WSDL解析,Ajax通路WebService以及注解修改WSDL

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");
	}
}