日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

深入讲解JSP 2.0下的动态内容缓存技术

發(fā)布時(shí)間:2023/12/18 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入讲解JSP 2.0下的动态内容缓存技术 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
深入講解JSP 2.0下的動(dòng)態(tài)內(nèi)容緩存技術(shù) 來(lái)源: 山里娃信息網(wǎng) ?新聞?lì)}要: 內(nèi)容緩存是Web應(yīng)用中最普通的優(yōu)化技術(shù)之一,例如,可以使用一個(gè)自定義地JSP標(biāo)簽——我們將之命名為<jc:cache>——由<jc:cache>和</jc:cache>將每一個(gè)需要被緩存的頁(yè)面片段封裝起來(lái)。任何自定義標(biāo)簽可以控制它所包含部分 (也即預(yù)先封裝的頁(yè)面片段)在何時(shí)執(zhí)行,并且動(dòng)態(tài)輸出結(jié)果可以被捕獲。<jc:cache>標(biāo)簽使得JSP容器(例如Tomcat)只生成內(nèi)容一次,作為應(yīng)用程序范圍內(nèi)的JSP變量,來(lái)存儲(chǔ)每一個(gè)緩存片段。每次JSP頁(yè)面被執(zhí)行時(shí),自定義標(biāo)簽將緩存頁(yè)面片段載入而無(wú)需再次執(zhí)行JSP代碼來(lái)生成輸出結(jié)果。作為Jakarta工程的一個(gè)部分,標(biāo)簽庫(kù)的開(kāi)發(fā)使用了這項(xiàng)技術(shù)。當(dāng)被緩存內(nèi)容無(wú)需被每一個(gè)用戶或者請(qǐng)求所定制的時(shí)候,它工作的十分良好。 內(nèi)容緩存是Web應(yīng)用中最普通的優(yōu)化技術(shù)之一,例如,可以使用一個(gè)自定義地JSP標(biāo)簽——我們將之命名為<jc:cache>——由<jc:cache>和</jc:cache>將每一個(gè)需要被緩存的頁(yè)面片段封裝起來(lái)。任何自定義標(biāo)簽可以控制它所包含部分 (也即預(yù)先封裝的頁(yè)面片段)在何時(shí)執(zhí)行,并且動(dòng)態(tài)輸出結(jié)果可以被捕獲。<jc:cache>標(biāo)簽使得JSP容器(例如Tomcat)只生成內(nèi)容一次,作為應(yīng)用程序范圍內(nèi)的JSP變量,來(lái)存儲(chǔ)每一個(gè)緩存片段。每次JSP頁(yè)面被執(zhí)行時(shí),自定義標(biāo)簽將緩存頁(yè)面片段載入而無(wú)需再次執(zhí)行JSP代碼來(lái)生成輸出結(jié)果。作為Jakarta工程的一個(gè)部分,標(biāo)簽庫(kù)的開(kāi)發(fā)使用了這項(xiàng)技術(shù)。當(dāng)被緩存內(nèi)容無(wú)需被每一個(gè)用戶或者請(qǐng)求所定制的時(shí)候,它工作的十分良好。

這篇文章對(duì)上面描述的技術(shù)做了改進(jìn),通過(guò)使用JSP 2.0表達(dá)式語(yǔ)言(EL),允許JSP頁(yè)面為每一個(gè)請(qǐng)求和用戶定制緩存內(nèi)容。緩存頁(yè)面片段可以包含未被JSP容器賦值的JSP表達(dá)式,在每一次頁(yè)面被執(zhí)行時(shí),由自定義標(biāo)簽來(lái)確定這些表達(dá)式的值。因此,動(dòng)態(tài)內(nèi)容的建立被最優(yōu)化,但是緩存片段可以含有部分由每一個(gè)請(qǐng)求使用本機(jī)JSP表達(dá)式語(yǔ)言產(chǎn)生的內(nèi)容。通過(guò) JSP 2.0 EL API的幫助,Java開(kāi)發(fā)者可以用表達(dá)式語(yǔ)言來(lái)使之成為可能。

