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"); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |