文档章节

基于J2EE应用发布WebService服务

蜡笔小小小新
 蜡笔小小小新
发布于 2015/12/27 20:17
字数 1274
阅读 158
收藏 16
点赞 0
评论 0

1介绍

CXF号称是SOA框架,上一篇已经简单介绍了下WebService和CXF,这篇不再累述.

可能下面这张图可以很清楚地说明WebService在J2EE系统间的作用,比如系统间信息交互,或者新旧系统的整合等等.


2开发WebService服务端(提供服务的系统)

2.1新建项目

新建一个WEB项目,并且导入Spring和CXF至少所需要的JAR包,下面是这个项目的JAR,不过最好用maven管理这些依赖.

2.2搭建Spring+CXF环境

编写web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>SpringCXF_Server</display-name>

    <!-- Spring -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    
    <!-- 配置CXF请求Servlet -->
    <servlet>  
        <servlet-name>CXF</servlet-name>  
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <!-- 这里是拦截所有请求 -->
    <servlet-mapping>  
        <servlet-name>CXF</servlet-name>  
        <url-pattern>/*</url-pattern>  
    </servlet-mapping>  

</web-app>

在某个目录下新建一个spring容器配置文件:这里命名为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:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
    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://www.springframework.org/schema/tx 
                     http://www.springframework.org/schema/tx/spring-tx.xsd 
                     http://www.springframework.org/schema/aop 
                     http://www.springframework.org/schema/aop/spring-aop.xsd
                     http://www.springframework.org/schema/context 
                       http://www.springframework.org/schema/context/spring-context-3.0.xsd
                       http://cxf.apache.org/jaxws  
                        http://cxf.apache.org/schemas/jaxws.xsd">


    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <!-- apache-cxf3.0以上版本不在需要该xml
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> -->
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <!-- 服务提供组件 -->
    <bean id="userServiceImpl" class="com.lin.ws.impl.UserServiceImpl"></bean>

    <!-- implementor参数默认是一个bean,为了使该参数依赖其他bean,在注入的时候写上"#id" 
            address是该服务的地址,默认是项目的地址+这里定义的参数,比如:http://locahost:8080/SpringCXF_Server/UserService-->
    <jaxws:endpoint id="userService" implementor="#userServiceImpl"
        address="/UserService" />

</beans>



2.3设计服务接口和实体类

package com.lin.ws.entity;

public class User {
    
    private Integer id;
    
    private String name;
    
    private String password;

    public User() {
        super();
        // TODO Auto-generated constructor stub
    }

    public User(Integer id, String name, String password) {
        super();
        this.id = id;
        this.name = name;
        this.password = password;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", password=" + password
                + "]";
    }

}



package com.lin.ws.intf;

import javax.jws.WebService;

import com.lin.ws.entity.User;

@WebService
public interface IUserService {
    
    public User login(String name,String password);

}


2.4编写接口实现类

package com.lin.ws.impl;

import javax.jws.WebService;

import com.lin.ws.entity.User;
import com.lin.ws.intf.IUserService;

//serviceName定义该服务的名称,将显示在wsdl文档中
@WebService(endpointInterface="com.lin.ws.intf.IUserService",serviceName="UserService")
public class UserServiceImpl implements IUserService {

    @Override
    public User login(String name, String password) {
        
        return new User(1, name, password);
    }

}


2.5发布服务

在tomcat里运行这个web项目就发布了服务,访问wsdl文档:http://locahost:8080/SpringCXF_Server/UserService?wsdl


系统的目录结构


3如何访问该服务

3.1开发客户端系统(该系统访问WebService服务)

新建一个web项目(例如该项目是基于Spring+Struts2的),导包,由于需要Jaxws的接口代理,也导入CXF的jar包

并写好各个xml文件....


3.2生成客户端代码

进入该项目的src目录,用wsdl2java生成java代码


3.3编写一个Struts2 action处理请求

package com.lin.ws.action;

import com.lin.ws.intf.IUserService;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {

    private static final long serialVersionUID = 1L;
    
    private IUserService userService;//服务端接口
    
    private String name;
    private String password;
    
    public IUserService getUserService() {
        return userService;
    }
    public void setUserService(IUserService userService) {
        this.userService = userService;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
    @Override
    public String execute() throws Exception
    {
        System.out.println("Login Success"+userService.login(name, password).toString());
        
        return SUCCESS;
    }

}

在Spring容器里配置这个action,并且注入它依赖的接口:

<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
    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://www.springframework.org/schema/tx 
                     http://www.springframework.org/schema/tx/spring-tx.xsd 
                     http://www.springframework.org/schema/aop 
                     http://www.springframework.org/schema/aop/spring-aop.xsd
                     http://www.springframework.org/schema/context 
                       http://www.springframework.org/schema/context/spring-context-3.0.xsd
                       http://cxf.apache.org/jaxws  
                        http://cxf.apache.org/schemas/jaxws.xsd">

    <bean name="loginAction" class="com.lin.ws.action.LoginAction">
        <property name="userService" ref="userService"></property>
    </bean>
    
    <!-- 配置webservice服务端接口代理,声明的id可用于依赖注入
            address的参数是该服务的地址 -->
    <jaxws:client id="userService" 
    serviceClass="com.lin.ws.intf.IUserService" 
    address="http://localhost:8080/SpringCXF_Server/UserService">
    </jaxws:client>

</beans>


在struts里面配置这个action:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">


<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.objectFactory" value="spring" />
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    
    <package name="default" namespace="/" extends="struts-default">
        <action name="login" class="loginAction">
        <result>/WEB-INF/content/success.jsp</result>
    </action>
    </package>

</struts>

然后运行,发送请求访问这个action......


系统的目录结构


4总结

一个基于Spring的J2EE系统发布了某些WebService服务,那么该系统就是服务的提供者,它对外提供一份WSDl文档用于它的客户访问它所提供的服务.


其次,客户在得到该WSDL文档后,在自己原有的系统或开发新系统来生成服务端接口代理,客户调用这些接口就像调用本地接口一样,从而实现多系统间信息交流或多系统整合.系统的

© 著作权归作者所有

共有 人打赏支持
蜡笔小小小新
粉丝 32
博文 104
码字总数 75210
作品 0
深圳
后端工程师
Tomcat,JBoss与JBoss Web

最近接触到应用服务器JBoss,此外JBoss Web与Tomcat也同为web服务器,便查阅资料对三者进行比较,供大家参考。 一、Tomcat Tomcat 服务器是免费开源的Web 应用服务器。支持最新的Servlet 和J...

thinkyoung ⋅ 2014/11/16 ⋅ 0

JSP 学习总结---学习笔记

什么是JSP 1)为什么说,Servlet是一个动态Web开发技术呢? Servlet是基于服务端的一种动态交互技术, HttpServletRequest表示客户端到服务端的对象 HttpServletResponse表示服务端到客户端的...

知止内明 ⋅ 04/18 ⋅ 0

【J2EE】之常用的接口和协议

前言 初接触J2EE,会遇到很多之前没有遇到过的术语,下面我们来简单地汇总一下这些接口和协议吧。 各大接口和协议详解 JDBC 1.定义:Java数据库连接 2.地位:用于Java应用程序连接数据库的标...

m18633778874 ⋅ 04/26 ⋅ 0

Servlet的一些细节--学习笔记

Servlet细节 1)浏览器访问的url-pattern只是一个符合格式的任意字符串,以/开头 2)一个Servlet的url-pattern可以是1个或多个,有二种形式; a).xx b)/xx/ 注意:/不能一起直接使用 3)/和....

知止内明 ⋅ 04/17 ⋅ 0

J2EE进阶(二十四)JBoss Web和 Tomcat的区别

J2EE进阶(二十四)JBoss Web和 Tomcat的区别 在Web2.0的浪潮中,各种页面技术和框架不断涌现,为服务器端的基础架构提出了更高的稳定性和可扩展性的要求。近年来,作为开源中间件的全球领导者...

sunhuaqiang1 ⋅ 05/27 ⋅ 0

PHP调用JAVA发布的WebService

前言: 自从互联网起步,到发展壮大以来,已经深入到了各个领域。用户的需求体验也慢慢提高了,对应的互联网相关开发技术也越来越多。但是我们知道每一门开发语言都是在某种环境下应运而生,...

鑫全 ⋅ 04/18 ⋅ 0

Apache Qpid JMS AMQP 0-x 6.3.1 发布

Apache Qpid JMS AMQP 0-x 6.3.1 已发布。Qpid JMS AMQP 0-x 是兼容 JMS 1.1 的客户端,等同于 AMQP 0-8,0-9,0-9-1 和 0-10。Qpid JMS 是一个使用 Qpid Proton 协议引擎的 Java Message Ser......

淡漠悠然 ⋅ 05/21 ⋅ 0

JavaWeb开发比较重要的面试题

JavaWeb开发比较重要的面试题 1. 编码转换:怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 答:示例代码如下: String s1=”你好”; String s2=new String(s1.getBytes(“GB2312”...

xj_9264 ⋅ 05/06 ⋅ 0

利用GAE+RestEasy搭建webservice--编码与发布

利用GAE构建第一个REST风格的java webservice 1. 配置好你的Eclipse GAE开发环境 2. 测试一下你的GAE环境的配置是否正确。写个HelloWorld发布一下试试。 3. 让我们开始 ? 利用GAE建一个gaeRe...

科技小先锋 ⋅ 2017/11/14 ⋅ 0

消息队列ActiveMQ的使用详解

通过上一篇文章 《消息队列深入解析》,我们已经消息队列是什么、使用消息队列的好处以及常见消息队列的简单介绍。 这一篇文章,主要带大家详细了解一下消息队列ActiveMQ的使用。 学习消息队...

snailclimb ⋅ 04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 30分钟前 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

前言 我是上学期学的汇编,因为有vs又不想用课上教的麻烦的dosbox以及masm32,但是一直没找到高亮插件和能调试的(难在运行不了而找不到答案上,出现的错误在最后放出,还请先达们不吝指点)...

simpower ⋅ 40分钟前 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 43分钟前 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 50分钟前 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 51分钟前 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 59分钟前 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 今天 ⋅ 0

Java对象的序列化与反序列化

Java对象的序列化与反序列化

Cobbage ⋅ 今天 ⋅ 0

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 今天 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部