內(nèi)容緩存VS數(shù)據(jù)緩存

內(nèi)容緩存不是唯一的選擇。例如, 從數(shù)據(jù)庫(kù)中提取的數(shù)據(jù)同樣可以被緩存。事實(shí)上,由于存儲(chǔ)的信息中不包含HTML markup,以及要求較少的內(nèi)存,數(shù)據(jù)緩存可能更加高效率。然而在很多情況下,內(nèi)存緩存更容易實(shí)現(xiàn)。假設(shè)在某個(gè)案例總,一個(gè)應(yīng)用由大量事務(wù)對(duì)象,占用重要的CPU資源,產(chǎn)生復(fù)雜的數(shù)據(jù),并且用JSP頁(yè)面來(lái)呈現(xiàn)這些數(shù)據(jù)。工作一切良好,直到某天突然地服務(wù)器的負(fù)載增加,需要一個(gè)緊急解決方案。這時(shí)在事務(wù)對(duì)象和呈現(xiàn)表達(dá)層之間建立一個(gè)緩存層,時(shí)一個(gè)非常不錯(cuò)和有效的方案。但是必須非常快速和流暢地修改緩存動(dòng)態(tài)內(nèi)容的JSP頁(yè)面。相對(duì)于簡(jiǎn)單的JSP頁(yè)面編輯,應(yīng)用程序的業(yè)務(wù)邏輯變化通常要求更多的工作量和測(cè)試;另外,如果一個(gè)頁(yè)面從多個(gè)復(fù)合源聚合信息時(shí),Web層僅有少量的改變。問(wèn)題在于,當(dāng)緩存信息變得失去時(shí)效時(shí),緩存空間需要被釋放,而事務(wù)對(duì)象應(yīng)該知道何時(shí)發(fā)生這種情況。然而,選擇實(shí)現(xiàn)內(nèi)容緩存還是數(shù)據(jù)緩存,或者其他的優(yōu)化技術(shù),有很多不得不考慮的因素,有時(shí)是所開(kāi)發(fā)的程序所特殊要求的。    數(shù)據(jù)緩存和內(nèi)容緩存沒(méi)有必要互相排斥,它們可以一起使用。例如,在數(shù)據(jù)庫(kù)驅(qū)動(dòng)的應(yīng)用中;從數(shù)據(jù)庫(kù)中提取出來(lái)的數(shù)據(jù),和呈現(xiàn)該數(shù)據(jù)的HTML分別被緩存起來(lái)。這與使用JSP實(shí)時(shí)生成的模板有些相似。這篇文章中討論的基于EL API技術(shù)說(shuō)明如何使用JSP EL來(lái)將數(shù)據(jù)載入到呈現(xiàn)模板中。

?

使用JSP變量緩存動(dòng)態(tài)內(nèi)容

每當(dāng)實(shí)現(xiàn)一個(gè)緩存機(jī)制是,都需要一個(gè)存儲(chǔ)緩存對(duì)象的方法,在這篇文章中涉及的是 String類型的對(duì)象。 一種選擇是使用一個(gè)對(duì)象——緩存框架結(jié)構(gòu),或者使用Java maps來(lái)實(shí)現(xiàn)自定義的緩存方案。JSP已經(jīng)擁有了稱為“scoped attributes”或“JSP variables”來(lái)提供ID——object映射,這正是緩存機(jī)制所需要的。對(duì)于使用page或者request scope,這是沒(méi)有意義的,而在應(yīng)用范圍內(nèi),這是一個(gè)很好的存儲(chǔ)緩存內(nèi)容的位置, 因?yàn)樗凰械挠脩艉晚?yè)面共享。當(dāng)每一個(gè)用戶需要單獨(dú)緩存時(shí),Session scope也可以被使用,但這不是很有效率。JSTL標(biāo)簽庫(kù)可以被是與那個(gè)來(lái)緩存內(nèi)容,通過(guò)使用JSP變量正如下例所示:

?

<CCID_NOBR>
<CCID_CODE>  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:if test="${empty cachedFragment}">   <c:set var="cachedFragment" scope="application">   ...   </c:set></c:if>

緩存頁(yè)面片段用下列語(yǔ)句輸出結(jié)果: 

?

<CCID_NOBR>
<CCID_CODE>${applicationScope.cachedFragment}
  

當(dāng)緩存片段需要被每一個(gè)請(qǐng)求所定制的時(shí)候,到底發(fā)生了什么?

例如,如果希望包含一個(gè)計(jì)數(shù)器,需要緩存兩個(gè)片段:

?

<CCID_NOBR>
<CCID_CODE><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <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"/> <c:if test="${empty cachedFragment1}">   <c:set var="cachedFragment1" scope="application">   ...   </c:set></c:if><c:if test="${empty cachedFragment2}">   <c:set var="cachedFragment2" scope="application">   ...   </c:set></c:if>    

可以使用下面語(yǔ)句輸出緩存內(nèi)容:

?

<CCID_NOBR>
<CCID_CODE>${cachedFragment1} ${counter} ${cachedFragment2}
 

通過(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。

?

<CCID_NOBR>
<CCID_CODE><%@ 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á)式的值。

?

<CCID_NOBR>
<CCID_CODE>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類,如下所示:

?

<CCID_NOBR>
<CCID_CODE><?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/j2eeweb-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>

TLD文件包含在Web應(yīng)用描述符文件(web.xml)中,這五個(gè)文件同樣包含一個(gè)初始參數(shù)指出cache是否可用。

?

<CCID_NOBR>
<CCID_CODE><?xml version="1.0" encoding="ISO-8859-1"?><web-app 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-app_2_4.xsd" version="2.4">  <context-param>  <param-name>com.devsphere.articles.jspcache.enabled</param-name><param-value>true</param-value>  </context-param><jsp-config>  <taglib>   <taglib-uri>http://devsphere.com/articles/jspcache</taglib-uri>   <taglib-location>/WEB-INF/jspcache.tld</taglib-location>   </taglib>  </jsp-config></web-app>

?

理解<jc:cache>的工作機(jī)理

JSP容器為JSP頁(yè)面中的每一個(gè)<jc:cache>標(biāo)簽創(chuàng)建一個(gè) CacheTag實(shí)例,來(lái)對(duì)其處理。JSP容器負(fù)責(zé)調(diào)用setJsp()、setParent()和setJspBody()方法,這是CacheTag 類從SimpleTagSupport繼承而來(lái)。JSP容器同事還為所操作標(biāo)簽的每一個(gè)屬性調(diào)用setter方法。SetId()和setScope() 方法存儲(chǔ)屬性值到私有域,這個(gè)值已經(jīng)用CacheTag()構(gòu)造函數(shù)用缺省值初始化。

?

?

<CCID_NOBR>
<CCID_CODE>package com.devsphere.articles.jspcache;   import javax.servlet.ServletContext;   import javax.servlet.jsp.JspContext;   import javax.servlet.jsp.JspException;   import javax.servlet.jsp.PageContext;   import javax.servlet.jsp.tagext.SimpleTagSupport;   import java.io.IOException;import java.io.StringWriter;   public class CacheTag extends SimpleTagSupport {   public static final String CACHE_ENABLED  = "com.devsphere.articles.jspcache.enabled";   private String id;  private int scope;   private boolean cacheEnabled;  public CacheTag() { id = null;scope = PageContext.APPLICATION_SCOPE;   }public void setId(String id) { this.id = id;   }   public void setScope(String scope) { this.scope = JspUtils.checkScope(scope);   } ... } setScope()方法調(diào)用JspUtils.checkScope()來(lái)校驗(yàn)已經(jīng) 從String轉(zhuǎn)換為int類型的scope的屬性值。   ...public class JspUtils {   ...   public static int checkScope(String scope) {   if ("page".equalsIgnoreCase(scope))   return PageContext.PAGE_SCOPE;   else if ("request".equalsIgnoreCase(scope))   return PageContext.REQUEST_SCOPE;   else if ("session".equalsIgnoreCase(scope))   return PageContext.SESSION_SCOPE;   else if ("application".equalsIgnoreCase(scope))   return PageContext.APPLICATION_SCOPE;   else  throw new IllegalArgumentException (  "Invalid scope: " + scope);  }}

?

一旦CacheTag實(shí)例準(zhǔn)備對(duì)標(biāo)簽進(jìn)行操作,JSP容器調(diào)用doTag()方法,用getJspContext()來(lái)獲得JSP context。這個(gè)對(duì)象被造型為PageContext,從而可以調(diào)用getServletContext()方法。servlet context用來(lái)獲取初始化參數(shù)的值,這個(gè)值標(biāo)明緩存機(jī)制是否被啟用。如果緩存被啟用,doTag()嘗試使用id和scope屬性值來(lái)獲得緩存頁(yè)面片段。如果頁(yè)面片段還沒(méi)有被緩存,doTag()使用getJspBody().invoke()來(lái)執(zhí)行由<jc:cache>和</jc:cache>封裝的JSP代碼。由JSP body產(chǎn)生的輸出結(jié)果緩沖在StringWriter并且被toStirng()方法獲得。這樣,doTag()調(diào)用JSP context的setAttribute()方法新建一個(gè)JSP變量,這個(gè)變量控制可能包含JSP表達(dá)式(${…})的緩存內(nèi)容。這些表達(dá)式在用 jspContext.getOut().print()輸出內(nèi)容前,被JspUtils.eval()賦值。只有當(dāng)緩存被啟用的時(shí)候,這些行為才發(fā)生。否則,doTag()只是通過(guò)getJspBody().invoke(null)執(zhí)行JSP body并且輸出結(jié)果不被緩存。

?

?

<CCID_NOBR>
<CCID_CODE>... public class CacheTag extends SimpleTagSupport { ... public void doTag() throws JspException, IOException {   JspContext jspContext = getJspContext();   ServletContext application  = ((PageContext) jspContext).getServletContext(); String cacheEnabledParam= application.getInitParameter(CACHE_ENABLED);  cacheEnabled = cacheEnabledParam != null && cacheEnabledParam.equals("true");   if (cacheEnabled) {   String cachedOutput= (String) jspContext.getAttribute(id, scope);   if (cachedOutput == null) { StringWriter buffer = new StringWriter();   getJspBody().invoke(buffer);   cachedOutput = buffer.toString();   jspContext.setAttribute(id, cachedOutput, scope);   }       String evaluatedOutput = (String) JspUtils.eval(  cachedOutput, String.class, jspContext);   jspContext.getOut().print(evaluatedOutput);   } else  getJspBody().invoke(null);   }   ... }

注意一個(gè)單獨(dú)的JspUtils.eval()調(diào)用給所有的${…} 表達(dá)式賦值。因?yàn)橐粋€(gè)包含了大量的${…}結(jié)構(gòu)的text也是一個(gè)表達(dá)式。每一個(gè)緩存片段都可以被當(dāng)作一個(gè)復(fù)雜的JSP表達(dá)式來(lái)進(jìn)行處理。     IsCacheEnabled()方法返回cacheEnabled的值,這個(gè)值已經(jīng)被doTag()初始化。

?

<CCID_NOBR>
<CCID_CODE>IsCacheEnabled()方法返回cacheEnabled的值,這個(gè)值已經(jīng)被doTag()初始化。 ...public class CacheTag extends SimpleTagSupport { ...   public boolean isCacheEnabled() {  return cacheEnabled;   } }

<jc:cache>標(biāo)簽允許頁(yè)面開(kāi)發(fā)者自主選擇緩存頁(yè)面片段的ID。這使得緩存一個(gè)頁(yè)面片段可以被多個(gè)JSP頁(yè)面共享,當(dāng)需要重用JSP代碼時(shí),這是很有用處的。但是仍然需要一些命名協(xié)議來(lái)避免可能的沖突。通過(guò)修改CacheTag類來(lái)在自動(dòng) ID內(nèi)部包含URL可以避免這種副作用。 

理解<jc:dynamic>在做什么

每一個(gè)<jc:dynamic>被一個(gè)DynamicTag類的實(shí)例處理, setExpr()方法將expr屬性值存儲(chǔ)到一個(gè)私有域。DoTag()方法創(chuàng)建JSP表達(dá)式,在expr屬性值加上${前綴和}后綴。然后, doTag()使用findAncestorWithClass()來(lái)查找含有<jc:dynamic>標(biāo)簽元素的<jc:cache>的 CacheTag handler。如果沒(méi)有查找到或者緩存被禁用,JSP表達(dá)式被JspUtils.eval()賦值并且值被輸出。否則,doTag()輸出無(wú)值表達(dá)式。

?

<CCID_NOBR>
<CCID_CODE>package com.devsphere.articles.jspcache;   import javax.servlet.jsp.JspException;   import javax.servlet.jsp.tagext.SimpleTagSupport;   import java.io.IOException;   public class DynamicTag extends SimpleTagSupport {   private String expr;  public void setExpr(String expr) {this.expr = expr;   }   public void doTag() throws JspException, IOException { String output = "${" + expr + "}";   CacheTag ancestor = (CacheTag) findAncestorWithClass (  this, CacheTag.class);   if (ancestor == null || !ancestor.isCacheEnabled())   output = (String) JspUtils.eval (  output, String.class, getJspContext());   getJspContext().getOut().print(output);   } }

分析上面的代碼,大家可以注意到<jc:cache>和<jc:dynamic>合作來(lái)實(shí)現(xiàn)一個(gè)盡可能有效率的方案。如果緩存可用,頁(yè)面片段和由<jc:dynamic>生成并被CacheTag賦值的JSP表達(dá)式一起放入緩沖器。如果緩存被禁用,緩沖變得沒(méi)有意義,<jc:cache>只是執(zhí)行其JSP body部分,而讓DynamicTag給JSP表達(dá)式賦值。禁用緩存有時(shí)候是必要的,特別是在開(kāi)發(fā)過(guò)程期間出現(xiàn)內(nèi)容的改變和JSP頁(yè)面被重新編譯的時(shí)候。當(dāng)然,在開(kāi)發(fā)完畢的成品環(huán)境中緩存必須被啟用。

總結(jié)

內(nèi)容緩存是一種非常易用的改善Web應(yīng)用性能的方法。這篇文章集中討論了使用JSP 表達(dá)式語(yǔ)言來(lái)為每一個(gè)用戶或者請(qǐng)求定制緩存內(nèi)容。貫穿全文的簡(jiǎn)單介紹的標(biāo)簽庫(kù)適合小型Web apps并且可以提升中等應(yīng)用的性能。對(duì)于開(kāi)發(fā)大型企業(yè)級(jí)應(yīng)用,則應(yīng)當(dāng)考慮使用支持更好的緩存機(jī)制的框架結(jié)構(gòu),而不僅僅局限于使用JSP變量。

?

?

攀登者IT技術(shù)交流總?cè)?#xff1a;141098671(500人) 攀登者IT技術(shù)交流貳群:168051867(500人)|| 攀登者IT【.Net】精英:172663374 || 攀登者IT【Java】精英:216931633||攀登者IT技術(shù)長(zhǎng)沙分群:222932346(只加在長(zhǎng)沙工作的朋友)。歡迎你的加入進(jìn)行技術(shù)探討!加群時(shí)請(qǐng)寫好技術(shù)方向,否則不批準(zhǔn)!

?

轉(zhuǎn)載于:https://www.cnblogs.com/liyumei/articles/2513681.html

總結(jié)

以上是生活随笔為你收集整理的深入讲解JSP 2.0下的动态内容缓存技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。