天天看点

jfinal 基于JAX-WS发布webService

webservice介绍

     WebService是一种跨编程语言和跨操作系统平台的远程调用技术。

     WebService平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,WebService平台 必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。Web service平台必须提供一种标准来描述 Web service,让客户可以得到足够的信息来调用这个Web service。最后,我们还必须有一种方法来对这个Web service进行远 程调用,这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性,这种RPC协议还必须与平台和编程语言无关

WebService平台技术 -- WSDL

        WSDL(Web Services Description Language)就是这样一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都 能理解的标准格式。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的 Web service生成WSDL文档,又能导入WSDL文档,生成调用相应WebService的代理类代码。

  WSDL 文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。 WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:

   1.注册到UDDI服务器,以便被人查找;

   2.直接告诉给客户端调用者。

jfinal实现webService

引入jar:

<dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.2.8</version>
        </dependency>
           

web.xml中添加:

<listener>
        <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>
 
    <servlet>
        <servlet-name>SecWebService</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>SecWebService</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
           

在WEB-INF下创建sun-jaxws.xml:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0"
	xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
	<endpoint
		implementation="cn.ac.sec.webservice.api.SecWebService"
		name="Web1" url-pattern="/services/SecWebService" />
</endpoints>
		
           

修改Jfinal的配置文件:

public void configHandler(Handlers me) {
    me.add(new UrlSkipHandler(".*/services.*",false));
}
           

实现Webservice的类:

@SOAPBinding(style = Style.RPC)
@WebService
public class SecWebService extends Controller {

    public String servcieApi(@WebParam(name="name")String name) {
        return "Hello, " + name + "!";
    }
}
           

运行,访问 http://127.0.0.1:8080/services/WeixinCase?wsdl, 看是否能得到正常的WSDL文件

jfinal 基于JAX-WS发布webService

第三方调用方法

public static void main(String[] args) {
		try {  
	        String endpoint = "http://127.0.0.1:8080/services/SecWebService?wsdl";  
	        // 直接引用远程的wsdl文件  
	        // 以下都是套路  
	        Service service = new Service();  
	        Call call = (Call) service.createCall();  
	        call.setTargetEndpointAddress(endpoint);  
	        call.setOperationName(new QName("http://api.webservice.bscomc.sec.ac.cn/","serviceApi"));// WSDL里面描述的接口名称  
	        call.addParameter("param",  
	                org.apache.axis.encoding.XMLType.XSD_DATE,  
	                javax.xml.rpc.ParameterMode.IN);// 接口的参数  
	        call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 设置返回类型  
            String temp = "webService接口调用成功";
	        String result = (String) call.invoke(new Object[] { temp });  
	        // 给方法传递参数,并且调用方法  
	        System.out.println("result is " + result);  
	    } catch (Exception e) {  
	        System.err.println(e.toString());  
	    }  
	}
           

继续阅读