加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

CXF学习之旅(二)- Hello World

发布时间:2020-12-17 00:18:44 所属栏目:安全 来源:网络整理
导读:这个是参照官方的一个例子,自己练习的,官方的地址:http://cxf.apache.org/docs/writing-a-service-with-spring.html 最近使用Maven新建Web项目和之前的有点儿不一样,不知道为什么,好在能用。以后应该会在Maven的Web项目的基础上学习CXF。 1.pom.xml 首

这个是参照官方的一个例子,自己练习的,官方的地址:http://cxf.apache.org/docs/writing-a-service-with-spring.html


最近使用Maven新建Web项目和之前的有点儿不一样,不知道为什么,好在能用。以后应该会在Maven的Web项目的基础上学习CXF。

1.pom.xml

首先,是pom.xml,添加项目需要的依赖包,这是根据官方的例子整理出来的

<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.deppon.demo.ws</groupId>
	<artifactId>cxf-demo</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>cxf-demo Maven Webapp</name>
	<url>http://maven.apache.org</url>

	<!-- 属性配置 -->
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.10</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxws</artifactId>
			<version>2.7.5</version>
		</dependency>

		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http</artifactId>
			<version>2.7.5</version>
		</dependency>

		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http-jetty</artifactId>
			<version>2.7.5</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>3.1.1.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>3.1.1.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.eclipse.jetty</groupId>
			<artifactId>jetty-webapp</artifactId>
			<version>8.1.11.v20130520</version>
		</dependency>

	</dependencies>

	<build>
		<finalName>cxf-demo</finalName>
	</build>
</project>

2.写一个接口,和一个实现类

我们写一个简单的例子

接口:

package com.deppon.demo.ws.service;

import javax.jws.WebParam;
import javax.jws.WebService;

/**
 * 注意,这里的方法好像不能重载
 * 从网上查,说是CXF不支持方法的重载发布
 * 
 * @author yuguiyang
 *
 */
@WebService
public interface IHelloWorld {
	public String say();
	
	/**
	 * 这里加上了注解@WebParam,注明参数的名称,如果不加的话,
	 * 默认使用arg0......代替,不符合命名规范
	 * @param name
	 * @return
	 */
	public String sayWithName(@WebParam(name="name")String name);
}

实现类:

package com.deppon.demo.ws.service.impl;

import javax.jws.WebService;

import com.deppon.demo.ws.service.IHelloWorld;

/**
 * 这里注明的是,接口的(包名+接口名)
 * @author yuguiyang
 *
 */
@WebService(endpointInterface = "com.deppon.demo.ws.service.IHelloWorld")
public class HelloWorld implements IHelloWorld {

	@Override
	public String say() {
		System.out.println("-------from say().");
		return "Hello World !";
	}

	@Override
	public String sayWithName(String name) {
		System.out.println("---------from say(String).");
		return "你好," + name;
	}

}

3.添加Spring支持

applicationContext.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.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<jaxws:endpoint 
	  id="helloWorld" 
	  implementor="com.deppon.demo.ws.service.impl.HelloWorld" 
	  address="/HelloWorld" />
	  
</beans>

web.xml

这里添加了Spring的监听器和CXF的Servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
         
	<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>
   
   
   <servlet>  
        <servlet-name>CXFServlet</servlet-name>  
            <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>CXFServlet</servlet-name>  
        <url-pattern>/services/*</url-pattern>  
    </servlet-mapping>  
   

</web-app>

4.部署项目

到这里,我们就可以部署项目,看一下了

记得上面,配置的CXF的URL,我们访问一下,看看

这里显示的就是,有效地服务

左侧,是我们的服务的两个方法

右侧,显示的是我们服务的信息

1.Endpoint address,即端口地址,还记得在applicationContext.xml中我们配置服务时

<jaxws:endpoint 
	  id="helloWorld" 
	  implementor="com.deppon.demo.ws.service.impl.HelloWorld" 
	  address="/HelloWorld" />
就是这里的address,加上了项目的地址和CXFServlet的URL,为了验证,我们改一下试试:

<servlet-mapping>  
        <servlet-name>CXFServlet</servlet-name>  
        <url-pattern>/demos/*</url-pattern>  
    </servlet-mapping> 
<jaxws:endpoint 
	  id="helloWorld" 
	  implementor="com.deppon.demo.ws.service.impl.HelloWorld" 
	  address="/demo01" />
重新部署项目之后:

可以看到,端口地址就变了,

PS:注意,为了保持一致,我又改了回去。

2.现在,看右侧的WSDL:是一个链接,我们点一下,会出现这样的页面:


3.还记得我们在写接口的时候,使用了注解@WebParam吗,从哪里可以看到呢?

看上面的文件的第二行:

<wsdl:import location="http://localhost:8080/cxf-demo/services/HelloWorld?wsdl=IHelloWorld.wsdl" namespace="http://service.ws.demo.deppon.com/">
    </wsdl:import>

我们复制一下location,访问以下,会是这样的:

看上面标注的地方,就是这里了。可以试着,不写注解WebParam或者修改问其他的名字试试。

5.测试

测试的话,也是根据官方的例子,写的

首先需要一个Spring的配置文件

client-beans.xml

clientFactory是CXF提供的一个类,他需要2个参数,一个是服务接口的地址,一个是服务的端口地址

<?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:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schema/jaxws.xsd">

    <bean id="client" class="com.deppon.demo.ws.service.IHelloWorld" 
          factory-bean="clientFactory" factory-method="create"/>
    
    <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
        <property name="serviceClass" value="com.deppon.demo.ws.service.IHelloWorld"/>
        <property name="address" value="http://localhost:8080/cxf-demo/services/HelloWorld"/>
    </bean>
	  
</beans>

Client.java

package com.deppon.demo.ws.client;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.deppon.demo.ws.service.IHelloWorld;

public class Client {

	@Test
	public void test() {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "client-beans.xml" });

		IHelloWorld client = (IHelloWorld) context.getBean("client");

		String response = client.say();
		System.out.println("Response: " + response);

		response = client.sayWithName("路飞");
		System.out.println("Response: " + response);
	}
}

服务器端,也会有输出:


到这里,我们的第一个例子就写完了。

项目的整理结构如图:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读