<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0
    https://www.iflym.com/index.php/code/use-embeded-tomcat-to-javaee-start-tomcat.html

    昨天在網上研究了下關于將tomcat嵌入到主程序中進行運行,而不是像以前將一個web項目copy到tomcat中進行運行。之所以這樣做的原 因,即是因為項目部署到客戶方,在進行更新的時候,需要手動地進行更新,再把相應代碼copy到tomcat,然后再運行。運用embeded tomcat就可以將項目與tomcat分開,在進行更新時,先使用自定義的程序進行自動化更新,待更新完畢之后,再啟動tomcat(或其它 javaee容器)進行項目運行。

         這樣做的最終效果就是修改了項目的運行方式。原先的運行方式是以tomcat為中心,由tomcat來啟動和終止項目,現在是由我們的啟動程序 為中心,由啟動程序來負責啟動和終止項目。就相當于現在流行的cs程序一樣,有單獨的啟動腳本,在啟動時進行環境預初始化,更新程序以及其它操作,待完成 之后再進行最終的項目啟動。

         這篇主要講解如何使用embeded tomcat在代碼中進行啟動和終止。網上的一般文章均為tomca5.x來做,這里使用了最新的tomcat7,因為tomcat7為embeded開 發,單獨發布了org.apache.tomcat.embed包,以進行獨立的embed開發。以下是相應的maven包

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
                <version>7.0.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-util</artifactId>
                <version>7.0.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
                <version>7.0.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-logging-juli</artifactId>
                <version>7.0.2</version>
            </dependency>

        使用了embed包中的core包,以及用于編譯jsp的jasper包,然后是工具類以及進行上場記錄的logging-juli包。開始寫代碼:

    1
    2
    3
    4
    5
    6
    7
    //設置工作目錄
            String catalina_home = "d:/";
            Tomcat tomcat = new Tomcat();
            tomcat.setHostname("localhost");
            tomcat.setPort(startPort);
            //設置工作目錄,其實沒什么用,tomcat需要使用這個目錄進行寫一些東西
            tomcat.setBaseDir(catalina_home);

        上面使用了Tomcat類來進行啟動類,在tomcat7以前均是使用一個叫Embed類來進行啟動,在tomcat7之后,embed類被不建 議使用,而建議使用新的Tomcat類來進行啟動了。然后設置主機名,端口,再設置一個工作目錄。這個工作目錄可以是任意目錄,主要是tomcat需要這 個目錄來記錄一些東西,比如記錄word信息,日志信息(如果配置了日志的話),以及臨時文件存儲等。

    1
    2
    3
    4
    5
    6
    7
    8
    //設置程序的目錄信息
            tomcat.getHost().setAppBase("e:/");
            // Add AprLifecycleListener
            StandardServer server = (StandardServer) tomcat.getServer();
            AprLifecycleListener listener = new AprLifecycleListener();
            server.addLifecycleListener(listener);
            //注冊關閉端口以進行關閉
            tomcat.getServer().setPort(shutdownPort);

        上面的代碼,首先設置我們的項目程序所在的appbase,即放項目代碼的地方。在通常的tomcat配置中,這個目錄一般是webapps。接 著設置一個listener,這個listener主要是負責啟動一些比如html native支持程序以及ipv6等信息配置(可以忽略)。接著是配置一個關閉的注冊端口,當向這個端口發送信息時,就可以達到關閉tomcat的目的 (后面會講)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //加載上下文
            StandardContext standardContext = new StandardContext();
            standardContext.setPath("/aa");//contextPath
            standardContext.setDocBase("aa");//文件目錄位置
            standardContext.addLifecycleListener(new Tomcat.DefaultWebXmlListener());
            //保證已經配置好了。
            standardContext.addLifecycleListener(new Tomcat.FixContextListener());
            standardContext.setSessionCookieName("t-session");
            tomcat.getHost().addChild(standardContext);

        我們單獨使用了一個Context來為這個host添加上下文,tomcat本身提供一個方法tomcat.addWeb方法來添加項目包,不過 由于這里需要單獨設置一個tomcat的sessionName,所以使用與與tomcat.addWeb實現類似的方法來添加一個項目包。
        以上代碼中有兩個需要注意的listener,一個是DefaultWebXmlListener,這個是由tomcat加載一些默認的配置信 息,比如jspServlet,以及一些繁復的mime/type信息;加上這個,就不需要我們自己去寫這么多的配置,因為每個項目都需要這些。這個配置 與tomcat目錄下的conf/web.xml中的配置一樣,只不過這里是代碼化了。第二個是FixContextListener,這個主要是在項目 部署完后,將這個上下文設置為configured,表示已經配置好了(不然,tomcat啟動時會報錯,即相應上下文還未配置好)。
        配置OK了之后,就是啟動tomcat了:

    1
    2
    tomcat.start();
            tomcat.getServer().await();

        啟動tomcat,并讓tomcat在關閉端口上監聽。如果沒有最后一句,程序將直接結束,保證監聽之后,tomcat將一直監聽關閉事件,待有關閉事件之后才結束當前程序。所以如果想要關閉當前的tomcat,只需要向關閉端口發送一些信息即可:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    private static void shutdown() throws Exception {
            Socket socket = new Socket("localhost", shutdownPort);
            OutputStream stream = socket.getOutputStream();
            for(int i = 0;i < shutdown.length();i++)
                stream.write(shutdown.charAt(i));
            stream.flush();
            stream.close();
            socket.close();
        }

        這樣即可達到關閉tomcat的目的。

         實際上看整個項目代碼,項目代碼的運行,就是一個配置一個基礎的server.xml(即tomcat目錄下的 conf/server.xml),先配置運行端口,關閉監聽端口;然后配置運行的host以及添加一個上下文context,最后就開始運行并開始監 聽。對照這個程序,再看一下server.xml中的配置信息,就很容易明白以上這段代碼了。

    posted on 2016-07-18 14:42 SIMONE 閱讀(4536) 評論(0)  編輯  收藏 所屬分類: JAVAtomcat
    主站蜘蛛池模板: 亚洲尹人九九大色香蕉网站| 亚洲国产成人五月综合网| 亚洲国产高清视频| a毛片全部播放免费视频完整18| 亚洲无码高清在线观看| a在线视频免费观看在线视频三区| 亚洲国产一成久久精品国产成人综合| AV激情亚洲男人的天堂国语| 国产一区二区三区免费看| 综合偷自拍亚洲乱中文字幕| 四虎永久在线精品免费影视| 一级毛片免费毛片毛片| 亚洲无线观看国产精品| 久草视频在线免费看| 亚洲最大视频网站| 啦啦啦www免费视频| 极品美女一级毛片免费| 红杏亚洲影院一区二区三区| 嫩草在线视频www免费观看 | 亚洲成AV人片久久| 99久久综合国产精品免费| 久久久久亚洲精品无码网址色欲 | 亚洲真人日本在线| 无码中文字幕av免费放dvd| 亚洲国产人成在线观看| 国产成人aaa在线视频免费观看| 一级毛片大全免费播放| 亚洲电影一区二区三区| 拍拍拍又黄又爽无挡视频免费| 国产成人人综合亚洲欧美丁香花| 亚洲一级Av无码毛片久久精品 | 色在线亚洲视频www| 国产最新凸凹视频免费| 99久久99这里只有免费的精品| 亚洲成人网在线播放| 国产在线19禁免费观看| 久操视频免费观看| 亚洲国产成人综合精品| 日本亚洲视频在线| 日本无卡码免费一区二区三区| 日批视频网址免费观看|