`
zym_nanako
  • 浏览: 84412 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java Web Service之JSE实现梗概

阅读更多

在Java中创建、使用Web Service主要是通过JAX-RPC来进行的。
JAX-RPC Service Endpoint(JSE)和EJB Endpoint是Java Web Service的服务器端两种主要实现方式。而Java Web Service的客户端主要有:

  1. 生成的stub,它是最常用的,最接近Java RMI的语义;
  2. 动态代理;
  3. 动态调用接口

Java Web Service的服务器端实现
JSE是通过Servlet(下称JAX-RPC Servlet)响应来自客户端的SOAP消息的,JAX-RPC Servlet负责把SOAP消息转换为Java的方法调用,并调用响应的JSE。
实现一个JSE通常需要定义一个endpoint接口和相应的实现。接口中定义了作为web service的方法,该接口需要继承java.rmi.Remote,其所有方法必须抛java.rmi.RemoteException。
在Java中创建、使用Web Service主要是通过JAX-RPC来进行的。
JAX-RPC Service Endpoint(JSE)和EJB Endpoint是Java Web Service的服务器端两种主要实现方式。而Java Web Service的客户端主要有:
  1. 生成的stub,它是最常用的,最接近Java RMI的语义;
  2. 动态代理;
  3. 动态调用接口

Java Web Service的服务器端实现
JSE是通过Servlet(下称JAX-RPC Servlet)响应来自客户端的SOAP消息的,JAX-RPC Servlet负责把SOAP消息转换为Java的方法调用,并调用响应的JSE。
实现一个JSE通常需要定义一个endpoint接口和相应的实现。接口中定义了作为web service的方法,该接口需要继承java.rmi.Remote,其所有方法必须抛java.rmi.RemoteException。示例如下:
package some.dot.com;

public interface BookQuote extends java.rmi.Remote {
  public float getBookPrice(String isbn) throws java.rmi.RemoteException;
}

在J2EE环境下可以通过以多种式实现endpoint接口,一般都是先通过JNDI找到相关的资源,然后调用资源上的相应的方法。典型的实现有:
1.通过JDBC访问数据库
public class BookQuote_Impl_2 implements BookQuote {
  public float getBookPrice(String isbn){
    java.sql.Connection jdbcConnection = null;
    java.sql.Statement sqlStatement = null;
    java.sql.ResultSet resultSet;
    try {
      javax.naming.InitialContext jndiEnc =
                               new javax.naming.InitialContext();
      javax.sql.DataSource dataSource = (javax.sql.DataSource)
                  jndiEnc.lookup("java:comp/env/jdbc/DataSource");
      jdbcConnection = dataSource.getConnection();
      sqlStatement = jdbcConnection.createStatement();
      resultSet = sqlStatement.executeQuery(
        "SELECT wholesale FROM CATALOG WHERE isbn = \'"+isbn+"\'");

      if(resultSet.next()){
        float price = resultSet.getFloat("wholesale");
        return price;
      }
      return 0;// zero means it's not stocked.
    }catch (java.sql.SQLException se) {
      throw new RuntimeException("JDBC access failed");
    }catch (javax.naming.NamingException ne){
      throw new RuntimeException("JNDI ENC access failed");
    }
  }
}


2.调用EJB
public class BookQuote_Impl_3 implements BookQuote {
  public float getBookPrice(String isbn){
    try {
      javax.naming.InitialContext jndiEnc =
                    new javax.naming.InitialContext();
      BookHomeLocal bookHome =(BookHomeLocal)
                    jndiEnc.lookup("java:comp/env/ejb/BookHomeLocal");
      BookLocal book = bookHome.findByPrimaryKey(isbn);
      return book.getWholesalePrice();
    }catch(javax.naming.NamingException ne){
      throw new RuntimeException("JNDI ENC access failed");
    }catch(java.rmi.RemoteException re){
      throw new RuntimeException("Problem invoking operation on Book EJB");
    }catch(javax.ejb.FinderException fe){
      throw new RuntimeException("Cannot find Book EJB");
    }
  }
}


3.使用JAX-RPC生成Stub调用其它的web service
public class BookQuote_Impl_4 implements BookQuote {
  public float getBookPrice(String isbn){
    try {
      javax.naming.InitialContext jndiEnc = new javax.naming.InitialContext();
      ImsCatalogService webService =(ImsCatalogService)
               jndiEnc.lookup("java:comp/env/service/ImsCatalogService");
      CatalogPort catalog = webService.getCatalogPort();
      return catalog.getWholesalePrice(isbn);
    }catch (javax.xml.rpc.ServiceException se) {
            throw new RuntimeException("JAX-RPC ServiceException thrown");
    }catch (javax.xml.rpc.JAXRPCException je) {
            throw new RuntimeException("JAXRPCException thrown");
    }catch (java.rmi.RemoteException re){
            throw new RuntimeException("RemoteException thrown");
    }catch (javax.naming.NamingException ne){
            throw new RuntimeException("NamingException thrown");
    }
  }
}


4.调用JCA等

为 方便JSE得到ServletContext和原始的SOAP消息等元信息,JAX-RPC定义了ServletEndpointContext,它是这 些元信息载体,并通过让JSE实现ServiceLifecycle来传递ServletEndpointContext。
ServiceLifeCyle定义如下:
package javax.xml.rpc.server;
import javax.xml.rpc.ServiceException;

public interface ServiceLifecycle {
    public void init(Object context) throws ServiceException;
    public void destroy();
}

其中,init方法用来传递ServletEndpoinContext,destroy方法用来给JSE释放资源。
ServletEndpointContext定义如下:
package javax.xml.rpc.server;
public interface ServletEndpointContext {
    public java.security.Principal getUserPrincipal();
    public boolean isUserInRole(String role);
    public javax.xml.rpc.handler.MessageContext getMessageContext();
    public javax.Servlet.http.HttpSession getHttpSession()
      throws javax.xml.rpc.JAXRPCException;
    public javax.Servlet.ServletContext getServletContext();
}

方 法getUserPrincipal,isUserInRole得到JAX-RPC Servlet的UserPrincipal, isUserInRole,这些方法仅适用于Web Service使用了HTTP Basic Authentication或HTTPS的情形。方法getHttpSession用于得到HttpSession。当在JSE中需要显式地处理 SOAP消息(如处理SOAP 消息头)时,可以调用方法getMessageContext得到MessageContext。
JSE支持单线程模式和多线程模式,但偏向于后者。所以,实现JSE时要注意对类成员变量访问的并发控制,或则让JSE变为无状态的。

可发Java Web Service也可以从web service定义本身入手,定义好WSDL。然后用工具生成endpoint的接口和实现的框架。为了增强不同平台的互操作性,定义WSDL的SOAP绑定时应尽量避免使用encoded。
分享到:
评论
1 楼 sojune 2007-11-02  
,不错

相关推荐

    JAVA基础课件(JSE)

    这些文件是雍俊海老师的JAVA基础课程的配套课件,主要涵盖了JSE(Java Standard Edition)的基础知识。从文件名称可以看出,这些PPT涵盖了从第一章到第十三章的内容,包括了JAVA编程语言的核心概念和重要特性。以下...

    孙卫琴 Tomcat与Java&Web开发技术详解.pdf

    根据提供的文件信息,“孙卫琴 Tomcat与Java&Web开发技术详解.pdf”,我们可以总结出以下相关的IT知识点: ### 一、Tomcat服务器介绍 #### 1.1 Tomcat概述 Tomcat是由Apache软件基金会(ASF)开发的一款开源的...

    JDK9-JSE-Java Language Updates-3.pdf

    JDK9-JSE-Java Language Updates-3.pdf Java 平台标准版(Java SE)9 中的 Java 语言更新主要是引入了 Java 平台模块系统。Java 平台模块系统引入了一种新的 Java 编程组件 - 模块,模块是一个有名称、自描述的...

    jse.zip_JSE能写javaweb

    **JSE - 构建Java Web应用框架** JSE,全称为"JSE能写javaweb",是一个自定义的Java Web应用框架,旨在帮助开发者快速构建Web应用程序,缩短开发周期,提高效率。根据标题和描述,我们可以推测JSE框架提供了一套...

    restlet-jse

    "Restlet-JSE"是一个基于Java的开源框架,专门用于构建RESTful(Representational State Transfer)Web服务。REST是一种轻量级的、架构风格的网络应用程序设计方法,它强调资源的表述和状态转移,通常用于构建高效、...

    java:使用Java使用JSE,JEE,JSP,JSF和Spring等主要技术的项目,包括Java包含的所有Universe

    JEE包含了诸如EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JPA(Java Persistence API)和Servlet等组件,便于实现数据库访问、事务处理、安全性和可扩展性等功能。 3. JSP(JavaServer Pages):...

    restlet-jse-2.2.1.zip

    Restlet JSE(Java SE)版本是Restlet框架针对Java标准版环境的实现,允许开发者在Java桌面应用或服务器端环境中创建RESTful服务。2.2.1是该框架的一个特定版本,可能包含了一些性能优化、新功能以及对之前版本的bug...

    javaio源码-jse-io-http-server:JavaHTTPServer的源代码,用于>DevStudy.net课程

    Java IO 源码分析:JavaHTTPServer 在Java编程领域,理解IO(输入/输出)机制对于开发高效、可靠的程序至关重要。Java IO API提供了一系列类和接口,用于处理输入和输出操作,包括文件读写、网络通信等。在这个主题...

    java实现整数位的计算器

    在Java编程语言中,实现一个整数位计算器是一项基础但重要的练习,可以帮助初学者更好地理解基本的编程概念,如变量、运算符、控制流程以及面向对象编程思想。本项目主要涉及以下几个关键知识点: 1. **变量与数据...

    JDK9-JSE-Java Scripting Programmer's Guide-21.pdf

    Java Scripting Programmer's Guide是Java Platform, Standard Edition的一部分,旨在帮助开发者使用Java scripting来实现复杂的应用程序。以下是Java Scripting Programmer's Guide的重要知识点: 一、Java ...

    JDK10-JSE Java Management Extensions Guide-125.pdf

    《JDK10-JSE Java Management Extensions Guide》是Oracle公司发布的一份技术指南,主要针对Java平台标准版(Java Platform, Standard Edition,简称JSE)的Java管理扩展(Java Management Extensions,简称JMX)...

    JSE基础与设计模式

    * 当前类名:FilterChain.java * 项目名称:JavaStudy * 创建时间:2011-12-28 */ package org.java.com.design.filter; import java.util.ArrayList; import java.util.List; public class FilterChain ...

    JDK10-JSE ,Java Scripting Programmer's Guide-21.pdf

    本资源主要介绍了 Java 平台标准版的脚本编程指南,旨在帮助开发者更好地使用 Java Scripting API 实现自动化和集成任务。下面是对资源的详细解读: 脚本编程概念 Java Scripting API 是 Java 平台标准版的一部分...

    JDK10-JSE ,Java Virtual Machine Guide-70.pdf

    Java平台标准版(Java Platform, Standard Edition,简称JSE)是Java开发工具包(Java Development Kit,JDK)的一部分,专注于提供一个用于开发和运行Java应用程序的基础环境。JDK 10是Java的一个版本,它包含了...

    JDK9-JSE-Java Accessibility Guide-30.pdf

    该指南主要面向 Java 开发者和使用 Java 平台的用户,旨在帮助他们了解和实现 Java 应用程序的可访问性。 Java 可访问性是指 Java 应用程序能够被残疾人士或其他需要特殊_assistance 的人士所使用。Java 可访问性的...

    JDK10-JSE ,Java Accessibility Guide-31.pdf

    * Web应用程序:开发者可以使用Java Accessibility API创建可访问的Web应用程序,满足不同残疾人的需求。 Java Accessibility Guide的优点 Java Accessibility Guide有以下几个优点: * 提高用户体验:可访问性的...

    java和javax的区别

    Java的设计初衷是为了实现“一次编写,到处运行”的跨平台特性,这得益于Java虚拟机(JVM)的存在。Java的核心类库主要包含在`java.*`命名空间下,这些类库提供了基本的数据类型处理、文件I/O操作、网络功能等基础...

    Python库 | jse-0.1.4.tar.gz

    在Python的世界里,库是程序员们共享代码和实现特定功能的重要工具。它们极大地提高了开发效率,降低了编程难度。"jse-0.1.4.tar.gz"是一个针对Python的库,名为"jse",版本号为0.1.4。这个库的资源以tar.gz格式打包...

Global site tag (gtag.js) - Google Analytics