webservice篇之web项目整合(五)

来源:互联网 发布:销售系统源码 编辑:程序博客网 时间:2024/06/12 23:25

这里我们讲解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

  • getName
Endpoint address: http://localhost:6868/webservice-spring/Oders
WSDL : {http://service.azj.com/}orderSeiImpl
Target namespace: http://service.azj.com/productSel
  • getProduct
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);
}
}

这样就可以进行客户端访问拉!

0 0
原创粉丝点击