在GlassFish/WildFly上创建部署EJB应用及整合Servlet的技术疑问
我来一步步帮你理清这两个问题,都是EJB Web集成里的常见场景,别担心~
一、Servlet/JSP如何调用你的EJB项目?
有两种主流方式,看你想把EJB做成独立组件还是和Web模块放一起:
方式1:把EJB和Web模块打包到同一个EAR(推荐新手)
这种方式最省心,不用处理跨模块的依赖和JNDI查找:
- 先创建一个Enterprise Application(EAR)项目,把你现有的EJB JAR模块添加到这个EAR里
- 接着在同一个EAR下新建一个Web Module(WAR),用来放你的Servlet、JSP和网页表单
- 在Servlet里直接用
@EJB注解注入你的EJB本地/远程Bean就行,比如:
@WebServlet("/addStudentAndGrade") public class AddDataServlet extends HttpServlet { // 注入本地Bean(本地调用性能更好,适合同服务器内的调用) @EJB private StudentBeanLocal studentBean; @EJB private GradeBeanLocal gradeBean; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 从表单获取用户输入 String studentName = request.getParameter("studentName"); String gradeName = request.getParameter("gradeName"); // 调用EJB方法插入数据 Student newStudent = new Student(); newStudent.setName(studentName); studentBean.saveStudent(newStudent); Grade newGrade = new Grade(); newGrade.setName(gradeName); newGrade.setStudent(newStudent); gradeBean.saveGrade(newGrade); // 跳转回表单或者成功页面 response.sendRedirect("addData.jsp"); } }
EAR里的所有模块共享同一个类加载上下文,所以@EJB注入会自动生效,不用额外配置。
方式2:EJB和Web模块分开部署(适合EJB复用场景)
如果你想让EJB成为独立的可复用组件,比如给多个Web项目调用,可以这么做:
- 先把你的EJB JAR部署到服务器上,服务器会自动把EJB注册到JNDI目录
- 在你的Web项目(WAR)里,只需要添加EJB的接口类依赖(不要加实现类,避免类加载冲突)
- 在Servlet里可以通过JNDI查找EJB,或者部分服务器支持直接用
@EJB注入(前提是EJB已经部署)
举个JNDI查找的例子(GlassFish和WildFly的JNDI命名格式略有不同):
// GlassFish的本地BeanJNDI格式:java:global/EJB模块名/Bean类名!全限定接口名 StudentBeanLocal studentBean = (StudentBeanLocal) new InitialContext() .lookup("java:global/MyEJBProject/StudentBean!com.example.ejb.StudentBeanLocal"); // WildFly的本地BeanJNDI格式:java:global/EJB部署名/Bean类名!全限定接口名 StudentBeanLocal studentBean = (StudentBeanLocal) new InitialContext() .lookup("java:global/MyEJBProject/StudentBean!com.example.ejb.StudentBeanLocal");
二、脱离IDE手动部署到GlassFish/WildFly的步骤
不管是哪种服务器,核心都是先打包项目,再传到服务器部署,具体步骤如下:
部署到GlassFish
- 打包项目
- 如果是EAR项目:用Maven执行
mvn package,或者手动用jar命令打包,确保EAR包含EJB JAR、WAR和正确的application.xml(IDE创建的话会自动生成) - 如果是分开的EJB JAR和WAR:分别打包成
.jar和.war文件
- 如果是EAR项目:用Maven执行
- 启动并部署
- 启动GlassFish:运行
glassfish/bin/asadmin start-domain(默认域是domain1) - 部署EAR:执行
asadmin deploy /本地路径/your-project.ear - 分开部署的话:先部署EJB
asadmin deploy /本地路径/your-ejb.jar,再部署WARasadmin deploy /本地路径/your-web.war - 验证部署:访问GlassFish管理控制台(默认
http://localhost:4848),在「Applications」里查看部署状态
- 启动GlassFish:运行
- 测试功能:访问你的Servlet地址,比如
http://localhost:8080/your-web-context/addStudentAndGrade
部署到WildFly
- 打包项目
- 用Maven执行
mvn package,或者手动打包,WildFly支持EAR、独立EJB JAR和WAR格式 - 若有自定义EJB配置,确保
jboss-ejb3.xml放在EJB项目的META-INF目录下(无自定义需求可以省略)
- 用Maven执行
- 启动并部署
- 启动WildFly:运行
wildfly/bin/standalone.sh(Linux/Mac)或standalone.bat(Windows) - 部署方式二选一:
- 自动部署:把打包好的文件(EAR/WAR/JAR)复制到
wildfly/standalone/deployments目录,WildFly会自动检测并部署 - CLI部署:运行
wildfly/bin/jboss-cli.sh --connect连接服务器,然后执行deploy /本地路径/your-project.ear
- 自动部署:把打包好的文件(EAR/WAR/JAR)复制到
- 验证部署:访问WildFly管理控制台(默认
http://localhost:9990),在「Deployments」里查看状态
- 启动WildFly:运行
- 测试功能:访问Web项目的地址,比如
http://localhost:8080/your-web-context/addStudentAndGrade
几个注意事项
- 确保你的
persistence.xml配置正确,并且服务器上已经配置好对应的JDBC连接池(GlassFish在管理控制台的「JDBC连接池」创建,WildFly可以修改standalone.xml或用CLI添加) - 如果用远程EJB,需要注意服务器的远程连接端口:GlassFish默认IIOP端口是3700,WildFly默认远程端口是8080(不同版本可能有差异)
- 部署出错时,去服务器日志目录排查:GlassFish日志在
glassfish/domains/domain1/logs,WildFly日志在wildfly/standalone/log
内容的提问来源于stack exchange,提问作者Ovidiu G
相关产品推荐
相关产品推荐

