| Weblogic8中除了PageFlow中提供的JSP标签之外,还单独提供了几个非常好用的JSP 标签,本文中作者选择性的解析和演示了其中的cache标签、xslt标签组、query标签。
WebLogic8中除了PageFlow中提供的JSP标签之外,还单独提供了几个非常好用的JSP 标签,他们分别解决了我们Web应用实现过程中经常碰到的一些场景,因为篇幅的关系,本文中作者选择性的解析和演示了其中的cache、xslt、query标签,希望能够帮助大家认识和理解这些标签,并且在应用开发过程中正确的、选择性的采用这些标签,简化自己的工作,加速应用开发进程。
Cache标签
Cache标签面对的问题域
需要处理的特殊动态内容
在信息系统建设过程中我们通常会遇到这样的问题:
信息系统中需要处理的基础数据的内容短时间内是不会发生变化的,但是在一个相对长一些的时间里,它却可能是动态增加或者减少的。
举个例子:电子商务中关于送货区域的定义,可能短时间内不会发生变化,但是随着电子商务企业业务的扩大,系统中需要处理的送货区域就可能增加。所以我们的系统中不得不在每次向客户展示送货区域信息的时候都和数据库(假设送货区域信息保存在数据库中,这也是通常采用的处理方法)进行交互。
一般来说,统计报表是一个周期性的工作,可能是半个月、一个月或者更长的时间才会需要更新一次,然而统计报表通常是图形显示或者是生成pdf、word、excel等格式的文件,这些图形内容、文件的生成通常需要消耗很多的系统资源,给系统运行造成很大的负担。
问题的共同点
通过比较分析,不难发现这两类问题有一些共同点:
- 被处理的内容短时间不变,所以短时间内可以作为静态内容进行处理
- 在一个不太长的时间内,被处理的内容可能或者必定产生变化,所以必须将他们作为动态内容进行处理
- 在合理的时间区段内可以忽略被处理内容变化后带来的影响
- 对这些内容的处理动作比较消耗系统性能,影响系统响应时间
解决方法
缓存技术可以帮助我们很好的解决这个问题:
当上述的基础数据或者统计报表第一次被访问时,被处理的内容被当作动态信息,基础数库从数据库中获得,统计报表也会被生成符合要求的图形、文件,然后这些信息都会被放入缓存信息中。
当上述的基础数据或者统计报表继续被访问时,系统将会首先检查缓存信息中是否有对应的内容和我们设定的缓存规则,如果符合缓存信息存在而且符合缓存规则,给出的响应将来自于缓存信息,如果没有或者缓存信息已经不符合设定的要求,系统将重复上一步的动作。
很显然,上面的步骤2中,多数情况下,当用户请求到达时,被处理的内容将来自于缓存,所以大大的减少了与数据库的交互,或者不再需要为每个请求都生成一次报表图形或者文件,这部分工作的减少对于降低系统性能消耗、提高系统稳定性和并发处理能力是非常有益的。
Cache标签简介
Cache标签给我们提供了一种缓存信息的良好方式,根据不同的缓存要求,我们可以采用简单的属性设置方式来决定被缓存信息的行为,影响缓存信息的状态。
Cache标签是WebLogic8平台中的一个扩展标签,不属于PageFlow中提供的标签,主要有如下特点:
- Cache标签是一个普通JSP标签,所以能够在任何Servlet容器中运行,而不仅仅局限于WebLogic平台。
- Cache标签使用系统内存作为缓存区,所以能够提供非常好的性能。
- 协助用户实现容错
在一般的web应用中,如果某个页面需要和资源打交道,当客户请求到达时,如果web应用和资源之间暂时无法进行交互,那么将返回给用户“系统出错”或者类似的提示信息,如果使用了Cache标签的话,在Cache存在的这段时间内,可以用缓存提供给用户,给自己赢得维护系统或者采取其他补救的时间。。
Cache标签提供了清除缓存功能,当用户清除了缓存后再次访问被缓存部分的内容时,系统提供给用户的是被重新处理过的信息。
Cache标签提供了主动刷新机制,这个功能可以让用户根据自己的需要在Cache的作用时间内选择是否强制性的主动刷新。
开始使用Cache标签
安装
拷贝%BEA_Weblogic_HOME%\weblogic81\server\ext\ weblogic-tags.jar放入WEB-INF\lib目录下,其中%BEA_Weblogic_HOME%指你安装WebLogic8的根目录。
在web.xml文件中增加下面的内容,增加对WebLogic扩展标签库的支持:
<taglib>
<taglib-uri>weblogic-tags.tld</taglib-uri>
<taglib-location>/WEB-INF/lib/weblogic-tags.jar</taglib-location>
</taglib>
[注] 和通常的标签库配置不同的是这里的taglib-location是指向jar文件,不用惊讶,因为这个标签库的tld文件是保存在jar文件的META-INF目录下的(JavaServerFaces中都是这么做的)。如果你觉得不习惯,你可以把这个文件解压缩出来,然后按照通常的标签库配置过程来做。
Cache标签支持的属性
cache标签的属性说明:
key – 标识缓存内容的关键词,用于决定什么内容需要被缓存。在指定的作用范围内必须是唯一的。
默认的key是Web.xml中定义的值,如果没有设定,那么key的默认值是被访问页面的URI。为了针对每个用户设定缓存,你可以设定使用parameter.userid,parameter.clientip这样的设置。
scope – 缓存发生作用的范围,可以是parameter、page、request、cookie、requestHeader、responseHeader、session、application、cluster。通常采用application或者session
timeout – 缓存内容的时间段,单位可以是ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天),默认时间单位是秒。
async – 指定缓存内容是否异步。如果设为true,被缓存的内容将不会更新,访问过的用户将一直看到的是没有被更新过的信息
flush– false 或者true。
如果refresh属性设置为true,不管其他的属性是否符合条件,这部分被缓存的内容都将被更新,这给编程者一种选择,决定什么时候必须刷新。
name – 用于标识在多个页面中共享的缓存内容的名称。
其它可用的属性还包括:size、vars。
上面的这些属性可以单独使用,也可以根据需要组合使用,下面的例子将讲解这些常用属性的使用方式。
Cache标签工作机制
当用户第一次请求到达时,标签中的内容被处理并且缓存起来,当下一个请求到达时,缓存系统会检查这部分内容的缓存是否已经失效,如果被缓存的内容没有失效,那么返回给用户的是缓存中的内容,否则将重新生成页面内容并返回给用户。
缓存失效的主要原因有以下几项:
- 缓存时间超过了cache标签设置的timeout属性规定的超时时间
- 标签中缓存的内容被主动刷新
- 标签中缓存的内容被清除
- 其他缓存超期设定
Cache标签实例分析:
使用默认的关键字来标识cache内容,超时时间是3600秒
<wl:cache timeout=”3600”>
<%
//自己的JSP代码内容
%>
</ wl:cache>
- 用访问用户的ip地址标识缓存内容,并且设定作用范围为session。
因为cache标签使用key值来标识缓存内容,使用相同的key值将会被认为使用相同的的缓存内容,所以使用动态的key值可以自由的根据不同的角色、不同的要求决定使用不同的缓存内容
<wl:cache key="parameter.clientip" scope="session">
<%
//自己的JSP代码内容
%>
</wl:cache>
<wl:cache name="dbtable" key="parameter.tablename" scope="application"
flush="true">
<%
//自己的JSP代码内容
%>
</wl:cache>
根据需要刷新缓存内容的不同采用不同的方法可以强制属性缓存内容,但是都是设置_cache_refresh为true,比如需要所有缓存内容刷新,那么调用在JSP中调用<% application.setAttribute(“_cache_refresh”,”true”);%>或者使用<% session.setAttribute(“_cache_refresh”,”true”);%>强制用户级别的缓存内容刷新。
xslt标签组
用xslt来显示xml内容是参见的Web应用实现过程中需要处理的情况,目前也有不少framework来实现这部分功能,然而对于开发一个不太多xml内容显示的Web应用来说,这些framework显然不够轻量级。
WebLogic8中的xslt标签是一个实现使用xslt显示xml内容的轻量级解决方法,xslt标签组包括三个标签xslt、xml和stylesheet,他们组合起来使用可以实现用xslt输出xml内容的功能,xml内容可以是一个动态的包含xml内容的字符串或者是保存在服务器上的xml文件。
xslt标签组可以动态的决定使用何种样式表来转化xml内容,这对于需要提供多种样式输出的用户来说非常有益,比如你可以根据用户的请求方式决定返回给用户html内容或者xml内容。
xslt标签支持的属性
xslt标签支持三个属性,分别是:xml、media、stylesheet
- xml属性设置需要显示xml文件的位置
- media属性设置需要使用的样式表的media属性
如果要使用media属性,那么xslt必须包含一个或者多个stylesheet标签,xslt标签的media属性都取自于内含stylesheet标签的media属性。
应用检查xslt标签的media属性和内含stylesheet标签的media属性,决定使用那种样式表来显示xml内容。
- stylesheet属性设置需要使用的样式表文件所在的位置
直接指定样式表文件的位置来决定使用哪种样式表。
[注] media属性和stylesheet属性是互斥的,不能同时出现在同一个xslt标签的定义中。
xml标签支持的属性
xml标签用于显示动态的包含xml内容的字符串的情况,它没有属性。
stylesheet标签支持的属性
stylesheet标签支持media和uri两个属性:
- media属性用于唯一标识一个样式表
- uri属性用于指定样式表文件的位置
文件的位置是该样式表文件在web应用中间的相对位置。
开始使用xslt标签组
安装
- 准备一个Web应用
- 环境准备
- 解压缩%BEA_Weblogic_HOME%\weblogic81\server\ext\xmlx.zip,其中%BEA_Weblogic_HOME%指你安装WebLogic8的根目录。
- 拷贝解压缩后的xmlx-tags.jar,放入WEB-INF\lib目录下
- 修改web.xml文件
在web.xml文件中增加下面的内容,增加对WebLogic扩展标签库的支持:
<taglib>
<taglib-uri>weblogic-xml-tags.tld</taglib-uri>
<taglib-location>/WEB-INF/lib/xmlx-tags.jar</taglib-location>
</taglib>
xslt标签实例分析
<wl:xslt xml=”a.xml” stylesheet=”b.xsl”/>
<% String xml= “<companys>” +
”<company name=\”bea\”>”+
“<website uri=\”www.bea.com.cn\”/>”+
“</company>”+
“<company name=\”sun\”>”+
“<website uri=\”www.sun.com.cn\”/>”+
“</company>”+”
“</companys>”;
%>
<wl:xslt stylesheet=”b.xsl”>
<wl:xml>
<%= xml %>
</wl:xml>
</wl:xslt>
<% String media =”html”; %>
<wl:xslt media="<%=media%>">
<wl:stylesheet media="html" uri="html.xsl"/>
<wl:stylesheet media="wml" uri="wml.xsl"/>
</wl:xslt>
query标签
访问数据库是信息系统开发过程中最重要的工作,query标签可以协助我们迅速的访问数据库的功能,只需要简单设置标签的属性,就可以轻松的实现根据提供的sql语句访问数据库、返回ResultSet对象的功能。
query标签只支持通过资源引用访问数据源,然后访问数据库;目前不支持直接访问数据库或者通过直接通过jndi访问数据库,应该说这个标签还是有可以扩展的地方,可惜的是,BEA没有提供源代码,不然的话我会扩展了这部分功能再来和大家共享。
query标签支持三个属性:id,sql,db
用于标识返回ResultSet对象,默认的id是“resultset”
设置你需要执行的sql语句
数据源在该Web应用中的引用名。
开始使用query标签
安装
这部分的安装和cache标签的安装步骤一致,大家可以参考1.3.1安装的步骤
Query标签实例分析
因为query标签的限制,我们只能通过DataSource访问数据库,所以你需要在WebLogic服务器上建立一个DataSource。作者的例子是建立了一个访问SqlServer的DataSource,他的jndi名称是jndi/sql。
在使用query标签的Web应用中增加对所建立DataSource的引用。这部分配置会因为使用的Servlet容器的不同而不同。比如在WebLogic8容器中需要修改web.xml,增加如下内容:
<resource-ref>
<res-ref-name>sql-ref</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
还需要修改weblogic.xml文件,增加如下内容:
<reference-descriptor>
<resource-description>
<res-ref-name>sql-ref</res-ref-name>
<jndi-name>jndi/sql</jndi-name>
</resource-description>
</reference-descriptor>
<wl:query db="sql-ref" sql="select * from companys" id="rs">
<%
//以下内容是遍历生成的ResultSet对象的代码
While(rs.next()){
//循环输出ResultSet对象的第一列
Out.println(rs.getString(1) + “<br>”);
}
%>
</wl:query>
总结
WebLogic8中除了PageFlow中提供的JSP标签之外,还单独提供了几个非常好用的JSP 标签,不知道什么原因,在WebLogic8的文档中并没有全部提到这些标签,作者通过查看这些标签的描述文件(tld文件),通过测试找到了部分标签的使用方法,在本文中作者选择性的解析和演示了其中比较有代表性的cache标签、xslt标签组、query标签,他们处理了我们应用开发过程中经常需要面对的问题:页面内容缓存、用xslt显示xml内容和访问数据库,并提供了标签使用的实例,希望能够让大家都能够在应用中根据情况,选择性的采用这些标签,简化我们的应用开发,享受WebLogic8给我们带来的便利。
|