天天看點

Jetty 的配置

Jetty 的配置  

2013-08-28 08:15:40|  分類: java |舉報 |字号 訂閱

Jetty 的基本配置

Jetty 的基本配置與 Tomcat類似,在這裡主要介紹 Jetty 的端口設定及如何部署 Web應用。由于 Jetty 是個嵌入式 Web 伺服器,是以設定方式比較特殊。

Jetty 的配置檔案放在 etc 路徑下,該路徑下有如下幾個配置檔案:

jetty.xml檔案。

jetty-jmx.xml檔案。

jetty-plus.xml檔案。

webdefault.xml檔案。

其中 webdefault.xm1檔案是 Web 應用的預設配置檔案,與 Jetty 的配置沒有太大的關系,該檔案通常不需要修改。

另外的三個都是 Tomcat 的配置檔案:jetty.xml檔案是預設的配置檔案;jetty-jmx.xml是啟動 JMX 控制的配置檔案; jetty-plus.xm1檔案是在增加 Jetty 擴充功能的配置檔案。在啟動 Jetty 時輸入如下指令:

java -jar startup.jar預設使用jetty.xm1檔案時啟動Jetty,即與如下指令效果相同:

java -jar startup.jar etc/jetty.xml啟動時也可以指定多個配置檔案,可輸入如下指令:

java -jar startup.jaretc/jetty.xml etc/jetty-plus.xml

打開 Jetty 配置檔案,該配置檔案的根元素是Configure,另外還會看到有如下的配

置元素。

Set: 相當于調用 setxx 方法。

Get: 相當于調用 getXxx 方法。

New: 建立某個類的執行個體。

Arg: 為方法或構造器傳入參數。

Array: 設定一個數組。

Item: 設定數組或集合的-J頁。

Call: 調用某個方法。

Jetty 是個嵌入式 Web 容器,是以它的服務對應一個 Server 執行個體,可以看到配置檔案中有如下片段:

<!--配置了一個Jetty伺服器程序-->

<Configure id="Server" class="org.mortbay.jetty.Server">

1. 配置 Jetty服務端口

Configure元素裡的各種子元素,即對該Server執行個體的操作。在Configure元素下有如下代碼所示的 Set 子元素, Set 子元素的 name 屬性為 connectors,效果等同于調用setConnectors方法,用于設定Web 服務的提供端口。該方法需要Connector數組,其包含的 Array 子元素則用于設定該方法的參數。Array元素裡的Item子元素,則是數組的資料項,每個Connector對應一個連接配接提供者。

<!--類似于調用setConnectors方法-->

<Setname="co口口ectorsll>

<!--為 setConnectors方法傳入參數><Array type="org.mortbay.jetty.Connector">

<!--下面的 Connector提供常見的Web服務-->

<Item>

<Newclass="org.mortbay.jetty.nio.SelectChannelConnector">

<Set name="port">8080</Set>

<Set name="maxidleTime">30000</Set>

<Set name="lowResourceMaxIdleTime">3000</Set><Set name="Acceptors">l</Set>

</New><lItem><!--如果Java 的nio不可用,則使用如下的Connector--><!--

<Item><Newclass="org.mortbay.jetty.bio.SocketConnector">

<Set name="port">8081</Set>

<Set name="maxIdleTime">50000</Set></New>

<Itern>

-->

<!-- Use this connector for few very active connections ONLY IF

Select Channel Connector cannot handle your load

<Itern>

<New class="org.mortbay.jetty.nio.BlockingChannelConnector">

<Set name="port">8083</Set><Set name="maxIdleTime">30000</Set>

<Set name="lowResourceMaxIdleTime">3000</Set></New><lItem>

-->

<!--下面的 Connector用于設定HTTPS 的服務提供端口--><!--

<Itern>

<New class="org.rnortbay.jetty.security.SslSocketConnector">

<Set narne="Port">8443</Set>

<Set narne="rnaxIdleTirne">30000</Set>

<Set narne="Keystore"><Systern Property narne="jetty.horne" default="."

1>/etc/keystore</Set>

<Set narne="Password">OBF:lvnylzlolx8elvnwlvn61x8g1zlulvn4<1Set>

<Set narne="KeyPassword">OBF:lu2ulwmllz7s1z7alwnllu2g</Set>

</New>

<Item>

-->

</Array>

