为方便打大家学习以及应用,还是从配置文件、jar、bean开始扯起。。。。。。
1,web.xml 配置文件基本配置
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring MVC Application</display-name>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-cxf.xml</param-value>
</context-param>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!--spring 集成cxf web配置-->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<!-- CXFServlet Mapping -->
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/cxf/*</url-pattern>
</servlet-mapping>
</web-app>这里配置的cxf servlet的对应关系,我的拦截路径是/cxf/ 下的所有url。
2,pom.xml 配置文件,添加cxf开发需要的maven依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.springapp</groupId>
<artifactId>WebCxf</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>WebCxf</name>
<properties>
<spring.version>4.1.1.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--CXF 依赖-->
<!-- https://mvnrepository.com/artifact/org.apache.cxf/apache-cxf -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>apache-cxf</artifactId>
<version>3.1.10</version>
</dependency>
</dependencies>
<build>
<finalName>WebCxf</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*Tests.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
</project>3,简单的spring配置文件,这里不多讲了。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--注解驱动-->
<mvc:annotation-driven/>
<context:component-scan base-package="com.spring"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>4,针对cxf 实现的需要,增加spring-cxf.xml 配置文件,这里在web.xml 里已经做了引入
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<!-- Import Apache CXF Bean Definition -->
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<!--<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>-->
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<!--模拟服务端① webservice-->
<bean id="hello" class="com.spring.service.impl.HelloWordServiceImpl"/>
<!--implementor="#hello" 指向bean id="hello"-->
<jaxws:endpoint id="helloWorld" implementor="#hello" address="/helloWorld" />
<!--模拟服务端②-->
<bean id="user" class="com.spring.service.impl.UserServiceImpl"/>
<jaxws:endpoint id="userPoint" implementor="#user" address="/user"/>
<!--模拟客户端①-->
<jaxws:client id="client"
serviceClass="com.spring.service.IHelloWord"
address="http://localhost:8080/cxf/helloWorld" />
<!--模拟客户端②-->
</beans>这里demo应用的是<!--模拟服务端②-->的这个配置,其他与当前的demo没有关系。
5,针对xml格式的数据 实现的工具封装的实现。
package com.spring.utils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*生成xml格式的文件
* 解释xml格式的字符串
*/
public class XMLHandler {
/**
* 创建xml
* @return
*/
public static String createXML(){
String xmlStr="";
//doc 的工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try{
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
document.setXmlVersion("1.0");
//
Element root = document.createElement("root");
document.appendChild(root);
//
Element user = document.createElement("user");
//
Element id = document.createElement("id");
id.setTextContent("1");
user.appendChild(id);
//
Element name = document.createElement("name");
name.setTextContent("张三");
user.appendChild(name);
//
Element sex = document.createElement("sex");
sex.setTextContent("男");
user.appendChild(sex);
//
root.appendChild(user);
//
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transFormer = transFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
//export string
ByteArrayOutputStream bos = new ByteArrayOutputStream();
transFormer.transform(domSource, new StreamResult(bos));
xmlStr = bos.toString();
System.out.println("输出结果"+xmlStr);
//通过输出流输出
File file = new File("D:/out/user.xml");
if(!file.exists()){
file.createNewFile();
}
FileOutputStream out = new FileOutputStream(file);
StreamResult xmlResult = new StreamResult(out);
transFormer.transform(domSource, xmlResult);
}catch(Exception e){
e.printStackTrace();
}
return xmlStr;
}
/*public static void main(String[] args) {
createXML();
}*/
/**
* 转化xml格式的字符串
* <?xml version="1.0" encoding="UTF-8" standalone="no"?>
* <root>
* <user>
* <id>1</id>
* <name>张三</name>
* <sex>男</sex>
* </user>
* </root>
*/
public static List<Map<String,Object>> parseXML(String xmlStr){
List<Map<String,Object>> list=null;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try{
DocumentBuilder builder = factory.newDocumentBuilder();
StringReader sr = new StringReader(xmlStr);
InputSource is = new InputSource(sr);
Document doc = builder.parse(is);
//
Element rootElement = doc.getDocumentElement();
//
NodeList users = rootElement.getElementsByTagName("user");
//
list=new ArrayList<Map<String, Object>>();
for(int i=0;i<users.getLength();i++){
Node node = users.item(i);
NodeList childs = node.getChildNodes();
Map<String,Object> map=new HashMap<String, Object>();
for(int j=0;j<childs.getLength();j++){
Node childNode = childs.item(j);
String nodeName=childNode.getNodeName();
String value=childNode.getTextContent();
map.put(nodeName,value);
}
list.add(map);
}
}catch(Exception e){
e.printStackTrace();
}
return list;
}
/*public static void main(String[] args) {
String xmlStr="<?xml version='1.0' encoding='UTF-8' standalone='no'?><root><user><id>1</id><name>张三</name><sex>男</sex></user></root>";
List<Map<String, Object>> list = parseXML(xmlStr);
System.out.println("======"+list.toString());
}*/
}
6,定义一个接口实现类,注意该class的注解。
package com.spring.service;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
*
*/
@WebService
public interface IUser {
//获取xml格式的数据
/**
* 根据传递的条件获取相册信息
* xml的格式规范
* <?xml version="1.0" encoding="UTF-8" standalone="no"?>
* <root>
* <user>
* <id>1</id>
* <name>张三</name>
* <sex>男</sex>
* </user>
* </root>
* 这里的WebParam必须指定,否则调用的时候返回null
* @return
*/
String getUser(@WebParam(name = "xmlStr")String xmlStr);
}
7,实现该接口,注意注解的应用。
package com.spring.service.impl;
import com.spring.service.IUser;
import com.spring.utils.XMLHandler;
import javax.jws.WebService;
import java.util.List;
import java.util.Map;
/**
*
*/
@WebService
public class UserServiceImpl implements IUser {
@Override
public String getUser(String xmlStr) {
List<Map<String, Object>> list = XMLHandler.parseXML(xmlStr);
return list.toString();
}
}
8,main方法测试。
package com.spring.test;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import javax.xml.namespace.QName;
/**
*
*/
public class TestClientCxf {
public static void main(String[] args) throws Exception {
String xmlStr="<?xml version='1.0' encoding='UTF-8' standalone='no'?><root><user><id>1</id><name>张三</name><sex>男</sex></user></root>";
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:8080/cxf/user?wsdl");
//url为调用webService的wsdl地址
QName name=new QName("http://service.spring.com/","getUser");
//paramvalue为参数值
Object[] objects=client.invoke(name,xmlStr);
//调用web Service//输出调用结果
System.out.println("输出结果:"+objects[0].toString());
/*User user = new User(xmlStr);
Object obj = user.getUser();
System.out.println("========="+obj.toString());*/
}
}
这里注意:url 调用的webService的wsdl的地址 为浏览器访问http://localhost:8080/cxf/user?wsdl路径产生的,cxf的服务端搭建是否成功,需要再浏览器访问一下你的配置路径,/user 定义在spring-cxf.xml 的配置文件 <jaxws:endpoint id="userPoint" implementor="#user" address="/user"/>效果图://url为调用webService的wsdl地址
QName name=new QName("http://service.spring.com/","getUser");图中标注的就是命名空间,getUser 指的是接口的中定义的方法名称。
到这里基本就算结束了,总结的不够精细,还望担待。

版权声明:本文为weixin_37852133原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。