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,即看到資料庫的通路結果。