这里我们讲解web项目开发webservice接口,与spring,tomcat,cxf的整合连用
第一步:创建web项目
第二步:导入spring与cxf的jar包
第三部:创建接口与实现类
接口类:
package com.azj.service;
import javax.jws.WebService;
@WebService
public interface oderSel {
public String getName(String name);
}
实现类:
package com.azj.service;
import javax.jws.WebService;
@WebService(endpointInterface="com.azj.service.oderSel",serviceName="orderSeiImpl")
public class orderSeiImpl implements oderSel {
@Override
public String getName(String name) {
return "你好:"+name;
}
}
第四步:编写服务端拦截器
package com.azj.service;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;
public class MessageInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
public MessageInterceptor() {
super(Phase.PRE_PROTOCOL);
}
@Override
public void handleMessage(SoapMessage ms) throws Fault {
Header header = ms.getHeader(new QName("azj"));
Element el = (Element) header.getObject();
String name = el.getElementsByTagName("name").item(0).getTextContent();
String pwd = el.getElementsByTagName("pwd").item(0).getTextContent();
if("admin".equals(name) && "admin".equals(pwd)){
System.out.println("验证成功!");
}
}
}
第五步:创建配置
applicationContext.xml
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" /> <!-- 这里用的3.16cxf,所以导入一个就可以啦,2.7的好像需要用3个,你可以收索看下 -->
<!-- 这里你可以发布多个,前提必须与你所编码的接口与实现类相对应,我这里就发布一个接口-->
<jaxws:endpoint id="oders" implementor="com.azj.service.orderSeiImpl" address="/Oders"><!-- 这里是发布的地址 -->
<jaxws:inInterceptors><!-- 这里是对拦截器的定义 -->
<bean class="com.azj.service.MessageInterceptor"/><!-- 拦截器的的路径-->
</jaxws:inInterceptors>
</jaxws:endpoint>
</beans>
第六步:配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>webservice-spring</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!--所有来自/*的请求,都交由 CXFServlet来处理-->
<servlet>
<servlet-name>HelloWorldService</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldService</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
然后你用tomcat启动下,就可以啦。
效果如下:
Available SOAP services:
oderSel
| Endpoint address: http://localhost:6868/webservice-spring/Oders WSDL : {http://service.azj.com/}orderSeiImpl Target namespace: http://service.azj.com/ |
productSel
| Endpoint address: http://localhost:6868/webservice-spring/Products WSDL : {http://service.azj.com/}productSeiImpl Target namespace: http://service.azj.com/ |
发布了,怎么进行访问呢?
第一步:把生成的wsdl文档,生成相关的代码类
第二步:编写客户端接受类
这里有两种方式,但都通用客户端拦截器类loginInterceptor.java
拦截器类:
package com.client.oders;
import java.util.List;
import javax.xml.crypto.dom.DOMURIReference;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class loginInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private String name;
private String pwd;
//实现构造,并对name,pwd赋值
public loginInterceptor(String name,String pwd) {
super(Phase.PRE_PROTOCOL);
this.name=name;
this.pwd=pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public void handleMessage(SoapMessage mes) throws Fault {
//创建Document对象 运用DOMUtils
List<Header> headers = mes.getHeaders();
Document doc = DOMUtils.createDocument();
//创建element对象
Element Element = doc.createElement("azj");
//此处创建的元素应该按照服务器那边的要求
Element nameElement = doc.createElement("name");
nameElement.setTextContent(name);
Element pwdElement = doc.createElement("pwd");
pwdElement.setTextContent(name);
//添加进入标签
Element.appendChild(nameElement);
Element.appendChild(pwdElement);
//增加一个名为azj的header
headers.add(new Header(new QName("azj"), Element));
}
}
1)通过生成的代码进行调用:
package com.client.oders;
public class clientTest {
public static void main(String[] args) {
OrderSeiImpl od=new OrderSeiImpl();//wsdl生成的相关类
OderSel proxy = od.getOrderSeiImplPort();
Client client = ClientProxy.getClient(proxy);
client.getOutInterceptors().add(new loginInterceptor("admin","admin")); //编写的客户端拦截器
String name = proxy.getName("azj");
System.out.println(name);
}
}
2)通过xml文件进行调用
applicationclient.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:client id="client" serviceClass="com.client.oders.OderSel" address="http://localhost:8080/webservice-spring/Oders"><!-- wsdl生成的接口类以及访问地址-->
<jaxws:outInterceptors><!-- 客户端的输出拦截器 及携带的参数-->
<bean class="com.client.oders.loginInterceptor">
<constructor-arg name="name" value="admin"/>
<constructor-arg name="pwd" value="admin"/>
</bean>
</jaxws:outInterceptors>
</jaxws:client>
</beans>
发布类:
package com.client.oders;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class clientTest {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationclient.xml");
OderSel se = (OderSel) ac.getBean("client");
String name = se.getName("rainjm");
System.out.println(name);
}
}
这样就可以进行客户端访问拉!