選擇JSP實(shí)現(xiàn)
從Jetty-9.2開始,使用Apache Jasper作為默認(rèn)JSP容器實(shí)現(xiàn)。在前面的版本號(hào)中使用的是Glassfish Jasper,在后面的版本號(hào)中也能夠繼續(xù)使用它。
Jetty公布默認(rèn)激活jsp模塊,默認(rèn),模塊設(shè)置到Apache Jasper。為了改為使用Glassfish Jasper,編輯$JETTY_HOME/start.d/jsp.mod,改變以下的行:
#
# Jetty JSP Module
#
[depend]
servlet
jsp-impl/${jsp-impl}-jsp
[ini-template]
# JSP Configuration
# Select JSP implementation, choices are
# glassfish : The reference implementation
# default in jetty <= 9.1
# apache : The apache version
# default jetty >= 9.2
jsp-impl=apache
# To use a non-jdk compiler for JSP compilation when using glassfish uncomment next line
# -Dorg.apache.jasper.compiler.disablejsr199=true
注意一些JSP的特征是否能使用依賴于你選擇的JSP容器實(shí)現(xiàn)。也注意你不能預(yù)編譯一種容器的jsp,而部署還有一個(gè)。
預(yù)編譯
你能依照你選擇的JSP容器(Glassfish或者Apache)提供的指導(dǎo)手冊(cè)預(yù)編譯jsp。或者假設(shè)你選擇使用maven,你能用jetty-jspc-maven插件為你做。
假設(shè)你預(yù)編譯你的jsp,而且自己定義了輸出包前綴(默認(rèn)是org.apache.jsp),你應(yīng)該配置你的webapp上下文告訴Jetty關(guān)于你的自己定義報(bào)名。你能使用servlet上下文的初始化參數(shù)org.eclipse.jetty.servlet.jspPackagePrefix做這。
比如,假定你預(yù)編譯你的jsp,使用自己定義包前綴com.acme,那么你將在web.xml中添加:
<context-param>
<param-name>org.eclipse.jetty.servlet.jspPackagePrefix</param-name>
<param-value>com.acme</param-value>
</context-param>
注意:Jetty的maven插件jetty-jspc-maven-plugin和jetty-maven-plugin都僅僅能用Apache Jasper
執(zhí)行時(shí)編譯JSP
依據(jù)你選擇的不同的JSP容器,配置項(xiàng)和編譯特性將是不同的。
Apache JSP容器
默認(rèn),Apache JSP容器將查找Eclipse Java Compiler(jdt)。jetty公布自帶了一個(gè)在$JETTY_HOME/lib/apache-jsp。假設(shè)你希望用不同的編譯器,你將須要配置compilerClassName初始參數(shù)在JspServlet,并帶上類名。
下表是Apache JspServlet的參數(shù)介紹:
| 初始參數(shù) | 描寫敘述 | 默認(rèn)值 | webdefault.xml |
|---|---|---|---|
| classpath | 用于jsp編譯的Classpath。僅僅有在jetty中的org.apache.catalina.jsp_classpath上下文屬性不被設(shè)置時(shí)才使用。 | - | - |
| classdebuginfo | 在class文件里包含debugging信息 | TRUE | - |
| checkInterval | 后臺(tái)重編譯檢查的間隔,單位秒。僅僅有development=false才使用。 | 0 | - |
| development | development=true時(shí),每一個(gè)請(qǐng)求都做重編譯檢查。看modificationTestInterval | TRUE | - |
| displaySourceFragment | 是否將源代碼片段包括在異常信息中 | TRUE | - |
| errorOnUseBeanInvalidClassAttribute | 當(dāng)在一個(gè)useBean行為中class屬性的值不是一個(gè)有效的bean類時(shí),是否產(chǎn)生一個(gè)error | TRUE | - |
| fork | Ant應(yīng)該fork它的JSP頁(yè)的Java編譯嗎? | TRUE | FALSE |
| keepgenerated | 你想保留生成的Java文件嗎? | TRUE | - |
| trimSpaces | 指令和行為間的空格應(yīng)該被裁剪嗎? | FALSE | - |
| enablePooling | 確定標(biāo)簽處理器池是否被激活 | TRUE | - |
| engineOptionsClass | 同意指定的Options類用于配置Jasper。否則,默認(rèn)的EmbeddedServletOptions將被使用 | - | - |
| mappedFile | 支持mapped Files。產(chǎn)生一個(gè)servlet,有一個(gè)打印申明JSP文件的每一行 | TRUE | - |
| suppressSmap | 為JSR45調(diào)試的SMAP信息的產(chǎn)生 | FALSE | - |
| dumpSmap | 轉(zhuǎn)儲(chǔ)SMAP JSR45信息到一個(gè)文件 | FALSE | - |
| genStrAsCharArray | 為產(chǎn)生Strings的選項(xiàng) | FALSE | - |
| ieClassId | 當(dāng)使用<jsp:plugin>標(biāo)簽時(shí),class-id值被送到Internet Explorer? | clsid:8AD9C840-044E-11D1-B3E9-00805F499D93 | - |
| maxLoadedJsps | 一個(gè)web應(yīng)用能載入的JSP的最大值。假設(shè)超過(guò)了這個(gè)值,近期最少使用那個(gè)的JSP將被卸載。0或者負(fù)值表示沒(méi)有限制。 | -1 | - |
| jspIdleTimeout | 一個(gè)JSP被卸載前空暇的最大時(shí)間,單位秒。0或者負(fù)值表示永不卸載。 | -1 | - |
| scratchDir | servlet被生成的目錄 | - | - |
| compilerClassName | 假設(shè)不設(shè)置,默認(rèn)是Eclipse jdt編譯器。 | - | - |
| compiler | 假設(shè)Eclipse jdt編譯器在classpath中不能找到時(shí)使用。它是Ant應(yīng)該調(diào)用的編譯器的類名。 | - | - |
| compilerTargetVM | 編譯器期望的目標(biāo)vm。 | 1.7 | - |
| compilerSourceVM | 為jdt編譯器設(shè)置源兼容性級(jí)別。 | 1.7 | - |
| javaEncoding | 編譯使用編碼方式。 | UTF8 | ? |
| modificationTestInterval | 假設(shè)development=true,重編譯檢查的間隔,通過(guò)一個(gè)請(qǐng)求觸發(fā)。 | 4 | - |
| xpoweredBy | 產(chǎn)生一個(gè)X-Powered-By響應(yīng)頭。 | FALSE | FALSE |
| recompileOnFail | 假設(shè)一個(gè)JSP編譯失敗,modificationTestInterval應(yīng)該被忽略而且觸發(fā)下一個(gè)重編譯嘗試嗎??jī)H僅用在開發(fā)模式,默認(rèn)被停止,由于編譯可能代價(jià)較高導(dǎo)致過(guò)多的資源被用。 | - | - |
?
Glassfish JSP容器
為了編譯.jsp文件進(jìn)入Java classes,你須要一個(gè)Java編譯器。假設(shè)你正在使用一個(gè)完整的JDK,你能從JVM得到Java編譯器,否則,你能夠從一個(gè)第三方Jar。
默認(rèn)Glassfish JSP容器嘗試用JDK的編譯器。注意:當(dāng)用JDK編譯器時(shí),系統(tǒng)不保存你的class文件到磁盤,除非你用saveBytecode初始化參數(shù),將在以下描寫敘述。
假設(shè)你不有完整的JDK,你能配置Eclipse Java Compiler,在Jetty的$JETTY_HOME/lib/jsp/目錄下。你須要定義一個(gè)系統(tǒng)屬性,防止Glassfish JSP引擎默認(rèn)使用JVM中的編譯器。
當(dāng)使用獨(dú)立的標(biāo)準(zhǔn)版時(shí),最好的方式是使用未凝視的系統(tǒng)屬性org.apache.jasper.compiler.disablejsr199,在jsp module中:
-Dorg.apache.jasper.compiler.disablejsr199=true
或者為了嵌入的使用,只定義這作為一個(gè)通常的系統(tǒng)屬性。
配置
JSP引擎有一些配置參數(shù)。一些參數(shù)僅影響預(yù)編譯,而一些影響執(zhí)行時(shí)預(yù)編譯檢查。在不同版本號(hào)的JSP引擎間參數(shù)也有不同。以下列出了配置參數(shù)、他們的含義和他們的默認(rèn)設(shè)置。全部參數(shù)都在webdefault.xml的org.apache.jasper.JspServlet實(shí)例中定義:
| 初始參數(shù) | 描寫敘述 | 默認(rèn)值 | webdefault.xml |
|---|---|---|---|
| development | development=true,重編譯檢查在每一個(gè)請(qǐng)求時(shí)都運(yùn)行。看modificationTestInterval。 | TRUE | - |
| fork | Ant應(yīng)該fork它的JSP頁(yè)的Java編譯? | TRUE | FALSE |
| keepgenerated | 你想保留產(chǎn)生的Java文件? | FALSE | - |
| saveBytecode | 假設(shè)class文件作為byte arrays被產(chǎn)生,他們?cè)诰幾g結(jié)束時(shí)應(yīng)該被保存到磁盤嗎? | FALSE | - |
| trimSpaces | 在指令和行為之間的空白應(yīng)該被裁剪嗎? | FALSE | - |
| enablePooling | 確定標(biāo)簽處理器池是否被激活。 | TRUE | - |
| mappedFile | 支持mapped Files。產(chǎn)生一個(gè)servlet,有一個(gè)打印申明JSP文件的每一行 | TRUE | - |
| sendErrorToClient | 假設(shè)false,棧軌跡,等,被送到標(biāo)準(zhǔn)錯(cuò)誤取代client的瀏覽器。 | FALSE | - |
| classdebuginfo | 在class文件里包含debugging信息。 | TRUE | - |
| checkInterval | 后臺(tái)重編譯檢查的間隔,單位秒。僅僅有development=false才使用。 | 0 | - |
| suppressSmap | 為JSR45調(diào)試的SMAP信息的產(chǎn)生 | FALSE | - |
| dumpSmap | 轉(zhuǎn)儲(chǔ)SMAP JSR45信息到一個(gè)文件 | FALSE | - |
| genStrAsCharArray | 為產(chǎn)生Strings的選項(xiàng) | FALSE | - |
| genStrAsByteArray | 為產(chǎn)生Strings的選項(xiàng) | TRUE | - |
| defaultBufferNone | - | FALSE | - |
| errorOnUseBeanInvalidClassAttribute | - | FALSE | - |
| scratchDir | servlet被生成的目錄。Jetty設(shè)置這個(gè)值依據(jù)為webapp設(shè)置的[/display/JETTY/Temporary+Directories work dir] | - | - |
| compiler | 在執(zhí)行時(shí)確定。對(duì)Jetty來(lái)說(shuō)是Eclipse jdt compiler。 | - | - |
| compilerTargetVM | 編譯器期望的目標(biāo)vm。 | 1.5 | - |
| compilerSourceVM | 為jdt編譯器設(shè)置源兼容性級(jí)別。 | 1.5 | - |
| javaEncoding | 編譯使用編碼方式。 | UTF8 | - |
| modificationTestInterval | 假設(shè)development=true,重編譯檢查的間隔,通過(guò)一個(gè)請(qǐng)求觸發(fā)。 | 0 | - |
| xpoweredBy | 產(chǎn)生一個(gè)X-Powered-By響應(yīng)頭。 | FALSE | FALSE |
| usePrecompiled/use-precompiled | - | FALSE | - |
| validating/enableTldValidation | 是否依據(jù)模式(schema)驗(yàn)證標(biāo)簽文件。 | FALSE | - |
| reload-interval | 假設(shè)reload-interval=0,則不做JSP的執(zhí)行時(shí)檢查,否則設(shè)置檢查間隔,無(wú)論development=true還是development=false。 | - | - |
| initial-capacity/initialCapacity | 映射JSP到class和JSP文件的哈希映射表的初始容量 | - | - |
?
?
?
?
通常存在非常多困惑在關(guān)于development、checkInterval和modificationTestInterval參數(shù),和JSP執(zhí)行時(shí)重編譯。這里是分解出的各種選項(xiàng):
1)對(duì)每一個(gè)請(qǐng)求檢查JSP文件重編譯
<init-param>
<param-name>development></param-name>
<param-value>true></param-value>
</init-param>
2)大約每N秒檢查一次,通過(guò)請(qǐng)求觸發(fā)定時(shí)的計(jì)算。以下是每60秒檢查:
<init-param>
<param-name>development></param-name>
<param-value>true></param-value>
</init-param>
<init-param>
<param-name>modificationTestInterval></param-name>
<param-value>60></param-value>
</init-param>
3)不做檢查,但在第一次使用時(shí)編譯JSP。(注意“reload-interval”參數(shù)相當(dāng)于“development=false”和“checkInterval=0”組合的簡(jiǎn)寫):
<init-param>
<param-name>reload-interval></param->
<param-value>-1></param-value>
</init-param>
4)不做不論什么請(qǐng)求時(shí)檢查,但啟動(dòng)一個(gè)后臺(tái)線程運(yùn)行每N秒檢查一次。以下的樣例每60秒檢查一次:
<init-param>
<param-name>development></param-name>
<param-value>false></param-value>
</init-param>
<init-param>
<param-name>checkInterval></param-name>
<param-value>60></param-value>
</init-param>
改動(dòng)配置
不考慮你正在使用哪一個(gè)JSP容器,有幾個(gè)選項(xiàng)用于改動(dòng)JspServlet配置。
重載webdefault.xml
你能拷貝Jetty自帶的$JETTY_HOME/etc/webdefault.xml,改動(dòng),然后用它取代自帶的版本號(hào)。以下展示怎樣使用Jetty Maven插件達(dá)到這個(gè)目地:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<configuration>
<webApp>
<defaultsDescriptor>src/main/resources/webdefault.xml</defaultsDescriptor>
</webApp>
</plugin>
假設(shè)你正在使用Jetty發(fā)行版,你想改變JSP設(shè)置為一個(gè)或者多個(gè)你的webapp,拷貝$JETTY_HOME/etc/webdefault.xml文件到某個(gè)地方,改動(dòng),然后用context xml文件設(shè)置這個(gè)文件為你的webapp的defaultsDescriptor。以下是一個(gè)樣例:
<Configure class=>"org.eclipse.jetty.webapp.WebAppContext">
<Set name=>"contextPath">/foo</Set>
<Set name=>"war"><SystemProperty name=>"jetty.home" >default=>"."/>/webapps/foobar.war</Set>
<Set name=>"defaultsDescriptor">/home/smith/dev/webdefault.xml</Set>
</Configure>
假設(shè)你想改變JSP設(shè)置為全部webapp,直接編輯$JETTY_HOME/etc/webdefaults.xml就可以。
在web.xml中配置JSP Servlet
還有一個(gè)選擇是在你的webapp的WEB-INF/web.xml中為JSPServlet添加一個(gè)條目,改變或者添加初始化參數(shù)。你也能夠添加(但不移除)servlet-mappings。你能用在$JETTY_HOME/etc/webdefault.xml中的條目作為一個(gè)起始點(diǎn)。
<servlet id=>"jsp">
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
<init-param>
<param-name>fork</param-name>
<param-value>>false</param-value>
</init-param>
<init-param>
<param-name>keepgenerated</param-name>
<param-value>>true</param-value>
</init-param>
...
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspf</url-pattern>
<url-pattern>*.jspx</url-pattern>
<url-pattern>*.xsp</url-pattern>
<url-pattern>*.JSP</url-pattern>
<url-pattern>*.JSPF</url-pattern>
<url-pattern>*.JSPX</url-pattern>
<url-pattern>*.XSP</url-pattern>
</servlet-mapping>
<servlet id=>"my-servlet">
<servlet-name>myServlet</servlet-name>
<servlet-class>com.acme.servlet.MyServlet</servlet-class>
...
用JSTL標(biāo)簽庫(kù)
JavaServer Pages Standlard Tag Library(JSTL)是Jetty公布版本號(hào)的一部分(在$JETTY_HOME/lib/jsp)中。
用JSF標(biāo)簽庫(kù)
以下提供關(guān)于使用JSF標(biāo)簽庫(kù)的信息。
在Jetty公布中使用JSF標(biāo)簽庫(kù)
假設(shè)你想在你的webapp中使用JSF,你須要拷貝JSF實(shí)現(xiàn)Jar(你選擇的JSF實(shí)現(xiàn)中包括META-INF/*.tld文件的jar)進(jìn)入Jetty的共享容器庫(kù)目錄。你能放他們到lib目錄匹配你選擇的JSP容器(或者Glassfish JSP的$JETTY_HOME/lib/jsp,或者Apache JSP的$JETTY_HOME/lib/apache-jsp),或者放它們進(jìn)入$JETTY_HOME/lib/ext。
用Jetty Maven插件使用JSF標(biāo)簽庫(kù)
你應(yīng)該使你的JSF Jar依賴插件,而不是webapp自身。比如:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<configuration>
<webApp>
<contextPath>/${artifactId}</contextPath>
</webApp>
<scanIntervalSeconds>5</scanIntervalSeconds>
</configuration>
<dependencies>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.0.8</version>
</dependency>
</dependencies>
</plugin>
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

