加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService之发布自己的WebService例子以及WSDL解析,Ajax访问Web

发布时间:2020-12-16 23:22:22 所属栏目:安全 来源:网络整理
导读:基于应用层发布WebService服务 1: 创建业务逻辑类,并且添加@WebService注解,通过: Endpoint.publish(地址,端点) ? ? 注意: MyEclipse8,10自带JDK1.6版本发布WS会报错 ? ? 发布的地址: ?http://IP地址/名称 ? ? ? WSDL地址: ?http://IP地址/名称?wsdl 2: 采用
基于应用层发布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://www.voidcn.com/article/p-cocwlskc-po.html

下面是

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,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服务,然后给要发布的类添加@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实现类,new MyWebService());
		System.out.println(address+"?wsdl");
	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读