深入講解JSP2.0下的動(dòng)態(tài)內(nèi)容緩存技術(shù)[2]

程序員 責(zé)任編輯:ajdan4q 2008-06-17

添加老師微信

備考咨詢

加我微信

摘要:通過(guò)專門的標(biāo)簽庫(kù)的幫助,需要定制的頁(yè)面片段的緩存變得異常容易了。上面已經(jīng)提及,緩存內(nèi)容可以被開(kāi)始標(biāo)簽(<jc:cache>)和結(jié)尾標(biāo)簽(</jc:cache>)封裝起來(lái)。而每一個(gè)定制可以使用另一個(gè)標(biāo)簽(<jc:dynamicexpr="..."/>)輸出一個(gè)JSP表達(dá)式(${...})來(lái)表現(xiàn)。動(dòng)態(tài)內(nèi)容用JSP表達(dá)式緩存并在每一次緩存內(nèi)容被輸出時(shí)賦值。在下面的部分可以

通過(guò)專門的標(biāo)簽庫(kù)的幫助,需要定制的頁(yè)面片段的緩存變得異常容易了。上面已經(jīng)提及,緩存內(nèi)容可以被開(kāi)始標(biāo)簽(<jc:cache>)和結(jié)尾標(biāo)簽(</jc:cache>)封裝起來(lái)。而每一個(gè)定制可以使用另一個(gè)標(biāo)簽(<jc:dynamic expr="..."/>)輸出一個(gè)JSP表達(dá)式(${...})來(lái)表現(xiàn)。動(dòng)態(tài)內(nèi)容用JSP表達(dá)式緩存并在每一次緩存內(nèi)容被輸出時(shí)賦值。在下面的部分可以看到這是如何實(shí)現(xiàn)的。Counter.jsp緩存了一個(gè)包含計(jì)數(shù)器的頁(yè)面片段,當(dāng)每一次用戶刷新這個(gè)頁(yè)面的時(shí)候計(jì)數(shù)器會(huì)自動(dòng)+1。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="jc" uri="http://devsphere.com/articles/jspcache" %>
<c:if test="${sessionScope.counter == null}">
<c:set var="counter" scope="session" value="0"/>
</c:if><c:set var="counter" value="${counter+1}" scope="session"/>
<jc:cache id="cachedFragmentWithCounter">
... 
<jc:dynamic expr="sessionScope.counter"/>
...
</jc:cache>

JSP 變量易于使用,對(duì)于簡(jiǎn)單的Web apps,這是一個(gè)不錯(cuò)的內(nèi)容緩存方案。然而,如果應(yīng)用程序產(chǎn)生大量的動(dòng)態(tài)內(nèi)容,沒(méi)有對(duì)緩存大小的控制無(wú)疑是一個(gè)問(wèn)題。一種專用的緩存框架結(jié)構(gòu)能夠提供一個(gè)更加有力的方案,允許對(duì)緩存的監(jiān)視,限制緩存大小,控制緩存策略,等等……

使用JSP 2.0表達(dá)式語(yǔ)言API

JSP容器(例如Tomcat)對(duì)應(yīng)用EL API的JSP頁(yè)面中的表達(dá)式予以賦值,并且可以被Java代碼所使用。這允許在Web頁(yè)面外應(yīng)用JSP EL作開(kāi)發(fā),例如,對(duì)XML文件、基于文本的資源以及自定義腳本。當(dāng)需要控制何時(shí)對(duì)Web頁(yè)面中的表達(dá)式進(jìn)行賦值或者書寫與之相關(guān)的表達(dá)式時(shí),EL API同樣是有用的。例如,緩存頁(yè)面片段可以包含自定義JSP表達(dá)式,并且當(dāng)每一次緩存內(nèi)容被輸出時(shí),EL API將用來(lái)給這些表達(dá)式賦值或者重新賦值。

文章提供了一個(gè)例子程序(參見(jiàn)文末資源部分),這個(gè)應(yīng)用程序包含了一個(gè)Java類(JspUtils)和類中包含一個(gè)方法eval(),這個(gè)方法有三個(gè)參數(shù):JSP表達(dá)式、表達(dá)式的期望類型和一個(gè)JSP context對(duì)象。Eval()方法從JSP context中取得ExpressionEvaluator并且調(diào)用evaluate()方法,通過(guò)表達(dá)式、表達(dá)式的期望類型、和一個(gè)從JSP congtext中獲得的變量。JspUtils.eval()方法返回表達(dá)式的值。

package com.devsphere.articles.jspcache;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.el.ELException;
import javax.servlet.jsp.el.ExpressionEvaluator;
import java.io.IOException;public class JspUtils 
{
public static Object eval(String expr, Class type, JspContext jspContext)
throws JspException 
{
try 
{
if (expr.indexOf("${") == -1)return expr;
ExpressionEvaluator evaluator= jspContext.getExpressionEvaluator();
return evaluator.evaluate(expr, type,
jspContext.getVariableResolver(), null);
} catch (ELException e) 
{
throw new JspException(e);
}
}
...
}

注意:JspUtils.eval()主要封裝了標(biāo)準(zhǔn)的ExpressionEvaluator。如果expr不包含${,JSP EL API不被調(diào)用,因?yàn)闆](méi)有JSP表達(dá)式。

創(chuàng)建標(biāo)簽庫(kù)描述符(TLD)文件

JSP標(biāo)簽庫(kù)需要一個(gè)標(biāo)簽庫(kù)描述符(TLD)文件來(lái)自定義標(biāo)簽的命名,它們的屬性,以及操作該標(biāo)簽的Java類。jspcache.tld描述了兩個(gè)自定義標(biāo)簽,<jc:cache>擁有兩個(gè)屬性:緩存頁(yè)面片段的id和JSP scope—JSP頁(yè)面總需要被儲(chǔ)存的內(nèi)容范圍。<jc:dynamic>只有一個(gè)屬性,即JSP表達(dá)式必須在每一次緩存片段被輸出時(shí)被賦值。TLD文件將這兩個(gè)自定義標(biāo)簽映射到CacheTag和DynamicTag類,如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
web-jsptaglibrary_2_0.xsd"version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>jc</short-name>
<uri>http://devsphere.com/articles/jspcache</uri>
<tag>
<name>cache</name>
<tag-class>com.devsphere.articles.jspcache.CacheTag</tag-class>
<body-content>scriptless</body-content>
<attribute><name>id</name><required>true</required>
<rtexprvalue>true</rtexprvalue></attribute><attribute>
<name>scope</name><required>false</required>
<rtexprvalue>false</rtexprvalue></attribute>
</tag><tag><name>dynamic</name><tag-class>
com.devsphere.articles.jspcache.DynamicTag</tag-class> 
 
<body-content>empty</body-content><attribute>
<name>expr</name><required>true</required>
<rtexprvalue>false</rtexprvalue></attribute>
</tag></taglib>

[1]  [2]  [3]  [4]  

更多資料
更多課程
更多真題
溫馨提示:因考試政策、內(nèi)容不斷變化與調(diào)整,本網(wǎng)站提供的以上信息僅供參考,如有異議,請(qǐng)考生以權(quán)威部門公布的內(nèi)容為準(zhǔn)!

軟考備考資料免費(fèi)領(lǐng)取

去領(lǐng)取

!
咨詢?cè)诰€老師!