项目目的:理解远程调用服务端和本地调用服务端的区别
1.异常:
javax.ejb.EJBException: Local and Remote Interfaces cannot
have duplicate interface for bean UserManagerBean
2.本地客户端可以使用远程访问方式;这样就会用远程的方式去调用;也就是说
取不到服务端设置的id值;
3.本地访问方式传递对象的时候,接口的实现类处理的对象和jsp中取得的对象
是同一个对象,也就是对应的本地的同一块内存区域,当用本地访问方式的时
候,user对象可以不实 现序列号接口
--------------------------------------------------------------------
4.注意:
a.本地的访问方式:客户端调用服务端EJB的时候,传递的是一个引用,客户端
和服务端用的是内存中的一块内存空间
b.远程访问的时候,传的是值;
--------------------------------------------------
5.注意:
a.如果写的客户端是web工程的时候,那么可以不需要引入EJB的包,因为
部署的时候,已经部署到jboss中了,而那些包,也已经在jboss启动的时
候加载,加入又重复的引入了EJB的jar包,那么eclipse在运行时候会把
这些jar包,加到WEB-INF/lib下,比如javax.servlet中千万不要重复的
丢到这里面来;
b.不需要,在src下写入jndi.properties文件;因为,它运行的时候就是在
jboss的运行环境中;
--------------------------------------------------------------------
1.新建项目:EJBTest_03
com.credream.ejb
User.java
package com.credream.ejb;
import java.io.Serializable;
public class User implements Serializable{
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
----------------------------------------------------------
UserManager.java
package com.credream.ejb;
public interface UserManager {
public void addUser(User user);
}
------------------------------------------------
UserManagerBean.java
package com.credream.ejb;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote(UserManager.class)
@Local(UserManager.class)
public class UserManagerBean implements UserManager {
public void addUser(User user) {
System.out.println("user[username="+user.getUsername()+"]已
经被成功保存了");
user.setId(10);
}
}
------------------------------------------------------------
新建本地客户端:javaproject,导入jar包,并且类路径下写入jndi.properties
com.credream.ejb
UserManagerClient.java
package com.credream.ejb;
import javax.naming.InitialContext;
public class UserManagerClient {
public static void main(String[] args) throws Exception{
InitialContext context=new InitialContext();
UserManager userManager=(UserManager) context.lookup("UserManagerBean/remote");
User user=new User();
user.setUsername("zhangsan");
user.setPassword("123lidewei");
userManager.addUser(user);
System.out.println("用户信息已经被成功保存,它的ID是:"+user.getId());
}
}
-------------------------------------------------------------------
新建远程客户端:新建web project
EJBTest03_webClient
<%@ page language="java" import="java.util.*,javax.naming.*,com.credream.ejb.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
InitialContext context=new InitialContext();
//UserManager userManager=(UserManager) context.lookup("UserManagerBean/remote");
//本地客户端可以使用远程访问方式;这样就会用远程的方式去调用;也就是说 取不到服务端设置的id值;
UserManager userManager=(UserManager) context.lookup("UserManagerBean/local");
User user=new User();
user.setUsername("zhangsan");
user.setPassword("123lidewei");
userManager.addUser(user);
out.println("用户信息已经被成功保存,它的ID是:"+user.getId());
%>
</body>
</html>
--------------------------------------------------------------
通过这个例子的结果,可以分析,远程访问方式,和本地访问方式的不同,和联系
----------------------------------------------------------------