</Set>

在上面的配置片段中,預設第一個Connector是有效的,該Connector就是正常Web服務的Connector,其中的8080就是Jetty 的預設端口。

筆者将該片段修改如下:

<!--下面的 Connector提供常見的Web服務-->

<Itern>

<!--提供基于nio 的 Connector-->

<New class="org.rnortbay.jetty.nio.SelectChannelConnector">

<!--設定端口号-->

<Set narne="port">8886</Set><Setnarne="maxIdleTirne">30000</Set>

<Setnarne="lowResourceMaxIdleTirne">3000</Set>

<Set narne="Acceptors">l</Set>

</New><lItem>

修改成上面所示的樣例後,Jetty 的服務端口為88860 這也是筆者所使用的端口。

2. 部署 Web應用

Jetty也支援自動部署和配置檔案部署。

如果使用預設的配置檔案啟動,webapps 會自動部署目錄。即所有存放在webapps路徑的Web應用将自動部署在Jetty容器中。

如果使用帶Jetty擴充功能來啟動,~P增加jetty-plus.xrnl檔案來啟動,則webapps-plus也會自動部署目錄,将所有放在該路徑的Web應用自動部署在Jetty容器中。下面看如何使用配置檔案來部署Web應用。

部署 Web 應用需使用 org.mortbay.jetty.webapp.WebAppContext,該類的執行個體即對應一個 Web 應用,并且該類還包含多個靜态的重載方法:addWebApplications。該方法用于同時部署多個Web應用,即用于配置一個自動部署目錄。

jetty.xrnl配置檔案的片段如下:

<!--調用 WebAppContext 的靜态方法addWebApplications-->

<Call class="org.rnortbay.jetty.webapp.WebAppContext"

name="addWebApplications">

<!--下面用于為方法傳入參數-->

<Arg><Ref id="contexts"I></Arg>

<!-- 指定自動部署目錄-->

<Arg>./webapps</Arg>

<!--配置Web應用的預設配置檔案-->

<Arg><SystemProperty name="jetty.home"default="."/>

/etc/webdefault.xml</Arg>

<!--是否解壓縮>

<Arg type="boolean">True</Arg>

<Arg type="boolean">False</Arg>

</Call>

jetty-plus.xml檔案的片段如下:

<!--調用WebAppContext 的靜态方法addWebApplications-->

<Call class="org.mortbay.jetty.webapp.WebAppContext"

name="addWebApplications">

<!--下面用于為方法傳入參數->

<Arg><Ref id="Server"/></Arg>

<!-- 指定自動部署目錄-->

<Arg>./webapps-plus</Arg>

<!-- 配置Web應用的預設配置檔案一〉

<Arg>org/mortbay/jetty/webapp/webdefault.xml</Arg>

<Arg><Ref id="plusConfig"/></Arg>

<!--是否解壓縮>

<Arg type="boolean">True</Arg><Arg type="boolean">False</Arg>

</Call>

通過檢視該配置檔案不難發現,在每次調用addWebApplications方法後,即可增加一個Web應用的自動部署路徑。如有必要,使用者完全可以增加自己的自動部署路徑,如果增加了自動部署路徑,則所有在該路徑下的Web應用将自動部署。

如果僅需要部署一個Web應用,可以有如下兩種方法:

·修改jetty.xml檔案。

·增加自己的配置檔案。

根據前面的介紹,對于Web伺服器,應盡量避免修改預設的配置檔案。如果讀者真需要通過修改jetty.xml檔案來部署Web應用,則應在jetty 的 Configure元素下增加如下片段:

<!-- 建立一個Web應用-->

<New class="org.mortbay.jetty.webapp.WebAppContext"><!--三個構造參數-->

<Arg><Ref id="contexts"/></Arg><!--設定Web應用的文檔路徑-->

<Arg>G:/StrutsTest/js</Arg><!…設定 Web應用的 url-->

<Arg>/</Arg>

<!--設定Web應用的預設配置描述符-->

<Set name="defaultsDescriptor">

<SystemProperty name="jetty.home" default=" ."/>/etc/webdefault.xml</Set>

<!--相當于調用 setVirtualHosts方法,用于設定虛拟主機-->

<Set name="virtualHosts"><!--Array表示建立一個數組-->

<Array type="java.lang.String">

<Item>localhost</Item>

