@ruoli
2016-10-14T02:21:59.000000Z
字数 4618
阅读 3716
Java基础
JAX-WS(Java API for XML Web Services)规范是SUN公司提供的一套实现Webservice远程交互的技术,是JDK1.6+原生支持的轻量级实现。
工程必须依赖JDK1.6+
此处工程名为:Ws-Sever
不需依赖其它外部Jar
package server;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;@WebService@SOAPBinding(style = SOAPBinding.Style.RPC)public class DemoService{@WebMethodpublic String sayHello(@WebParam(name="name") String name) {return "hello,"+name;}@WebMethodpublic int plus(@WebParam(name="x") int x, @WebParam(name="y") int y) {return x + y;}}
package server;import javax.xml.ws.Endpoint;public class WsServer {/*** @param args*/public static void main(String[] args) {DemoService plus = new DemoService();String addr = "http://127.0.0.1:8888/DemoService";Endpoint.publish(addr, plus);}}
启动此main方法,在浏览器中访问:
http://127.0.0.1:8888/DemoService?wsdl即可看到wsdl信息。
经过SoapUI测试,响应符合预期。
代码量较少,不提供示例工程。
Jax-ws 还提供了了更多注解用户方便开发,详细可自行查阅。
也可详细参考:
http://www.cnblogs.com/adolfmc/p/4383091.html
基于Spring IoC容器发布Web服务,能够大大降低WebService实现过程,也能够更好的与企业级应用进行整合,spring本身就提供了对JAX-WS的支持,以下介绍如何基于Spring和JAX-WS发布WebService。
此处命名为:Jaxws-Spring ,并在pom.xml中添加如下内容:
<dependency><groupId>org.springframework.ws</groupId><artifactId>spring-ws-core</artifactId><version>2.1.4.RELEASE</version></dependency><dependency><groupId>org.jdom</groupId><artifactId>jdom</artifactId><version>1.1</version></dependency><dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.1.6</version></dependency>
HelloWorld.Java
package jaxws;import javax.jws.WebMethod;import javax.jws.WebService;@WebServicepublic interface HelloWorld {@WebMethodpublic String sayHello(String name);}
HelloWorldImpl.java
package jaxws;import javax.jws.WebService;import org.springframework.stereotype.Component;@Component@WebService(serviceName = "HelloWorldService", endpointInterface = "jaxws.HelloWorld")public class HelloWorldImpl implements HelloWorld{public String sayHello(String name) {return "Hello," + name;}}
需要注意的是:在实现类中添加了注解@Component,该注解用于Spring查找组件。
在web.xml文件中添加spring的监听器配置信息,如下:
<web-app><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:jaxws-beans.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener></web-app>
在项目构建根路径classpath下新增配置文件jaxws-beans.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"><context:component-scan base-package="jaxws"></context:component-scan><bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter"><property name="baseAddress" value="http://localhost:8089/services/"/></bean></beans>
注意:context:component-scan标签指定了查找组件的包名,SimpleJaxWsServiceExporter类的baseAddress属性用于指定webservice的根路径,完整的web服务地址=根路径+WebService名称。
访问地址为:http://localhost:8089/services/HelloWorldService?wsdl 即可看见wsdl信息。
访问密码:6m5l
Handler和Servlet中的filter极为相似,我们可以对所有WebServicer进行拦截,在这个Handler中我们可以记录日志、权限控制、对请求的SOAP消息进行加密,解密等。
具体实现方式如下:
此处新建AuthValidationHandler.java,示例如下:
package server;import java.util.Set;import javax.xml.namespace.QName;import javax.xml.soap.SOAPEnvelope;import javax.xml.soap.SOAPMessage;import javax.xml.ws.handler.MessageContext;import javax.xml.ws.handler.soap.SOAPHandler;import javax.xml.ws.handler.soap.SOAPMessageContext;public class AuthValidationHandler implements SOAPHandler<SOAPMessageContext> {public Set<QName> getHeaders() {return null;}public void close(MessageContext context) {// 每次webService请求调用结束时会调用,通常会做释放资源的操作}public boolean handleFault(SOAPMessageContext context) {// 每当handlerMessage发生异常时,会调用return false;}public boolean handleMessage(SOAPMessageContext context) {try{//更改返回报文的输出头前缀SOAPMessage soapMessage = context.getMessage();SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();soapEnvelope.setPrefix("soapenv");soapEnvelope.getBody().setPrefix("soapenv");soapEnvelope.getBody().getFirstChild().setPrefix("soa");}catch(Exception exception){exception.printStackTrace();}return true;}}