GlassFish中进行EJB调用的几种场景
2011-11-26 00:38
197 查看
一. 同一个应用中的EJB调用
在同一个EAR应用当中的EJB调用是EJB最常见的调用。在同一个EAR中既有EJB,又有Servlet。在Servlet中对EJB的调用比较简单。而且在开发EJB的时候,可以使用EJB的本地接口来提高性能。下面是一个EJB3.0调用的代码片断:
@EJB
private NewSessionRemote newSessionBean;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet MyServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Returned string from Session bean is " +
newSessionBean.sayHello("Wang Yu") + "</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}
EJB的调用必须通过Remote接口。
必须将EJB的Remote接口类放在本地的类路径下(WEB-INF/lib的jar文件或WEB-INF/classes下)
四. 独立的客户端调用EJB
如果是在一个独立的Java客户端对EJB进行调用,那么必须做到以下几步:
EJB的调用必须通过Remote接口。
必须将EJB的Remote接口类放在本地的类路径下
类路径下还要包括其他的几个jar文件,这几个jar文件都在Glassfish的lib目录下,包括javaee.jar,appserv-rt.jar,appserv-ext.jar和appserv-deploy-client.jar
在Java命令中需要包括以下的参数,例如:
java -Dorg.omg.CORBA.ORBInitialHost=com.acme.Host1(指定Glassfish的主机名或IP地址,缺省是localhost)
-Dorg.omg.CORBA.ORBInitialPort=9876 (指定EJB所监听的IIOP端口,缺省是3700)
在代码中进行显示的EJB lookup和调用。例如:
.......
public static void main(String[] args) {
try {
InitialContext ic =new InitialContext();
NewSessionRemote sayhello = (NewSessionRemote) ic.lookup("mypackage.NewSessionRemote");
String result = sayhello.sayHello("dad");
System.out.println(result);
} catch (NamingException ex) {
ex.printStackTrace();
}
}
........
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
props.setProperty("org.omg.CORBA.ORBInitialHost", "puma.prc.sun.com");
props.setProperty("org.omg.CORBA.ORBInitialPort", "6262");
InitialContext ic = new InitialContext(props);
当然,EJB的Remote接口和那几个Glassfish所带的应用服务器相关的Jar文件也要放到相应的类路径中。
package wangyu;
import java.io.*;
import java.net.*;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import mypackage.NewSessionRemote;
/**
*
* @author wangyu
* @version
*/
public class CallRemote extends HttpServlet {
@EJB
private NewSessionRemote newSessionBean;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet CallRemote</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Returned string from Session bean is " + newSessionBean.sayHello("Wang Yudasd") + "</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
这些代码和(一)中完全一样。但是在sun-web.xml中,需要加上EJB引用的配置:
<ejb-ref>
<ejb-ref-name>wangyu.CallRemote/newSessionBean</ejb-ref-name>
<jndi-name>corbaname:iiop:puma.prc.sun.com:3700#mypackage.NewSessionRemote</jndi-name>
</ejb-ref>
在JNDI的名字中指向另外一个Glassfish实例(有可能在另外一台机器上)的地址中的EJB。
在同一个EAR应用当中的EJB调用是EJB最常见的调用。在同一个EAR中既有EJB,又有Servlet。在Servlet中对EJB的调用比较简单。而且在开发EJB的时候,可以使用EJB的本地接口来提高性能。下面是一个EJB3.0调用的代码片断:
@EJB
private NewSessionRemote newSessionBean;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet MyServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Returned string from Session bean is " +
newSessionBean.sayHello("Wang Yu") + "</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}
二. 在同一个Glassfish实例不同应用的EJB调用
在同一个Glassfish实例上(同一个JVM)可以部署多个应用,其中应用A中部署了EJB,而应用B中的Servlet可以调用应用A中的EJB。这种情况下,Servlet的调用代码完全和上面的一样,有一些区别是:EJB的调用必须通过Remote接口。
必须将EJB的Remote接口类放在本地的类路径下(WEB-INF/lib的jar文件或WEB-INF/classes下)
三.在应用容器中的客户端调用(ACC)
通过ACC来进行客户端的调用,四. 独立的客户端调用EJB
如果是在一个独立的Java客户端对EJB进行调用,那么必须做到以下几步:
EJB的调用必须通过Remote接口。
必须将EJB的Remote接口类放在本地的类路径下
类路径下还要包括其他的几个jar文件,这几个jar文件都在Glassfish的lib目录下,包括javaee.jar,appserv-rt.jar,appserv-ext.jar和appserv-deploy-client.jar
在Java命令中需要包括以下的参数,例如:
java -Dorg.omg.CORBA.ORBInitialHost=com.acme.Host1(指定Glassfish的主机名或IP地址,缺省是localhost)
-Dorg.omg.CORBA.ORBInitialPort=9876 (指定EJB所监听的IIOP端口,缺省是3700)
在代码中进行显示的EJB lookup和调用。例如:
.......
public static void main(String[] args) {
try {
InitialContext ic =new InitialContext();
NewSessionRemote sayhello = (NewSessionRemote) ic.lookup("mypackage.NewSessionRemote");
String result = sayhello.sayHello("dad");
System.out.println(result);
} catch (NamingException ex) {
ex.printStackTrace();
}
}
........
五. 在别的Web容器中调用(Tomcat)
在别的Web容器中的Servlet和JSP也可以对Glassfish上的EJB进行远程调用,这个调用从原理上就和在(四)中介绍的“独立的客户端对EJB调用”一样,在调用的代码上有一点区别,就是在这些Web容器中通常对JDNI容器有自己的实现方法和参数设置,需要强制改变这些设置才能成功调用Glassfish中的EJB,解决方案是加入以下代码:Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
props.setProperty("org.omg.CORBA.ORBInitialHost", "puma.prc.sun.com");
props.setProperty("org.omg.CORBA.ORBInitialPort", "6262");
InitialContext ic = new InitialContext(props);
当然,EJB的Remote接口和那几个Glassfish所带的应用服务器相关的Jar文件也要放到相应的类路径中。
六. 在不同的Glassfish容器之间调用
如果在(五)的场景中,调用者和被调者的应用都在Glassfish上,调用过程可以大大简化。在调用的Web应用中可以通过“corba interop”的技术对远端的EJB进行引用,而在代码中不需要进行任何的修改,就像在同一个Glassfish实例上的EJB一样。例如,在调用者的Servlet中:package wangyu;
import java.io.*;
import java.net.*;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import mypackage.NewSessionRemote;
/**
*
* @author wangyu
* @version
*/
public class CallRemote extends HttpServlet {
@EJB
private NewSessionRemote newSessionBean;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet CallRemote</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Returned string from Session bean is " + newSessionBean.sayHello("Wang Yudasd") + "</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}
这些代码和(一)中完全一样。但是在sun-web.xml中,需要加上EJB引用的配置:
<ejb-ref>
<ejb-ref-name>wangyu.CallRemote/newSessionBean</ejb-ref-name>
<jndi-name>corbaname:iiop:puma.prc.sun.com:3700#mypackage.NewSessionRemote</jndi-name>
</ejb-ref>
在JNDI的名字中指向另外一个Glassfish实例(有可能在另外一台机器上)的地址中的EJB。
相关文章推荐
- 在Glassfish中进行EJB调用的几种场景
- 在Glassfish中进行EJB调用的几种场景
- 在Glassfish中进行EJB调用的几种场景
- 在Glassfish中进行EJB调用的几种场景
- javaScript valueOf和toString方法在不同场景被调用进行数据转换
- tomcat 调用 glassfish4 中 EJB 必备jar包
- RN中使用fetch进行网络请求的几种场景和姿势
- 有些应用软件进行系统调用时,为了一些场景更好的实现最优的表现,因此需要调整操作系统参数:
- Weblgoic调用EJB的几种方法
- 远程调用的几种方式
- Python调用adb命令实现对多台设备同时进行reboot
- VC++中调用word进行word表格的填写
- 《C#中自定义控件并在Form中进行调用》
- 一个关于远程调用方式的场景
- 【黑马程序员】关于多线程聊天室中出现的“由于其他线程拥有此对象,因此调用线程无法对其进行访问”问题的探究
- 定义一个交通工具(Vehicle)的类,在测试类Vehicle中的main()中实例化一个交通工具对象,通过方法给它初始化speed,size的值,并打印出来。另外,调用加速,减速的方法对速度进行改变
- EditText 在不同场景下调用软键盘的总结
- QT下实现对Linux Shell调用的几种方法 QProcess AND QThread
- EJB例子:既支持远程又支持本地调用
- shell和Python调用企业微信服务号进行报警