</Array>

</Set>

<!--類似于調用getSessionHandler方法-->

<Get name="SessionHandler">

<Set name="SessionManager">

<New class="org.mortbay.jetty.servlet.HashSessionManager">

<!--設定Sess工on 的逾時時長-->

<Setname="maxInactiveInterval" type="int">600</Set>

</New>

</Set></Get></New>

注意:該代碼片段在jetty.xml檔案僅僅被注釋,隻要取消該代碼片段注釋即可。但需要注意: jetty.xml檔案預設有個小錯誤,它的設直逾時時長的Set元素的 name屬性值為 maxInactivelntervale。實際上HashSessionManager并沒有setMaxInactiveIntervale方法,通過檢視API 文檔發現,它包含一個setMaxInactiveInterval方法(最後少一個e),讀者将原有的e 删除即可。

通常建議增加自己的配置檔案,應盡量避免修改系統原有的配置檔案。增加的配置檔案如下:

<?xml version="1.0"encod工ng="gb2312"?>

<lDOCTYPE ConfigurePUBL工C"-//Mort Bay Consulting//DTD Configure//EN"

''http://jetty.mortbay.org/configure.dtd''>

<Configure id="Server" class="org.mortbay.jetty.Server"><!--建立一個Web應用-->

<New class="org.mortbay.jetty.webapp.WebAppContext">

<!--三個構造參數-->

<Arg><Ref id="contexts"/></Arg><!--設定Web應用的文檔路徑-->

<Arg>G:/StrutsTest/js</Arg><!--設定 Web應用的url-->

<Arg>/</Arg>

<!--設定Web應用的預設配置描述符-->

<Set name="defaultsDescriptor">

<SystemProperty口ame="jetty.home" default=" ."/>/etc/webdefault.xml</Set>

<!--相當于調用 setVirtualHosts方法,用于設定虛拟主機-->

<Set name="virtualHosts">

<!-- Array表示建立一個數組-->

<Arraytype="java.lang.String">

<Item>localhost</Item>

</Array></Set><!--類似于調用getSessionHandler方法-->

<Get name="SessionHandler"><Set name="SessionManager">

<New class="org.mortbay.jetty.servlet.HashSessionManager">

<!--設定Session的逾時時長-->

<Set 口ame="maxInactiveInterval"type="int">600</Set>

</New>

</Set></Get>

</New></Configure>将該配置檔案儲存在etc 路徑下,以後每次啟動Jetty 時,可直接加載該配置檔案,使用如下啟動指令即可(假設該配置檔案的檔案名為jetty-yeeku.xml):

java -jar startup.jar etc/jetty.xml etc/jetty-yeeku.xml

3. 配置 JNDI 綁定

Jetty 同樣可以整合 DBCP、 C3PO 等資料源來提供容器管理的資料源。提供容器管理的資料源,隻是 Jetty JNDI 綁定功能之一。

下面介紹如何在 Jetty 綁定 JNDI,以及 JNDI 的使用。

增加 JNDI 綁定必須使用 Jetty 的 plus 功能。是以,啟動時必須增加 jetty-plus.xml

檔案。增加 JNDI 的綁定同樣有兩個方法:

·修改系統預設的jetty.xml 檔案。

·增加自己的配置檔案。

兩種配置方式大同小異,差別是前者需要修改系統預設的配置檔案,此處僅介紹增加自己的配置檔案方式。

在 Jetty 的 plus 中,有如下包。

org.mortbay.jetty.plus.naming:執行JNDI綁定的包。

該包下有如下四個類。

EnvEntry: 綁定簡單值。

NamingEntry: 抽象類,是另外三個類的父類。

Resource: 用于綁定資料源等資源。

Transaction: 用于綁定事務。

增加資料源綁定請按如下步驟進行。

(1)此處綁定的資料源依然以 DBCP 為實作,當然也可以綁定 C3PO 資料源,但必須将 DBCP 所需要的 jar檔案複制到 Jetty 可以使用的路徑中。根據前面介紹 DBCP 主要需要如下三個檔案:

commons-dbcp.jar

commons-pool.jar

commons-collections.jar

将這三個檔案複制到 Jetty 的 lib 路徑下即可, Jetty 啟動時會自動加載該路徑的jar檔案。當然,還需将資料庫驅動複制到該路徑下。

