您的位置:首页 > 其它

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

2014-09-10 09:16 387 查看
基于应用层发布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类,可以看博文/article/8943122.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, 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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: