在Java中创建、使用Web Service主要是通过JAX-RPC来进行的。
JAX-RPC Service Endpoint(JSE)和EJB Endpoint是Java Web Service的服务器端两种主要实现方式。而Java Web Service的客户端主要有:
- 生成的stub,它是最常用的,最接近Java RMI的语义;
- 动态代理;
- 动态调用接口
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的客户端主要有:
- 生成的stub,它是最常用的,最接近Java RMI的语义;
- 动态代理;
- 动态调用接口
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。
分享到:
相关推荐
4. **一种软件部署环境**:Java不仅限于本地应用的开发,还可以用于开发Web应用程序、移动应用等多种类型的应用程序。 综上所述,Java作为一种强大的编程语言,不仅为开发者提供了灵活的编程手段,还为软件开发和...
这些文件是雍俊海老师的JAVA基础课程的配套课件,主要涵盖了JSE(Java Standard Edition)的基础知识。从文件名称可以看出,这些PPT涵盖了从第一章到第十三章的内容,包括了JAVA编程语言的核心概念和重要特性。以下...
根据提供的文件信息,“孙卫琴 Tomcat与Java&Web开发技术详解.pdf”,我们可以总结出以下相关的IT知识点: ### 一、Tomcat服务器介绍 #### 1.1 Tomcat概述 Tomcat是由Apache软件基金会(ASF)开发的一款开源的...
JDK9-JSE-Java Language Updates-3.pdf Java 平台标准版(Java SE)9 中的 Java 语言更新主要是引入了 Java 平台模块系统。Java 平台模块系统引入了一种新的 Java 编程组件 - 模块,模块是一个有名称、自描述的...
**JSE - 构建Java Web应用框架** JSE,全称为"JSE能写javaweb",是一个自定义的Java Web应用框架,旨在帮助开发者快速构建Web应用程序,缩短开发周期,提高效率。根据标题和描述,我们可以推测JSE框架提供了一套...
"Restlet-JSE"是一个基于Java的开源框架,专门用于构建RESTful(Representational State Transfer)Web服务。REST是一种轻量级的、架构风格的网络应用程序设计方法,它强调资源的表述和状态转移,通常用于构建高效、...
JEE包含了诸如EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JPA(Java Persistence API)和Servlet等组件,便于实现数据库访问、事务处理、安全性和可扩展性等功能。 3. JSP(JavaServer Pages):...
Restlet JSE(Java SE)版本是Restlet框架针对Java标准版环境的实现,允许开发者在Java桌面应用或服务器端环境中创建RESTful服务。2.2.1是该框架的一个特定版本,可能包含了一些性能优化、新功能以及对之前版本的bug...
Java IO 源码分析:JavaHTTPServer 在Java编程领域,理解IO(输入/输出)机制对于开发高效、可靠的程序至关重要。Java IO API提供了一系列类和接口,用于处理输入和输出操作,包括文件读写、网络通信等。在这个主题...
在Java编程语言中,实现一个整数位计算器是一项基础但重要的练习,可以帮助初学者更好地理解基本的编程概念,如变量、运算符、控制流程以及面向对象编程思想。本项目主要涉及以下几个关键知识点: 1. **变量与数据...
Java Scripting Programmer's Guide是Java Platform, Standard Edition的一部分,旨在帮助开发者使用Java scripting来实现复杂的应用程序。以下是Java Scripting Programmer's Guide的重要知识点: 一、Java ...
《JDK10-JSE Java Management Extensions Guide》是Oracle公司发布的一份技术指南,主要针对Java平台标准版(Java Platform, Standard Edition,简称JSE)的Java管理扩展(Java Management Extensions,简称JMX)...
* 当前类名:FilterChain.java * 项目名称:JavaStudy * 创建时间:2011-12-28 */ package org.java.com.design.filter; import java.util.ArrayList; import java.util.List; public class FilterChain ...
本资源主要介绍了 Java 平台标准版的脚本编程指南,旨在帮助开发者更好地使用 Java Scripting API 实现自动化和集成任务。下面是对资源的详细解读: 脚本编程概念 Java Scripting API 是 Java 平台标准版的一部分...
Java平台标准版(Java Platform, Standard Edition,简称JSE)是Java开发工具包(Java Development Kit,JDK)的一部分,专注于提供一个用于开发和运行Java应用程序的基础环境。JDK 10是Java的一个版本,它包含了...
该指南主要面向 Java 开发者和使用 Java 平台的用户,旨在帮助他们了解和实现 Java 应用程序的可访问性。 Java 可访问性是指 Java 应用程序能够被残疾人士或其他需要特殊_assistance 的人士所使用。Java 可访问性的...
2. **joltjse.jar**:这个库是针对Java标准版(Java Standard Edition, JSE)环境的,它扩展了基础的jolt.jar,提供了在非WebLogic Server环境下的Java应用调用Tuxedo服务的能力。这使得Java桌面应用或者不在...
* Web应用程序:开发者可以使用Java Accessibility API创建可访问的Web应用程序,满足不同残疾人的需求。 Java Accessibility Guide的优点 Java Accessibility Guide有以下几个优点: * 提高用户体验:可访问性的...
Java的设计初衷是为了实现“一次编写,到处运行”的跨平台特性,这得益于Java虚拟机(JVM)的存在。Java的核心类库主要包含在`java.*`命名空间下,这些类库提供了基本的数据类型处理、文件I/O操作、网络功能等基础...