`
8366
  • 浏览: 810384 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

ejb3 第12讲 --开发EJB容器模型的WEB服务

    博客分类:
  • ejb
阅读更多

 

JAX-WS

  JAX-WS规范是一组XML web services的JAVA API。JAX-WS允许开发者可以选择RPC-oriented或者message-oriented 来实现自己的web services。
  在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP。在使用JAX-WS过程中,开发者不需要编写任何生成和处理SOAP消息的代码。JAX-WS的运行时实现会将这些API的调用转换成为对于SOAP消息。
  在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI (service endpoint interface),并提供相关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。
  在客户端,用户可以通过JAX-WS的API创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端的调用。
  通过web service所提供的互操作环境,我们可以用JAX-WS轻松实现JAVA平台与其他编程环境(.net等)的互操作。
  JAX-WS与JAX-RPC之间的关系
  Sun最开始的web services的实现是JAX-RPC 1.1 (JSR 101)。这个实现是基于Java的RPC,并不完全支持schema规范,同时没有对Binding和Parsing定义标准的实现。
  JAX-WS2.0 (JSR 224)是Sun新的web services协议栈,是一个完全基于标准的实现。在binding层,使用的是the Java Architecture for XML Binding (JAXB, JSR 222),在parsing层,使用的是the Streaming API for XML (StAX, JSR 173),同时它还完全支持schema规范。

 

 

目的:使用ejb3 的 @WebService  注解开发一个webservice服务端,然后使用JAX-WS 技术完成客户端代码的生成和调用

 

 

 

webservice 服务器端的开发:

 

 

 

 

  步骤1: 写一个webservice 需要传输的对象

 

package cn.com.xinli.bean;

import java.io.Serializable;

public class Order implements Serializable
{
	String orderid;
	String name;
	public String getOrderid()
	{
		return orderid;
	}
	public void setOrderid(String orderid)
	{
		this.orderid = orderid;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
}

 

 

  步骤2: 定义webservice服务器端需要暴漏的方法

 

package cn.com.xinli.service;

import java.util.List;

import cn.com.xinli.bean.Order;

public interface OrderService
{
	public String getUserName(String name);
	public Order getOrder(String id);
	public List<Order> getOrders();
}

 

  步骤3: 定义暴漏方法的实现

 

 

package cn.com.xinli.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;

import cn.com.xinli.bean.Order;
import cn.com.xinli.service.OrderService;


/*使用这个注解,就可以这个会话bean中的方法暴漏成webservice方法
 * 如果你只想暴漏其中的某些方法,你可以再想对外暴漏的方法上
 * 加上@WebMethod 注解,那么没有这个注解的方法就不会暴漏
 * 成webservice方法了 
 * targetNamespace 命名空间 也就是wsdl中的 targetNamespace
 * name 端点接口的名称 也就是wsdl中的portType name
 * serviceName 服务的名称
 * 不修改上面的3个属性也没关系,就是你发布的wsdl的可读性差
 * */
@WebService(targetNamespace="http://xinli.com.cn",name="OrderService",
		serviceName="OrderServiceBean")
/*声明为无状态的会话bean 声明远程接口*/
@Stateless
@Remote(OrderService.class)
public class OrderServiceBean implements OrderService
{
	
	public Order getOrder(String orderid)
	{
		Order order=new Order();
		order.setOrderid(orderid);
		order.setName("亮亮娃");
		return order;
	}

	public List<Order> getOrders()
	{
		List<Order> persons=new ArrayList<Order>();
		Order order1=new Order();
		order1.setOrderid("001");
		order1.setName("huxl");
		
		Order order2=new Order();
		order2.setOrderid("002");
		order2.setName("ryp");
		
		persons.add(order1);
		persons.add(order2);
		return persons;
		
	}

	public String getUserName(String name)
	{
		return name;
	}

}

 

 

  步骤4: ant 打包

 

<?xml version="1.0" encoding="UTF-8"?>
<project name="Ejb3Webservice" basedir=".">

	
    <property name="src.dir" value="${basedir}"/>
	<property environment="env"/>
    <property name="jboss.home" value="${env.JBOSS_HOME}"/>
    <property name="jboss.server.config" value="default"/>
    <property name="build.dir" value="${basedir}\build"/>
	
	
	<path id="master-classpath" description="设置编译路径">
		<fileset file="${jboss.home}\client\*.jar"/>
	</path>
	
	 <target name="prepare" description="创建class文件目录">
	      
	 	<delete dir="${build.dir}"/>
	 	<mkdir dir="${build.dir}"/>
	 </target>
	
	<target name="compile" depends="prepare" description="编译">
		<!--只编译以cn开头的-->
	    	<javac srcdir="${src.dir}" destdir="${build.dir}" includes="cn/**">
	    		<classpath refid="master-classpath"/>
	    	</javac>
	 </target>
	
	
	<target name="ejbjar" description="创建ejb发布包" depends="compile">
		    <jar jarfile="${basedir}\${ant.project.name}.jar">
		    	<fileset dir="${build.dir}"/>
		    	<include name="**/*.class"/>
		    
		    </jar>
    </target>
	
	<target name="deploy" description="发布">
				<copy file="${basedir}\${ant.project.name}.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy"/>
		</target>
		
		<target name="undeploy" description="卸载ejb">
					<delete file="${basedir}\${ant.project.name}.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy"/>
		</target>
	
    
</project>

 

 

步骤5:验证输入 http://localhost:8080/jbossws/   找到 View a list of deployed services  点击可以看到你发的webservice的wsdl文件

<!--li><a href="depends" mce_href="/admin/blogs/440338/depends">View installed dependencies</a></li-->

 

webservice 客户端的开发:

 

 

 

步骤1: 建立一个空的项目,从 https://jax-ws.dev.java.net/2.1.7/ 下载 jax-ws,使用  java -jar JAXWS2.1.7-20090419.jar,解压缩后会有lib ,讲lib下的 jar包加到classpath下

 

步骤2:使用ant 从服务器的wsdl 生成本地调用框架

 

<?xml version="1.0" encoding="UTF-8"?>
<project name = "WSClient"  default="wsclient" basedir =".">
<property name = "src.dir" value = "${basedir}/src"/>
<path id="build.classpath" description="设置类路径">
  <fileset dir="${basedir}/lib">
   <include name="*.jar"></include>
  </fileset>
 </path>

<target name = "wsclient" description ="生成webservice客户端代码">
	<taskdef name = "wsimport" classname ="com.sun.tools.ws.ant.WsImport" classpathref="build.classpath"/>
	<wsimport wsdl="http://127.0.0.1:8080/Ejb3Webservice/OrderServiceBean?wsdl"
	sourcedestdir="${src.dir}" package="cn.com.xinli.ws.client" keep="true"
	verbose ="true" destdir="${basedir}/bin"/>
	</target> 
</project>

 

步骤3:使用junit4 写单元测试

 

 

package junit.test;


import java.util.List;

import org.junit.BeforeClass;
import org.junit.Test;

import cn.com.xinli.ws.client.Order;
import cn.com.xinli.ws.client.OrderService;
import cn.com.xinli.ws.client.OrderServiceBean;

public class WSTest
{

	@BeforeClass
	public static void setUpBeforeClass() throws Exception
	{
	}
	@Test
	public void getUserName()
	{
		OrderServiceBean orderServiceBean=new OrderServiceBean();
		/*得到端点接口*/
		OrderService orderService=orderServiceBean.getOrderServicePort();
		System.out.println(orderService.getUserName("晓亮"));
	}
	@Test
	public void getOrder()
	{
		OrderServiceBean orderServiceBean=new OrderServiceBean();
		/*得到端点接口*/
		OrderService orderService=orderServiceBean.getOrderServicePort();
		System.out.println(orderService.getOrder("1").getOrderid());
		System.out.println(orderService.getOrder("1").getName());
	}
	@Test
	public void getOrders()
	{
		OrderServiceBean orderServiceBean=new OrderServiceBean();
		/*得到端点接口*/
		OrderService orderService=orderServiceBean.getOrderServicePort();
		List<Order> orderList=orderService.getOrders();
		for(Order order:orderList)
		{
			System.out.println(order.getOrderid());
			System.out.println(order.getName());
		}
	}
}

 

 

 

验证: 保证服务器的wsdl 能正确访问,调用单元测试用例 ok!

分享到:
评论
1 楼 zhouxianglh 2009-10-15  
在jboss-5.0.1.GA下出错了.service 服务发布不了,Bean 成功发布了,是不是这个版本不支持?

相关推荐

    Apress.Begining EJB3 Java EE 7 Edition.2013

    第12章:EJB客户端应用程序 - **主要内容:** - EJB客户端的开发。 - 远程调用EJB服务。 - 客户端认证和授权。 - 客户端故障转移和重试机制。 - 客户端应用程序的安全性考虑。 - **关键知识点:** - 客户端...

    大量EJB3文档(基本包含EJB所有技术资料)

    12. **Web服务集成**:EJB3还可以与JAX-WS(Java API for XML Web Services)结合,使Bean可以直接作为Web服务提供。 这个压缩包中的文档很可能包括了上述所有内容的详细解释、示例代码以及最佳实践,帮助读者深入...

    Ejb 3 In Action

    #### 第十五章:EJB作为Web服务的暴露 - **Web服务集成**:介绍了如何将EJB组件暴露为Web服务,以实现跨平台的数据交换和服务调用。 #### 第十六章:EJB 3与Spring框架的整合 - **Spring框架集成**:讨论了如何将...

    Manning - EJB 3 in Action

    12. **第12章:有效地在应用程序层间集成EJB** 本章着重于如何在不同的应用层之间高效地集成EJB组件,包括如何处理远程调用和服务之间的交互。 13. **第13章:驯服狂野的EJB** 本章提供了一些实用技巧和最佳...

    EJB3使用说明中文版

    #### 二、EJB3 运行环境配置 **2.1 下载与安装**: - **JBoss AS**: 需要下载并安装支持 EJB3 的 JBoss AS(Application Server),通常推荐使用最新版本。 - **Java SDK**: 确保已安装兼容的 Java SDK,建议使用 ...

    Manning.EJB.3.0.in.Action

    #### 第12章:有效整合EJB 3跨越应用层 - **章节内容**:讨论如何有效地将EJB 3集成到多层架构中。 - **核心知识点**: - 多层架构的概念和优缺点。 - 不同层之间通信的方式。 - 最佳实践和常见问题解决方法。 ...

    Beginning EJB 3 Java EE 7 Edition

    最后一章即第十二章,将涉及如何构建EJB客户端应用程序。客户端应用程序可能是桌面应用、Web应用或其它类型的程序,它们通过网络与EJB组件进行通信。这章将介绍在不同类型的客户端中如何远程调用EJB组件。 通过以上...

    Manning EJB3.0 in action

    这部分内容将涵盖如何使用EJB 3.0中的容器管理事务(CMT)和Bean管理事务(BMT)模型来确保数据一致性,以及如何集成身份验证、授权等安全机制来保护应用程序资源。 ### 7. 使用EJB 3.0实现领域模型 领域驱动设计...

    EJB3.0 in Action

    ### 第十四章至第十六章:迁移、Web服务与Spring集成 最后几章涵盖了EJB 3.0与现有系统之间的迁移策略,如何将EJB暴露为Web服务,以及如何与流行的框架Spring进行集成,以增强应用的灵活性和可扩展性。 本书不仅是...

    Java web开发 环境搭建

    - **J2EE1.2** (1999年12月): 第一个J2EE版本,包含了10个规范和API,主要针对Web层、业务逻辑、表示层和消息传递服务。 - **J2EE1.3** (2001年9月): 改进了J2EE1.2的规范,并引入了XML API、连接器架构和安全框架。...

    Java.Web应用开发.J2EE和Tomcat第2版

    《Java.Web应用开发.J2EE和Tomcat第2版》这本书深入探讨了使用Java技术和Tomcat服务器进行Web应用开发的核心概念和技术。以下是该书可能涵盖的一些关键知识点: 1. **Java Web基础知识**:首先,书本会介绍Java Web...

    Java Web从入门到精通光盘源码1-15

    3. **MVC模式**:模型-视图-控制器(Model-View-Controller)设计模式常用于Java Web开发,帮助分离业务逻辑、数据表示和用户界面。Spring MVC是Java Web中的一个流行实现。 4. **JDBC**:Java数据库连接(JDBC)是...

    JAVA web 开发源代码

    它们由Web容器管理,当第一个请求到达时,容器会加载并实例化Servlet,然后为每个后续请求创建一个Servlet实例。 2. **JSP基本元素**:JSP页面包含HTML标签、脚本元素(scriptlet、expression、声明)和指令(page...

    MyEclipse 6 Java开发中文教程(11-17)

    4. **第12章 - 开发Struts.2.Spring应用**:Struts 2是Struts的下一代框架,与Spring的结合可以提升应用的灵活性和可扩展性。本章会阐述如何在MyEclipse中整合Struts 2和Spring,创建控制器、配置Action,以及使用...

Global site tag (gtag.js) - Google Analytics