软件: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 block
e.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.NamingContextFactory
at 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 exception
java.lang.NullPointerException
at 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!