(2) 增加如下配置檔案:

<?xml version="l.0"?>

<!一 Jetty配置檔案的檔案頭,包含DTD等資訊>

<lDOCTYPE Configure PUBLIC "-//Mort Bay Consu1ting//DTD

Configure//EN"''http://jetty.mortbay.org/configure.dtd''>

<'一Jetty配置檔案的根元素一〉

<Configure id="Server" c1ass="org.mortbay.jetty.Server">

<!-配置第一個環境變量,隻是一個普通值>

<New id="woggle"c1ass="org.mortbay.jetty.plus.naming.

EnvEntry"><Arg>wogg1e</Arg>

<Argtype="java.lang.integer">4000</Arg>

</New>

<!--配置第二個環境變量,隻是一個普通值一〉

<New id="wiggle"c1ass="org.mortbay.jetty.plus.naming.EnvEntry">

<Arg>wiggle</Arg><Arg type="java.lang.Double">100</Arg>

<Arg type="boolean">true</Arg>

</New><!…建立一個資料源一〉

<New 工d="ds" class="org.apache.commons.dbcp.BasicDataSource">

<!設定資料庫驅動>

<Set name="driverClassName">com.mysql.jdbc.Driver</Set>

<!一設定資料庫url-->

<Set name="url">jdbc:mysql://localhost:3306/j2ee</Set>

<!--設定資料庫使用者名-->

<Set name="username">root</Set>

<!--設定資料庫密碼一-->

<Set name="password">32147</Set>

<!--設定資料庫驅動二-->

<Set name="maxActive" type="int">100</Set>

<!--設定資料源最大空閑連接配接數>

<Set name="maxldle"type="int">30</Set>

<!--設定資料源最大的等待數-->

<Set name="maxWait"type="int">1000</Set>

<!--設定資料庫是否自動送出-->

<Set name="defaultAutoCommit"type="boolean">true</Set>

<!--設定連接配接是否自動删除-->

<Set name="removeAbandoned" type="boolean">true</Set>

<!--設定資料庫驅動-->

<Set name="removeAbandonedTimeout"type="int">60</Set:>

<Set name="logAbandoned" type="boolean">true</Set>

</New>

<!--将實際的資料源綁定到jdbc/mydatasource這個 JNDI 名-->

<New id="mydatasource"class="org.mortbay.jetty.plus.naming.Resource">

<Arg>jdbc/mydatasource</Arg>

<Arg><Ref id="ds"/></Arg></New></Configure>

在上面的配置檔案中,綁定了三個JNDI值,下面測試該JNDI 的 Servlet:

public class TestServlet extends HttpServlet

InitialContextic;

//Servlet的初始化方法,該方法完成Context的初始化

public void init(ServletConfig config) throws ServletException

super.init(config);

try

ic = new InitialContext();

catch (Exception e)

{

throw new ServletException(e);

//service 方法是 Servlet 的服務方法

public void service(HttpServletRequest request, HttpServletResponseresponse)

throwsServletException,工OException

//擷取 JSP 頁面輸出流

PrintStream out = newPr工ntStream(response.getOutputStream());

try

//在控制台輸出 w工ggle 的綁定值

System.out.println (ic.lookup("wiggle"));

/I:在控制台輸出 woggle 的綁定值

System.out.println (ic.lookup("woggle") );

//擷取綁定的資料源

DataSource ds = (DataSource)ic.lookup("jdbc/mydatasource");

//通過資料源擷取資料庫連接配接

Connectionconn = ds.getConnection();

//通過資料庫連接配接建立Statement對象

Statement stmt=conn.createStatement();

//通過 Statement對象執行SQL查詢,傳回ResultSet對象

ResultSet rs = stmt.executeQuery("select* from news");

//周遊記錄集

while(rs.next())

out.pr工ntl口 (rs.getString(2));

}

catch (Exception e)

e.printStackTrace() ;

在 web.xml 檔案中增加如下片段:

<servlet>

<!一定義Servlet-->

<servlet-name>aa</servlet-name><servlet-class>lee.TestServlet</servlet-class>

</servlet><servlet-mapping>

<! --定義 Servlet的 url 映射-->

<servlet-name>aa</servlet-name><url-pattern>/aa</url-pattern></servlet-mapping>

啟動 Jetty,通路該Servlet,即看到資料庫的通路結果。