MyEclipse、JBoss开发EJB-EntityBean学习

来源:互联网 发布:网络舆论聚焦热点事件 编辑:程序博客网 时间:2024/06/05 13:22

软件:MyEclipse9.0,jboss-6.1.0.Final,apache-tomcat-6.0.35,MySQL Server 5.1,jdk1.6.0_21

 

根据《MyEclipse 6 Java 开发中文教程》中的第十六章开发EJB应用,学习EntityBean,并根据文中内容做练习。

1、创建数据源

从JBoss 的安装目录下的docs\examples\jca 中找到配置文件mysql-ds.xml,修改下数据库连接串、用户名、密码,因为跨服务器访问,所以再加上<use-java-context>false</use-java-context>标签,

<jndi-name>MySqlDS</jndi-name><use-java-context>false</use-java-context><connection-url>jdbc:mysql://localhost:3306/housingfund</connection-url>

修改完毕后复制到JBoss 的安装目录下的server\default\deploy 下,并把Mysql驱动jar拷贝到server\default\lib 下,然后启动JBoss,可在输出信息中看到:

在查看JBoss 的JNDI,可在Global JNDI Namespace 下看到:

这样,数据源就配置好了。

 

2、使用JPA + 会话 Bean 的方式来实现远程访问数据库

按照16.6 开发实体Bean一节中所述,创建自己的EntityBean,完成后,项目目录结构如下图所示:

将项目打成jar包部署到JBoss根目录的server\default\deploy下,控制台信息输出如下:

可在Global JNDI Namespace 下看到:

发布成功。

 

3、客户端测试程序

新建web项目,新建一个信息录入页面,servlet中主要代码如下:

 

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");String name = request.getParameter("name");String sex = request.getParameter("sex");String telephone = request.getParameter("telephone");String address = request.getParameter("address");Customer customer = new Customer();customer.setName(name);customer.setSex(Integer.valueOf(sex));customer.setTelephone(telephone);customer.setAddress(address);Context ctx = null;Properties properties = new Properties();properties.setProperty(Context.PROVIDER_URL, "jnp://localhost:1099");properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory"); properties.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");try {ctx = new InitialContext(properties);Object object = ctx.lookup("CustomerFacade/remote");CustomerFacadeRemote dao = (CustomerFacadeRemote) object;dao.save(customer);List<Customer> customerList = new ArrayList<Customer>();customerList = dao.findAll(null);request.setAttribute("customerList", customerList);ctx.close();} catch (NamingException e) {// TODO Auto-generated catch blocke.printStackTrace();}RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");dispatcher.forward(request, response);}


Jboss生成的JNDI名称,默认命名规则如下:
如果把EJB应用打包成后题为.jar的模块文件,默认的全局JNDI名称是
本地接口:EJB-CLASS-NAME/local
远程接口:EJB-CLASS-NAME/remote
部署到tomcat目录下然后启动,IE中访问,页面操作完成后保存,tomcat控制台报错(心碎,报错…):

javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)at javax.naming.InitialContext.init(InitialContext.java:223)at javax.naming.InitialContext.<init>(InitialContext.java:197)at com.bdjx.servlet.CustomerServlet.doPost(CustomerServlet.java:80)at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877)at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594)at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1675)at java.lang.Thread.run(Thread.java:619)Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactoryat org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:247)at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:46)at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)... 18 more


赶紧google一下,网上好多都说是没引入jbossall-client.jar或者引入的client包不全,可是我在MyEclipse中查看了下项目目录下这些jar包都是有的啊,总共172个,client文件

夹下所有的jar包啊,来回测试好多次,还是报错,最后发现tomcat中发布的项目目录中只有一个jbossall-client.jar,这个里面是没有.class文件的,恍然大悟啊,于是,项目->右键->Build Path->Configure Build Path->Add External JARs,打开client目录,选中所有jar,重新部署后启动tomcat,IE中访问项目,又报错,定睛一看,松了口气,常见的问题:

2012-8-14 14:54:13 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() for servlet jsp threw exceptionjava.lang.NullPointerExceptionat org.apache.jsp.index_jsp._jspInit(index_jsp.java:24)at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:164)at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:340)at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877)at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594)at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1675)at java.lang.Thread.run(Thread.java:619)


一定是引入到jar里面有与tomcat的lib里面的jar相冲突的内容,仔细检查后,删除client中引入的jboss-el-api_2.2_spec.jar、jboss-jsp-api_2.2_spec.jar、jboss-servlet-api_3.0_spec.jar这三个包,重新部署后,启动tomcat,然后访问,一切OK!

 

原创粉丝点击