今天学习到的第二个重要的概念就是EJB的本地客户端和远程客户端以及本地访问方式和远程访问方式的相关概念。
远程客户端与远程访问方式:
所谓远程客户端指的是客户端程序与JBOSS应用服务器以及部署在服务器上的EJB在不同的JVM进程中。下面的实例说明了远
程客户端的特点以及相应的访问方式。
客户端程序:
public class RemoteEjbClient {
public static void main(String[] args) {
try {
InitialContext context = new InitialContext();
UserServiceRemote userService = (UserServiceRemote)context.lookup("UserServiceImpl/remote");
User user = new User();
user.setUsername("zhangsan");
userService.save(user);
System.out.println(user.getId());
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
其中,UserServiceRemote接口被标记为远程方式,然后将user的id值打印出来。
服务器端EJB:
@Stateless
@Remote(UserServiceRemote.class)
@Local(UserServiceLocal.class)
public class UserServiceImpl implements UserServiceLocal,UserServiceRemote{
public void save(User user) {
// TODO Auto-generated method stub
user.setId(100);
System.out.println(user.getUsername()+"已经被保存了,id="+user.getId());
}
}
很简单的方法,就是给user实例设置了一个id,同时将客户端赋值给user对象的username打印出来。
服务器端将user的id设置成了100。但是实际运行客户端程序的结果却是:
结果:0
这个实例说明:在远程访问方式中,服务器端使用的user实际上是对客户端的一份拷贝,这样,user在服务器端做的任何
修改都无法在客户端的user中反映出来。
这里需要注意:远程客户端只能使用远程方式访问。
本地客户端以及相应的访问方式:
本地客户端指的是客户端程序与部署了相应的EJB服务器在同一个JVM的进程中执行。
服务器端程序不需要进行修改,为了能够与服务器在同一个JVM的进程中执行,可以建立一个web项目,将该web项目部
署到同一个服务器中。在本例中,以一个Servlet为例。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
User user = null;
try {
InitialContext context = new InitialContext();
UserServiceLocal userService = (UserServiceLocal)context.lookup("UserServiceImpl/local");
user = new User();
user.setUsername("lisi");
userService.save(user);
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out
.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println(user.getId());
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
与远程客户端不同的是,生成了一个UserServiceLocal类型的实例,同样把执行save()方法之后的user.id打印在页面中
,并以本地访问方式进行访问,结果与上面有很大的不同。
结果:100。
说明:在本地访问方式中,客户端与服务器端访问的是同一个实例,因此服务器端的变化都会反映到客户端。
注意:本地客户端也可以使用远程访问方式访问EJB。
方法就是将上面代码中标红的语句替换成:
UserServiceRemote userService = (UserServiceRemote)context.lookup("UserServiceImpl/remote");
修改后的执行的结果和上面的远程访问方式是一样的。
结果:0。
最后总结:远程客户端只能使用远程方式访问EJB,而本地客户端既可以使用本地方式也可以使用远程方式访问EJB。
但是本地客户端使用远程方式访问的效率会比较低。