高分挑战高手:jsp访问ejb
开发环境为:winxp + eclipse + tomcat5.x + jboss3.2 + lomboz
想要实现的功能为:
在页面上输入一个email,提交后在同一页面返回给用户一行字符串
为原email+“is an apple”.例如,输入“ab@cd.com”,返回
“ab@cd.com is an apple”
已经实现的功能为:
利用eclipse + jboss3.2 + lomboz,已经开发好ejb的部分,包括
bean,home等内容,并且可以用lomboz的lomboz ejb client test
wizard开发的带有main()的.java客户端测试成功
尚未解决的问题:
如何自己新建一个工程,用页面jsp程序访问已实现的ejb。在页面
上输入一个email,提交后在同一页面返回给用户一行字符串
为原email+“is an apple”.
请高人指点,最好给出web客户端的代码,为方便,以下给出ejb所在工程的内容
工程:J2EE_test
包:ml
文件:MLAdmin.java,MLAdminBean.java,MLAdminHome.java,MLAdminLocal.java
MLAdminLocalHome.java,MLAdminSession.java,MLAdminUtil.java
其中MLAdminBean.java为ejb具体实现内容,方法为:
public String getName(String email){
return email+" is a apple";
}
以上程序是参考《精通eclipse》实现的,但该书没有写用lomboz生成ejb后,如何用jsp的web
访问。
请高手帮忙,希望给出web客户端的代码,解决立即给分。
问题点数:100、回复次数:31Top
1 楼diy8187(雞狗豬驢)回复于 2006-03-20 10:03:39 得分 10
友情UP.Top
2 楼wmzsl(王明哲)回复于 2006-03-20 10:11:22 得分 0
没有这么访问的,jsp直接访问ejb虽然完全可以访问,但是层次太差!
你写一个servicelocator,然后在jsp去调用就好了!Top
3 楼ibiswang(神鸟)回复于 2006-03-20 10:18:10 得分 30
1.在你的web.xml中加入如下内容:
<ejb-ref>
<ejb-ref-name>ml/MLAdminHome</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>ml.MLAdminHome</home>
<remote>ml.MLAdmin</remote>
</ejb-ref>
2.在你的jboss-web.xml中加入如下内容:
<ejb-ref>
<ejb-ref-name>ml.MLAdminHome</ejb-ref-name>
<jndi-name>MLAdmin</jndi-name>
</ejb-ref>
3. 将ejb相关的home接口类与运行接口类(例如,你的util class)以jar的方式放在WEB-INF/lib目标下
4. 在jsp中按下代码进行:
Context ejbContext = new InitialContext();
MLAdminHome adminHome= (MLAdminHome) PortableRemoteObject.narrow(ejbContext.lookup("ml/MLAdminHome"), ml.MLAdminHome);
MLAdmin mlAdmin = (MLAdmin)adminHome.create();
return mlAdmin.getName("a@a.net");
Top
4 楼abckid9(abckid9)回复于 2006-03-20 10:27:11 得分 0
谢谢各位,请问楼上
2中的jboss-web.xml是哪个文件夹下的?我用的是jboss3.2.8sp1,里面有很多jboss-web.xml
3应该怎么做呢?Top
5 楼killme2008(为了生态平衡,请保护蛤蟆)回复于 2006-03-20 10:49:53 得分 0
jboss-web.xml跟部署文件ejb-jar.xml在同一个文件夹
打包成JAR,jar -cvf test.jar *.class
eclipse可以直接打包吧Top
6 楼abckid9(abckid9)回复于 2006-03-20 11:10:02 得分 0
我的jsp代码为:
<%@ page language="java" %>
<%@ page import="ml.MLAdmin" %>
<%@ page import="javax.naming.InitialContext" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<% Context ejbContext = new InitialContext();
MLAdminHome adminHome= (MLAdminHome) PortableRemoteObject.narrow(ejbContext.lookup("ml/MLAdminHome"), ml.MLAdminHome);
MLAdmin mlAdmin = (MLAdmin)adminHome.create();
String result = mlAdmin.getName("a@a.net");
%>
<p>
<center>
<h3>Emal info</h3><br>
Input Query Emal ID : <input type="text" name="email"><br><br>
<input type="submit" value="Go"><br>
<font color="blue">
<b>Email Adress:<%=result%></b>
</font>
</center>
</p>
</body>
</html>
但是报错:
Context cannot be resolved or is not a type
ml.MLAdminHome cannot be resolved or is not a type
MLAdminHome cannot be resolved or is not a type
不知道是为什么Top
7 楼ibiswang(神鸟)回复于 2006-03-20 11:19:40 得分 0
你没有引入正确的package:
import javax.ejb.*;
import java.rmi.*;
import javax.rmi.*;
import java.util.*;
import javax.naming.*;
import ml.*;Top
8 楼abckid9(abckid9)回复于 2006-03-20 11:28:19 得分 0
谢谢楼上,按你的内容修改后:
<%@ page language="java" %>
<%@ page import="import javax.ejb.*" %>
<%@ page import="java.rmi.*" %>
<%@ page import="java.util.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="ml.*" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<% Context ejbContext = new InitialContext();
MLAdminHome adminHome= (MLAdminHome) PortableRemoteObject.narrow(ejbContext.lookup("ml/MLAdminHome"), ml.MLAdminHome);
MLAdmin mlAdmin = (MLAdmin)adminHome.create();
String result = mlAdmin.getName("a@a.net");
%>
<p>
<center>
<h3>Emal info</h3><br>
Input Query Emal ID : <input type="text" name="email"><br><br>
<input type="submit" value="Go"><br>
<font color="blue">
<b>Email Adress:<%=result%></b>
</font>
</center>
</p>
</body>
</html>
还有3个错误:
Syntax error on token "import",delete this token
ml.MLAdminHome cannot be resovled
PortableRemoteObject cannot be reslolved
是不是还应该引用什么,或者缺少jar包?
我的工程是在eclipse里新建一个tomcat工程而得到的Top
9 楼xxrl(孔曰成仁,孟曰取媳妇-->她太有才了)回复于 2006-03-20 12:43:13 得分 0
upTop
10 楼abckid9(abckid9)回复于 2006-03-20 12:51:53 得分 0
请大家帮忙看一下,我的工程是eclipse建的tomcat工程Top
11 楼saxonkkk(Saxon)回复于 2006-03-20 14:27:35 得分 0
你真的很强,是初学者吗,明明有写错误的,在导入包第一行
多了个"import",去掉Top
12 楼abckid9(abckid9)回复于 2006-03-20 15:16:14 得分 0
不好意思,笔误,我现在的代码是:
<%@ page language="java" %>
<%@ page import="javax.ejb.*" %>
<%@ page import="java.rmi.*" %>
<%@ page import="java.util.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="ml.*" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<% Context ejbContext = new InitialContext();
MLAdminHome adminHome= (MLAdminHome) PortableRemoteObject.narrow(ejbContext.lookup("ml/MLAdminHome"), ml.MLAdminHome);
MLAdmin mlAdmin = (MLAdmin)adminHome.create();
String result = mlAdmin.getName("a@a.net");
%>
<p>
<center>
<h3>Emal info</h3><br>
Input Query Emal ID : <input type="text" name="email"><br><br>
<input type="submit" value="Go"><br>
<font color="blue">
<b>Email Adress:<%=result%></b>
</font>
</center>
</p>
</body>
</html>
但是还报错:
ml.MLAdminHome cannot be resovled
PortableRemoteObject cannot be reslolved
帮忙看看。Top
13 楼abckid9(abckid9)回复于 2006-03-20 15:17:01 得分 0
错误指示在
MLAdminHome adminHome= (MLAdminHome) PortableRemoteObject.narrow(ejbContext.lookup("ml/MLAdminHome"), ml.MLAdminHome); 部分
是否缺少引用或者jar包?Top
14 楼killme2008(为了生态平衡,请保护蛤蟆)回复于 2006-03-20 17:27:58 得分 0
MLAdminHome adminHome= (MLAdminHome) PortableRemoteObject.narrow(ejbContext.lookup("ml/MLAdminHome"), MLAdminHome.class);
认真看下书,认真检查下代码,这些问题不该犯的Top
15 楼Saro(这也不是江水,这是二十年流不尽的英雄血。)回复于 2006-03-20 17:49:46 得分 0
ejb太麻烦难学了哩,一个普通的业务bean要写4个类,3个部署文件,可怕
楼主还是新手的话,没必要现在学ejb的,打好基础再说。Top
16 楼abckid9(abckid9)回复于 2006-03-20 18:34:49 得分 0
MLAdminHome adminHome= (MLAdminHome) PortableRemoteObject.narrow(ejbContext.lookup("ml/MLAdminHome"), MLAdminHome.class); 哪里错了?请指教Top
17 楼abckid9(abckid9)回复于 2006-03-20 19:43:46 得分 0
我觉得报错
ml.MLAdminHome cannot be resovled
PortableRemoteObject cannot be reslolved
可能是没有和MLAdminHome 连接上
还缺少一个引用
但是不知道怎么解决Top
18 楼abckid9(abckid9)回复于 2006-03-20 20:58:15 得分 0
有了比较大的突破,现在jsp已经不报错了
<%@ page language="java" %>
<%@ page import="java.rmi.*" %>
<%@ page import="java.util.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="ml.*"%>
<%@ page import="javax.rmi.PortableRemoteObject"%>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>Lomboz JSP</title>
</head>
<body bgcolor="#FFFFFF">
<% Context ejbContext = new InitialContext();
ml.MLAdminHome adminHome= (ml.MLAdminHome) PortableRemoteObject.narrow(ejbContext.lookup("ml/MLAdminHome"), MLAdminHome.class);
MLAdmin mlAdmin = (MLAdmin)adminHome.create();
String result = mlAdmin.getName("a@a.net");
%>
<p>
<center>
<h3>Emal info</h3><br>
Input Query Emal ID : <input type="text" name="email"><br><br>
<input type="submit" value="Go"><br>
<font color="blue">
<b>Email Adress:<%=result%></b>
</font>
</center>
</p>
</body>
</html>
但是运行页面时,报错:
An error occurred at line: 17 in the jsp file: /jsptest.jsp
Generated servlet error:
G:\workspace\ccc\work\org\apache\jsp\jsptest_jsp.java:67: cannot access javax.ejb.EJBHome
file javax\ejb\EJBHome.class not found
MLAdmin mlAdmin = (MLAdmin)adminHome.create();
An error occurred at line: 17 in the jsp file: /jsptest.jsp
Generated servlet error:
G:\workspace\ccc\work\org\apache\jsp\jsptest_jsp.java:68: cannot access javax.ejb.EJBObject
file javax\ejb\EJBObject.class not found
String result = mlAdmin.getName("a@a.net");
我分析是4楼ibiswang帖子中的内容3--“将ejb相关的home接口类与运行接口类(例如,你的util class)以jar的方式放在WEB-INF/lib目标下” 我没有做好
但是我已经将ejb的jar包myEJB.jar放到我的tomcat工程的web-inf的lib下面了
请大家帮忙分析一下,谢谢
Top
19 楼bryantd(Delphi菜鸟)回复于 2006-03-21 11:24:57 得分 0
帮你顶Top
20 楼piaopiao11()回复于 2006-03-21 11:43:05 得分 0
没有j2ee.jarTop
21 楼abckid9(abckid9)回复于 2006-03-21 12:33:23 得分 0
谢谢bryantd
楼上,我已经引进jboss-j2ee.jar了。我的classpath文件如下,请大家指正:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="var" path="TOMCAT_HOME/common/lib/servlet-api.jar"/>
<classpathentry kind="var" path="TOMCAT_HOME/common/lib/jasper-runtime.jar"/>
<classpathentry kind="var" path="TOMCAT_HOME/common/lib/jsp-api.jar"/>
<classpathentry kind="src" path="WEB-INF/src"/>
<classpathentry output="work" kind="src" path="work"/>
<classpathentry kind="src" path="/J2EE_test"/>
<classpathentry kind="var" path="JBOSS32X/client/jboss-j2ee.jar"/>
<classpathentry kind="var" path="JBOSS32X/client/jnp-client.jar"/>
<classpathentry kind="var" path="JBOSS32X/client/jboss-client.jar"/>
<classpathentry kind="var" path="JBOSS32X/client/jboss-common-client.jar"/>
<classpathentry kind="var" path="JBOSS32X/client/jbosssx-client.jar"/>
<classpathentry kind="var" path="JBOSS32X/client/log4j.jar"/>
<classpathentry kind="var" path="JBOSS32X/client/jnet.jar"/>
<classpathentry kind="var" path="JBOSS32X/server/default/lib/jnpserver.jar"/>
<classpathentry kind="var" path="JBOSS32X/client/jboss-jaas.jar"/>
<classpathentry kind="output" path="WEB-INF/classes"/>
</classpath>
Top
22 楼piaopiao11()回复于 2006-03-21 12:45:22 得分 40
你这是eclipse 项目的classpath
在tomcat里面还是没有这些包
要把包考到WEB-INF/lib下面Top
23 楼GeminiFox(紫金山下,月牙湖畔)回复于 2006-03-21 12:50:34 得分 0
楼主脑子有毛病啊,干吗用jsp直接调用ejb?Top
24 楼abckid9(abckid9)回复于 2006-03-21 12:52:29 得分 0
piaopiao,我把WEB-INF/lib加入各个jar包了
现在的错误是:
javax.servlet.ServletException: Name ml is not bound in this Context
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
org.apache.jsp.jsptest_jsp._jspService(jsptest_jsp.java:92)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
Top
25 楼piaopiao11()回复于 2006-03-21 13:00:44 得分 10
应该是在new InitialContext();
加入环境
Hashtable h=new Hashtable();
h.putAll(System.getProperties());
String url="jnp://127.0.0.1:1099";
String fac="org.jnp.interfaces.NamingContextFactory";
h.put(InitialContext.PROVIDER_URL,url);
h.put(InitialContext.INITIAL_CONTEXT_FACTORY,fac);
Context ejbContext = new InitialContext(h);
你在试试
Top
26 楼ibiswang(神鸟)回复于 2006-03-21 13:00:46 得分 0
建议你好好找个完整的示例文章来做下,你对EJB Container, JNDI以及Web相关规范知道的太少了,你还是找个完整的示例吧,一步一步可能会好些!
上面提示的错误是你的JNDI中没有加入路径为ml的东东。
我想可能是你的ejb module与你的jboss-web.xml以及web.xml配置之间出问题了。。Top
27 楼abckid9(abckid9)回复于 2006-03-21 13:35:33 得分 0
楼上说的jboss-web.xml,我为什么一直没找到?我是jboss3.2.8Top
28 楼jordan1(班君)回复于 2006-03-21 14:21:35 得分 10
关注!Top
29 楼abckid9(abckid9)回复于 2006-03-21 14:32:32 得分 0
刚才我查了资料,我是按这篇文章做的:
首先介绍JBoss容器中部署各类EJB对象的两种方法。下面的演示以Session Bean为例,客户端是一个本机上的web应用。这里不对演示程序进行具体介绍。
第一种方式
把开发好的ejb jar包和web应用的war包公共放在deploy目录下。
演示1:不需要jboss.xml文件和其他任何特殊的设置。
ejb-jar.xml:
<ejb-jar>
······
<ejb-name>ejbtest</ejb-name>
······
</ejb-jar>
客户端:web应用中对web.xml不需要添加ejb信息,不需要jboss-web.xml文件。引用ejb对象的jsp文件如下:
······
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("ejbtest"); //使用<ejb-name> beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);
······
<!--[if !supportEmptyParas]--> <!--[endif]-->
我之前的错误是,没有把我的tomcat和jboss整合
按上文,我把myEJB.jar和client.war放到jboss-3.2.8.SP1\server\all\deploy文件夹
请问一下,怎么在jboss访问我的web工程client.war?
Top
30 楼abckid9(abckid9)回复于 2006-03-21 15:44:45 得分 0
已经解决了,谢谢各位
我一会儿把详细过程写一下Top
31 楼killme2008(为了生态平衡,请保护蛤蟆)回复于 2006-03-23 08:21:55 得分 0
楼主,我冒昧提个建议,从你的发言来看,你对RMI,JNDI,EJB的基本原理基本都不了解,这样写什么EJB是没什么意义的.Top




