1. 程式人生 > >同時部署在wildfly下的Web訪問EJB

同時部署在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: