1. 程式人生 > >將Tomcat嵌入到自己的應用中

將Tomcat嵌入到自己的應用中

轉自:http://yshjava.iteye.com/blog/1871965

TomcatApache 軟體基金會(Apache Software Foundation)的Jakarta 專案中的一個核心專案,由Apache、Sun 和其他一些公司及個人共同開發而成,是目前比較流行的Web 應用伺服器。

Tomcat執行時佔用的系統資源小,擴充套件性好,支援負載平衡與郵件服務等開發應用系統常用的功能而廣受廣大程式設計師的喜歡。Tomcat不僅有獨立執行的版本,而且還提供了可以內嵌到JavaEE應用中的Embedded版本,這一點非常實用!

將Tomcat伺服器嵌入到自己的應用中,不僅可以大幅縮短搭建Web伺服器所消耗的時間,還可以深度控制Tomcat,從而更好地為應用伺服器。


下面就以Tomcat6為例,以具體程式碼方式展示如何將Tomcat伺服器嵌入到自己的應用中。

Java程式碼  收藏程式碼
  1. package cn.ysh.studio.tomcat;  
  2. import java.io.File;  
  3. import java.net.InetAddress;  
  4. import java.net.UnknownHostException;  
  5. import org.apache.catalina.*;  
  6. import org.apache.catalina.connector.Connector;  
  7. import org.apache.catalina.realm.MemoryRealm;  
  8. import org.apache.catalina.startup.Embedded;  
  9. /** 
  10.  * 以內嵌的方式啟動tomcat伺服器 
  11.  *  
  12.  * @author www.yshjava.cn 
  13.  *  
  14.  */
  15. publicclass EmbeddedTomcat {  
  16.     private EmbeddedTomcat(Embedded tomcat, String listenIP, int listenPort) {  
  17.         this.tomcat = tomcat;  
  18.         this.listenIP = listenIP;  
  19.         this.listenPort = listenPort;  
  20.     }  
  21.     publicstatic EmbeddedTomcat startup(String catalinaHome, String warFileName, int listenPort, boolean enableRemoteAccess) {  
  22.         System.setProperty("catalina.home", catalinaHome);  
  23.         // 監聽IP獲取
  24.         String listenIP;  
  25.         try {  
  26.             listenIP = (enableRemoteAccess ? InetAddress.getLocalHost().getHostAddress() : "127.0.0.1");  
  27.         } catch (UnknownHostException e) {  
  28.             thrownew RuntimeException(e);  
  29.         }  
  30.         // war 檔案檢測
  31.         String contextName;  
  32.         int tn = warFileName.lastIndexOf("//");  
  33.         if (tn < 0) {  
  34.             contextName = warFileName;  
  35.             warFileName = catalinaHome + "/webapps/" + warFileName;  
  36.         } else {  
  37.             contextName = warFileName.substring(tn + 1);  
  38.         }  
  39.         File warFile = new File(warFileName);  
  40.         if (!warFile.exists())  
  41.             thrownew RuntimeException("File '" + warFileName + "' does'nt exist.");  
  42.         if (warFileName.endsWith(".war")) {  
  43.             contextName = contextName.substring(0, contextName.lastIndexOf('.'));  
  44.         } else {  
  45.             if (!warFile.isDirectory()){  
  46.                 thrownew RuntimeException("File '" + warFileName + "' must be a .war file or a folder.");  
  47.             }  
  48.         }  
  49.         //建立一個內嵌的Tomcat伺服器
  50.         Embedded tomcat = new Embedded();  
  51.         //設定Tomcat的工作目錄
  52.         tomcat.setCatalinaHome(catalinaHome);  
  53.         // set the memory realm
  54.         MemoryRealm memRealm = new MemoryRealm();  
  55.         tomcat.setRealm(memRealm);  
  56.         // 建立Tomcat引擎
  57.         Engine engine = tomcat.createEngine();  
  58.         //設定預設的虛擬主機
  59.         engine.setDefaultHost("localhost");  
  60.         engine.setName("MyEngine");  
  61.         //建立虛擬主機
  62.         Host host = tomcat.createHost("localhost", catalinaHome + "/webapps");  
  63.         //把Host加入Engine
  64.         engine.addChild(host);  
  65.         /* 
  66.          * Create the ROOT context Context rootContext = 
  67.          * tomcat.createContext("", catalinaHome + "/webapps/ROOT"); 
  68.          * rootContext.setReloadable(false); 
  69.          * rootContext.addWelcomeFile("index.jsp"); host.addChild(rootContext); 
  70.          */
  71.         Context myContext = tomcat.createContext("/" + contextName, warFileName);  
  72.         myContext.setPrivileged(true);  
  73.         host.addChild(myContext);  
  74.         // Install the assembled container hierarchy
  75.         tomcat.addEngine(engine);  
  76.         Connector connector = tomcat.createConnector(listenIP, listenPort, false);  
  77.         tomcat.addConnector(connector);  
  78.         // Start the embedded server
  79.         try {  
  80.             tomcat.start();  
  81.         } catch (LifecycleException e) {  
  82.             thrownew RuntimeException(e);  
  83.         }  
  84.         EmbeddedTomcat srv = new EmbeddedTomcat(tomcat, listenIP, listenPort);  
  85.         return srv;  
  86.     }  
  87.     private Embedded tomcat;  
  88.     private String listenIP;  
  89.     privateint listenPort;  
  90.     publicvoid stop() {  
  91.         try {  
  92.             tomcat.stop();  
  93.         } catch (LifecycleException e) {  
  94.             thrownew RuntimeException(e);  
  95.         }  
  96.     }  
  97.     public String getListenIP() {  
  98.         return listenIP;  
  99.     }  
  100.     publicint getListenPort() {  
  101.         return listenPort;  
  102.     }  
  103.     publicstaticvoid main(String[] args) {  
  104.         //內嵌Tomcat的工作目錄
  105.         String tomcathome = "D://Test//TestEmbedTomcat";  
  106.         //啟動內嵌的Tomcat
  107.         final EmbeddedTomcat tomcat = EmbeddedTomcat.startup(tomcathome, "examples"8080true);  
  108.         //列印啟動資訊
  109.         System.out.println("Tomcat started at " + tomcat.getListenIP() + ":" + tomcat.getListenPort());  
  110.         //在JVM中新增一個Hook,這樣可以在虛擬機器退出時關閉tomcat以釋放相關資源
  111.         Runtime.getRuntime().addShutdownHook(new Thread() {  
  112.             publicvoid run() {  
  113.                 tomcat.stop();  
  114.             }  
  115.         });  
  116.     }  
  117. }  

從上述程式碼來看,將Tomcat內嵌到自己的應用中還是比較簡單和方便的,如果你瞭解Tomcat的目錄結構或者是工作原理,那麼上述程式碼就更加容易理解了。


相關推薦

Tomcat嵌入自己應用

轉自:http://yshjava.iteye.com/blog/1871965 Tomcat是Apache 軟體基金會(Apache Software Foundation)的Jakarta 專案中的一個核心專案,由Apache、Sun 和其他一些公司及個人共同

自己應用判斷剛剛去往動態桌布預覽頁面的桌布是否設定成功

本來從動態桌布預覽頁面設定一個動態桌布回到桌面便可以看到桌面動態桌布,可以觀察得到自己的動態桌布是否設定成功了(必須知道設定是否成功的結構,因為還有一些操作需要完成)! 但是現在是要在自己的應用中進入到動態桌布預覽頁面(去往某個動態桌布的預覽頁面,那裡可以設定桌布)點選“設

c#變數嵌入SQL語句

1、使用 ' " +    + " ' 拼接 string mysql = " SELECT Cname,Grade FROM student,score,course WHERE student.Sno = score.Sno

tomcat整合到eclipse(二)

配置tomcat(一定要先將tomcat中所有的專案清除,不然就是灰化的不能設定,先remove掉專案,然後再clean掉補伺服器) 在上邊紅色框內加入java記憶體設定命令: -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPer

Power BI官方視訊(2) Power BI嵌入應用的3種方法

  今天給大家介紹3種將Power BI嵌入到應用中的方法。 1.Publish to Web   最直接最簡單的方法,將你的報表釋出到網路上。嵌入到自己的web系統中;   但是其確定是沒有許可權控制,知道url都可以訪問,所以要注意使用場合; 2.使用REST APIs   可以更加靈活

網頁嵌入到dialog的方法

方法就是用iframe <a onclick= "showPage()" href ="請求的頁面路徑" target = "adPageFrame" id="showAdList"><strong> 彈出頁面 </strong>&

搭建SVN並SVN嵌入到MyEclipse

SVN伺服器和SVN客戶端以及SVN MyEclipse外掛下載地址為:http://download.csdn.net/detail/shiningrunner/9653973 第一步:點選Setu

iOS檔案在自己App開啟

1、首先在自己App的info.plist中註冊可用型別 <key>CFBundleDocumentTypes</key> <array> <dict>

CFormView嵌入到CDockablePane

第一步:將兩個空白的CDockablePane嵌入到MainFrm中: 1,利用類嚮導,新增兩個基類為CDockablePane的類CDock1,CDock2; 2,在MainFrm.h中新增Dock1.h和Dock2.h的標頭檔案;並派生兩個子類 protec

iOS App讓自己應用在其他應用開啟列表顯示、iOS把自己應用新增到”活動“、PDF檔案Open In MyApp

像百度網盤等應用,裡面的檔案開啟時,都可以通過以下應用再開啟檔案。下面紅色框框內的我的jpg就是我做的一個例子。因為例子沒有提供Icon,所以顯示的是預設icon。 下面就是這例子的主要步驟和程式碼。 例子是一個開啟jpg圖片程式。 1、在專案的**inf

【轉】C#自定義控制元件:WinForm其它應用程式窗體嵌入自己內部

PS:文末的附件已更新,這次我放到部落格園裡面了,不會彈出廣告,放心下載,O(∩_∩)O謝謝! 這是最近在做的一個專案中提到的需求,把一個現有的窗體應用程式介面嵌入到自己開發的窗體中來,看起來就像自己開發的一樣(實際上……跟自己開發的還是有一點點區別的,就是內嵌程式和宿

android應用圖片保存到系統相冊並顯示

context sca new 場景 adc finally sep r+ ace 我應用到的場景是程序中在視頻通訊時截圖,將截圖保存到本地相冊中 /*** @param bmp 獲取的bitmap數據 * @param picName 自定義的圖片名*/ public

ASP.NET Core應用程序部署至生產環境(CentOS7)

for linux home web 虛擬 direct director block bic 閱讀目錄 環境說明 準備你的ASP.NET Core應用程序 安裝CentOS7 安裝.NET Core SDK for CentOS7。 部署ASP.NET

人工智能應用雲開發,“碼農1號”要掀起IT界的一股浪潮

雲開發 人工智能 互聯網隨著人工智能的高速發展,隨處可見識AI技術在生活中的實踐。手機中的siri,家庭中的智能音箱,在醫療診斷上進行智能病例處理,以計算機視覺為核心的城市智能安防系統,以及最近熱議的無人駕駛。 最近有一款人工智能的新應用,在上線以後,就成為IT行業的關註焦點。“碼農1號”,將AI技術應用到雲

人工智能應用雲開發會怎樣

人工智能 雲開發隨著人工智能的高速發展,隨處可見識AI技術在生活中的實踐。手機中的siri,家庭中的智能音箱,在醫療診斷上進行智能病例處理,以計算機視覺為核心的城市智能安防系統,以及最近熱議的無人駕駛。 最近有一款人工智能的新應用,在上線以後,就成為IT行業的關註焦點。“碼農1號”,將AI技術應用到雲開發中,

Ext JS 5應用程序導入Web項目

ans pac 5.1 tro align tin tran wid cin 相關資料:http://docs.sencha.com/extjs/5.1/getting_started/welcome_to_extjs.html 原文地址: https://blog.csd

關於使用Eclipse專案部署到Tomcat後在classes沒有原始檔的問題

em..............先容我爆句粗口,我qnmlgb(我去年買了塊表),困擾了我兩天之久的問題,導致專案兩天沒有進度。。 其實主要問題還是一個eclipse配置的問題。 如下圖。將這一項的勾取消掉。 大概意思就是當發現路徑或jar包問題時不進行編譯。勾取消掉即可,但是這樣治標不治

_036_Android_資料儲存到 應用程式(私有的)

儲存 資料 出現 異常 : 是因為 , 這裡的 路徑 以及 儲存的方式 都 有問題 , 目前是執行 在androd中, android底層 是linux核心, linux 檔案系統 是根目錄是 一個 /   寫 File  file = new File(“in

訓練好的Tensorflow模型部署到web應用

  做一個簡易web使用Flask是最好的選擇,不僅上手快,使用也很便利。Django很強大也很好用,但一次就會建立一個專案的所需的檔案,我覺得對於測試一個模型在web端有沒有效果沒必要用它。   flask依賴jinja和werkzeug,所以再稍微學一點jinja的語法即可。   關於TensorFl

Tomcat儲存的檔案 對映到磁碟方法?

1.專案部署到tomcat中發現,由於以前的影象儲存及檔案上傳下載都是放在Tomcat中專案的WEB-INF下的upload以及PDF資料夾下,這樣也就導致每次重新部署需要都會將原來的影象覆蓋掉。之前的做法是 先備份這2個資料夾,部署解壓後的war包後 將備份的