同時部署在wildfly下的Web訪問EJB
1、又發現針對EJB整理的不錯的文章,推薦下:帶你走進EJB-系列 作者在部落格中已經寫了EJB一個系列的,讀了發現思路相當清晰,可惜標題不直接是EJB 導致這麼好的文章很難搜素得到。
2、Google強於百度,難點是Google搜尋出來的,百度搜了半天,呵呵。
3、EJB建立在之前的文章 Eclipse+Wildfly10 建立第一個EJB專案
一、建立Web應用
1、Eclipse中建立Web應用
我這裡選擇的IDE是 Red Hat JBoss Developer Studio 11.0.0.GA,貌似集成了EJB相關的開發工具,反正很diao。
環境選擇Wildfly,因為要在上面部署,其他的不動。
兩次next以後,選中自動生成web.xml,Finish
2、Java Resources --> src -->右鍵 -->new-->servlet
預設生成 doGet和doPost方法。
3、web應用的WEB-INF中新建 index.html,為了訪問測試使用。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>歡迎頁面</title> </head> <body> eclipse 部署 wildfly </body> </html>
4、此時的專案目錄:
5、wildfly只部署web應用:
Web應用部署到wildfly以後,瀏覽器訪問:http://localhost:8081/EJB-HelloWorld-Web/
這裡是在Eclipse中直接部署,也可以在wildfly的 wildfly-10.1.0.Final\standalone\deployments 中打成war包部署。
EJB-HelloWorld-Web是專案名稱,預設訪問index.html
6、doGet請求,瀏覽器訪問 http://localhost:8081/EJB-HelloWorld-Web/test
二、Web新增訪問EJB介面,訪問方法
1、將需要的三個jar放到lib下,build to path.
一個是EJB的介面類jar,兩個是wildfly中client的jar
2、修改test,新增訪問方法。主要為了頁面請求,實現呼叫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";
// Object obj = context.lookup(fullEJBName);
HelloWorldRemote helloWorld = (HelloWorldRemote) context.lookup(fullEJBName);
System.out.println(helloWorld.sayHello("王慕一"));
System.out.println("客戶端請求完成!");
// helloWorld.connectOracle();
} catch (NamingException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
注意:
1、如果客戶端和jboss執行在同一個jvm,不需要傳入props
釋出在 Jboss(升級改名為wildfly) 下的客戶端(這裡是Web應用)不需要明確設定 JNDI 訪問的上下文環境,可以直接通過 InitialContext ctx = new InitialContext()獲得上下文環境,容器會自動賦給 InitialContext 正確的環境。
如果傳入了props,console反而會報一大堆錯。
2、釋出到EJB容器的東西只能通過jndi來訪問,所以JNDI路徑一定要正確,此時的環境是同時部署在wildfly下的Web訪問EJB,根簡單的java客戶端訪問EJB還不太一樣。
這裡谷歌百度了很久,就是一直報notFound錯,JNDI路徑不對。看了很多文章都是用的jboss老版本,也不知道是現在wildfly10改成啥樣了,反正各種不支援。
關於jboss下 web 客戶端如何訪問EJB的問題 文中說的修改ejb-jar.xml、jboss.xml並沒用,
EJB學習筆記-4-web應用訪問EJB(remote) 發現 jndi 需要改成:ejb:/EJB-HelloWorld/HelloWorld!com.micmiu.ejb.HelloWorldRemote ,執行以後報錯 org.jboss.ejb.client.naming.ejb.EjbNamingContext cannot be cast to com.micmiu.ejb.HelloWorldRemote
谷歌以後,https://developer.jboss.org/thread/175286 從結果第一條找到了解決辦法,你再百度下試試(讓你哭):
修改JNDI為:ejb:/EJB-HelloWorld//HelloWorld!com.micmiu.ejb.HelloWorldRemote
最終訪問成功,console在下面給出。
三、部署Web和EJB測試
1、wildfly同時部署Web和EJB
這裡不涉及到釋出所以直接在Eclipse中部署,釋出的時候直接把EJB.jar和EJB-HelloWorld-Web.war 放到 wildfly-10.1.0.Final\standalone\deployments
2、瀏覽器訪問: http://localhost:8081/EJB-HelloWorld-Web/test
檢視console: