J2EE Enterprise Application企业应用程序包含EJB、WEB
EJB:Eclipse+Wildfly10 创建第一个EJB项目
使用Eclipse(IDE是 Red Hat JBoss Developer Studio 11.0.0.GA)创建 Enterprise Application Project 并部署到wildfly 实现请求页面访问EJB
一、创建Enterprise Application Project
1、new-javaEE-Enterprise Application Project
2、服务器选择wildfly,因为要部署到wildfly
3、选择EJB、WEB(在前面的博客中写好了,需要修改的JNDI在后面给出)
选中自动生成application.xml 里面是EJB和WEB模块的配置
项目目录:
二、修改WEB中访问EJB时用到的JNDI
1、由于EJB在EAR中被部署后,绑定的JNDI前面会加上EAR的包名,否则报错。
15:24:44,650 INFO [org.jboss.ejb.client] (default task-3) JBoss EJB Client version 2.1.4.Final
15:24:44,656 ERROR [io.undertow.request] (default task-3) UT005023: Exception handling request to /EJB-HelloWorld-Web/test: java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:, moduleName:EJB-HelloWorld, distinctName:] combination for invocation context [email protected]
at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:798)
at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:128)
at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186)
at org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183)
at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146)
at com.sun.proxy.$Proxy55.sayHello(Unknown Source)
at com.ews.ejb.test.doGet(test.java:52)
at com.ews.ejb.test.doPost(test.java:68)
2、修改WEB中的test(servlet,在页面端实现post请求servlet,测试访问EJB)
package com.ews.ejb;
import java.io.IOException;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.micmiu.ejb.HelloWorldRemote;
@WebServlet("/test")
public class test extends HttpServlet {
private static final long serialVersionUID = 1L;
public test() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
//页面请求
System.out.println("---------");
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
props.put(Context.PROVIDER_URL, "http-remoting://localhost:8081");
props.put("jboss.naming.client.ejb.context", true);
System.out.println("=========");
try {
// InitialContext context = new InitialContext(props);
InitialContext context = new InitialContext(); //如果客户端和jboss运行在同一个jvm,不需要传入props
//JNDI路径 查看控制台输出文件 @remote 注解的
// String fullEJBName = "EJB-HelloWorld/HelloWorld!com.micmiu.ejb.HelloWorldRemote"; //简单的java客户端访问EJB的JNDI
// String fullEJBName = "ejb:EJB-HelloWorld//HelloWorld!com.micmiu.ejb.HelloWorldRemote"; //WEB和EJB一起部署到Wildfly服务器, WEB访问EJB
String fullEJBName = "ejb:EJB-HelloWorld-ear/EJB-HelloWorld//HelloWorld!com.micmiu.ejb.HelloWorldRemote"; //EAR打包 部署到Wildfly 由于EJB在EAR中被部署后,绑定的JNDI前面会加上EAR的包名
HelloWorldRemote helloWorld = (HelloWorldRemote) context.lookup(fullEJBName);
System.out.println(helloWorld.sayHello("王慕一"));
// helloWorld.connectOracle();
System.out.println("客户端请求完成!");
} catch (NamingException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
三、EAR部署到Wildfly,测试访问。
1、在wildfly中添加ear
2、wildfly运行,浏览器访问http://localhost:8081/EJB-HelloWorld-Web/test
3、Eclipse console: