在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。
分享到:
相关推荐
雍俊海JAVA基础课程配备的PPT课件(JSE)
java se 基础知识,简单易学,有概念,有例子。
自己写的java web 应用框架 (jse) 可节约60 开发周期
标准JSE一卡通说明书
* 当前类名: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使用JSE,JEE,JSP,JSF和Spring等主要技术的项目,包括Java包含的所有Universe
JDK9-JSE-Java Accessibility Guide-30
JDK9-JSE-Java Language Updates-3
jse5.0 api 中文文档 chm 包含三个压缩文件
JDK9-JSE- Java Management Extensions Guide-245
JDK9-JSE-Java Virtual Machine Guide-67
捷顺JSE一卡通管理系统中的收费管理子系统是一个以非接触式智能IC或EM卡为用户消费凭证、以TCP/IP 为通讯协议、以JSSF5211收费机为收费终端,结合先进的智能卡识别技术和网络通讯技术的一款在线式收费管理 系统。...
JDK9-JSE-Java Scripting Programmer's Guide-21
JDK9-JSE-Java Shell User’s Guide-32
JDK9-JSE- Java Remote Method Invocation API Guide-2
在 Spring Framework 和 Java (JSE) 中使用依赖注入的示例在这个项目中,您将找到一个简单的示例,说明如何使用 Spring Framework 的依赖注入来启动 JSE 应用程序
python库。 资源全名:jse-0.1.4.tar.gz
jse5.0 api 中文文档 chm2 包含三个压缩包
java io源码
6、综合应用JSE所学习的知识 7、在应用中合理使用集合框架 8、在应用中综合使用swing的常用组件 9、基本的表现层的实现机制 10、IO流和文件的基本操作 11、培养良好的Java编程习惯 12、培养调试Java程序的能力,培养...