taglib说明

合集下载

第一篇channel和channelartlist标签详解

第一篇channel和channelartlist标签详解

第⼀篇channel和channelartlist标签详解channel标签⽤来显⽰⽹站的频道,有多种⽤法,涉及到换⾏、分列等功能。

⽹上的资料有限,下⾯我们就结合默认模板详细讲解⼀下这个标签的⽤法。

¢channel|频道标签标签名称:channel标记简介:织梦常⽤标记,通常⽤于⽹站顶部以获取站点栏⽬信息,⽅便⽹站会员分类浏览整站信息功能说明:⽤于获取栏⽬列表适⽤范围:全局使⽤基本语法:{dede:channel type='top' row='8' currentstyle="<li><a href='~typelink~' class='thisclass'>~typename~</a> </li>"}<li><a href='[field:typelink/]'>[field:typename/]</a> </li>{/dede:channel}相关函数:⽂件\include\taglib\channel.lib.php第2⾏function lib_channel(&$ctag,&$refObj)参数说明:typeid = '0' 栏⽬ID type = ‘son | sun’ son表⽰下级栏⽬,self表⽰同级栏⽬,top顶级栏⽬reid = ‘0’ 上级栏⽬IDrow = ‘100’ 调⽤栏⽬数col = ‘1’ 分多少列显⽰(默认为单列)currentstyle = '' 应⽤样式底层模板字段: ID(同 id),typeid, typelink, typename, typeurl,typedir(仅表⽰栏⽬的⽹址) 例: {dede:channel type='top'} <ahref='[field:typelink /]'>[field:typename/]</a> {/dede:channel}注:在没有指定typeid的情况下,type标记与模板的环境有关,如,模板⽣成到栏⽬⼀,那么type='son'就表⽰栏⽬⼀的所有⼦类 ¢频道的分列显⽰除了在channel⾥⾯设置col属性外,还要在dedecms.css中添加对dl标签的格式控制。

JSP标准标签库(JSTL)精品PPT课件

JSP标准标签库(JSTL)精品PPT课件
JSTL规范有Sun公司制定,Apache的Jakarta小组负责实 现,目前的版本是JSTL1.1.2
JSTL的目的是简化JSP页面的设计。为页面设计人员和程 序开发人员的分工协作提供了便利。
JSTL1.0需要支持Servlet2.3和JSP1.2的Web容器,而 JSTL1.1需要支持Servlet2.4和JSP2.0的Web容器。
<c:set>
用于设置范围变量的值或JavaBean对象的属性。
语法1:使用value属性设置范围变量的值 <c:set value=“value” var=“varname” [scope=“{page|request|session|application}”] />
语法2:使用标签体设置范围变量的值 <c:set var=“varName” [scope=“{page|request|session|application}”] > body content </c:set>
<c:out>
用于计算一个表达式,并将结果输出到当前的JspWriter对 象。
<c:out>标签的功能类似于JSP的表达式<%=expression %>, 或者EL表达式${el-expression}
语法1:没有标签体: <c:out value=“value” [escapeXml=“{true|false}”]
EL最初定义在JSTL1.0规范中,在JSP2.0后,EL正式成 为JSP规范的一部分。在JSTL1.1规范中,已经没有了EL 部分,不过,在JSTL中仍然可以使用EL。
JSTL API下载地址为:
JSTL组成
JSTL是由5个不同的功能的标签库组成的。在 JSTL1.1规范中,为5个标签库分别指定了不同的 URI,并对标签库的前缀做出了规定:

el表达式fn函数

el表达式fn函数

做了一个月的项目,下面把我经常用到的,在今天写了几篇文章,方便以后的查阅.fn函数:Java代码1.使用前在Jsp页面的首部加上以下代码:2.3.<%@ taglib prefix="fn" uri="/jsp/jstl/functions" %>4.5.下面是JSTL中自带的方法列表以及其描述6.7.函数名函数说明使用举例8.f n:contains 判断字符串是否包含另外一个字符串 <c:if test="${fn:contains(name, searchString)}">9.f n:containsIgnoreCase 判断字符串是否包含另外一个字符串(大小写无关) <c:if test="${fn:containsIgnoreCase(name, searchString)}">10.fn:endsWith 判断字符串是否以另外字符串结束 <c:if test="${fn:endsWith(filename, ".txt")}">11.fn:escapeXml 把一些字符转成XML表示,例如 <字符应该转为&lt; ${fn:escapeXml(param:info)}12.fn:indexOf 子字符串在母字符串中出现的位置 ${fn:indexOf(name, "-")}13.fn:join 将数组中的数据联合成一个新字符串,并使用指定字符格开 ${fn:join(array, ";")}14.fn:length 获取字符串的长度,或者数组的大小 ${fn:length(shoppingCart.products)}15.fn:replace 替换字符串中指定的字符 ${fn:replace(text, "-", "&#149;")}16.fn:split 把字符串按照指定字符切分 ${fn:split(customerNames, ";")}17.fn:startsWith 判断字符串是否以某个子串开始 <c:if test="${fn:startsWith(product.id, "100-")}">18.fn:substring 获取子串 ${fn:substring(zip, 6, -1)}20.${fn:substringAfter(zip, "-")}21.fn:substringBefore 获取从开始到某个字符所在位置的子串 ${fn:substringBefore(zip, "-")}22.fn:toLowerCase 转为小写 ${fn.toLowerCase()}23.fn:toUpperCase 转为大写字符 ${fn.UpperCase()}24.fn:trim 去除字符串前后的空格 ${fn.trim(name)}[java]view plaincopyprint?1. 使用前在Jsp页面的首部加上以下代码:2.3. <%@ taglib prefix="fn" uri="/jsp/jstl/functions" %>4.5. 下面是JSTL中自带的方法列表以及其描述6.7. 函数名函数说明使用举例8. f n:contains 判断字符串是否包含另外一个字符串 <c:if test="${fn:contains(name, searchString)}">9. f n:containsIgnoreCase 判断字符串是否包含另外一个字符串(大小写无关) <c:if test="${fn:containsIgnoreCase(name, searchString)}">10. fn:endsWith 判断字符串是否以另外字符串结束 <c:if test="${fn:endsWith(filename, ".txt")}">11. fn:escapeXml 把一些字符转成XML表示,例如 <字符应该转为&lt; ${fn:escapeXml(param:info)}12. fn:indexOf 子字符串在母字符串中出现的位置 ${fn:indexOf(name, "-")}13. fn:join 将数组中的数据联合成一个新字符串,并使用指定字符格开 ${fn:join(array, ";")}14. fn:length 获取字符串的长度,或者数组的大小 ${fn:length(shoppingCart.products)}15. fn:replace 替换字符串中指定的字符 ${fn:replace(text, "-", "&#149;")}16. fn:split 把字符串按照指定字符切分 ${fn:split(customerNames, ";")}17. fn:startsWith 判断字符串是否以某个子串开始 <c:if test="${fn:startsWith(product.id, "100-")}">18. fn:substring 获取子串 ${fn:substring(zip, 6, -1)}20. ${fn:substringAfter(zip, "-")}21. fn:substringBefore 获取从开始到某个字符所在位置的子串 ${fn:substringBefore(zip, "-")}22. fn:toLowerCase 转为小写 ${fn.toLowerCase()}23. fn:toUpperCase 转为大写字符 ${fn.UpperCase()}24. fn:trim 去除字符串前后的空格 ${fn.trim(name)}函数描述fn:contains(string, substring)如果参数string中包含参数substring,返回truefn:containsIgnoreCase(string, substring)如果参数string中包含参数substring(忽略大小写),返回truefn:endsWith(string, suffix)如果参数string 以参数suffix结尾,返回truefn:escapeXml(string)将有特殊意义的XML (和HTML)转换为对应的XML character entity code,并返回fn:indexOf(string, substring)返回参数substring在参数string中第一次出现的位置fn:join(array, separator)将一个给定的数组array用给定的间隔符separator串在一起,组成一个新的字符串并返回。

tag文件

tag文件

tag文件只是以tag为后缀名的文本文件。

除了jsp页面指令外,其他JSP元素都可以出现在tag文件中页面引用格式<%@ taglib prefix="ui" tagdir="/WEB-INF/tags" %>tagdir:用于指定tag文件目录,当页面使用<ui:xxxx>进,会查找该目录下对应的xxxx.tag 文件。

prefix:指定使用时标签前缀使用格式<ui:xxxx></ui:xxxx>例子:<ui:tagDemo></ui:tagDemo>tag文件添加属性:当tag文件需要引用页面传入参数时,就需要在tag 文件中填加属性定义属性格式<%@ attribute name="attributename" required="true" type="com.myapp.util.ListPage" %> name(必须):属性名required(必须):指定是否必须传type(可选):指定属性类型。

tag文件获得传入参数值String attributename=(String) pageContext.getAttribute("attributename");或者在jsp元素中使用${pageScope.attributename}也可使用<jsp:doBody/> 获取引用页面标签内的body内容。

下面是示例:tagDemo.tag[html]view plaincopyprint?1. <%@tag pageEncoding="UTF-8"isELIgnored="false" %>2. <a href="mailto:!--%@tag pageEncoding="--=""body-content="empty"iselignored="false">!--<a href="mailto:%@tag pageEncoding="--=""body-content="empty"iselignored="false">%@tag pageEncoding="UTF-8"isELIgnored="false"body-content="empty"%> --</a>3. <!--body-content="empty"表明使用标签时,标签内不能有内容-->4.5. <%@ taglib prefix="c"uri="/jsp/jstl/core" %>6. <%@ attribute name="listPage"required="true"type="com.myapp.util.ListPage" %>7. <%@ attribute name="url"required="true"%>8. <%@ attribute name="appender"required="false"%>9. <%@ attribute name="color"required="false" %>10. <table width="400"cellpadding="5"bgcolor="${pageScope.color}">11. <tr>12. <td>13. <jsp:doBody/>14. </td>15. </tr>16. </table>17. <c:if test="${not empty listPage.authors}">18. <c:choose>19. <c:when test="${not empty appender}">20. <c:set var="myPath"value="${url}${appender}page="/>21. </c:when>22. <c:otherwise>23. <c:set var="myPath"value="${url}"/>24. </c:otherwise>25. </c:choose>26. <c:if test="${listPage.hasNext}"><a href='<c:urlvalue="${myPath}${listPage.nextPage}"/>'>下一页</a></c:if>27. <c:if test="${listPage.hasPrev}"><a href='<c:urlvalue="${myPath}${listPage.prevPage}"/>'>上一页</a></c:if>28. (${listPage.currentPage}/<a href='<c:urlvalue="${myPath}${listPage.totalPage}"/>'>${listPage.totalPage}</a>页)<br/>29. <c:if test="${listPage.totalPage >= 3}">30. 快速翻页:<input name="page"maxlength="4"size="3"value="1"format="*N"/>31. <anchor>GO32. <go method="post"href="<c:url value='${myPath}$(page)'/>"></go>33. </anchor><br/>34. </c:if>[html]view plaincopyprint?1.[html]view plaincopyprint?1. 使用页面tagDemo.jsp[html]view plaincopyprint?1. <pre class="html"name="code"><%@pageimport="com.myapp.domain.Author"%>2. <%@page import="com.myapp.util.ListPage"%>3. <%@ page language="java"import="java.util.*"pageEncoding="utf-8"%>4. <%@ taglib prefix="tags"tagdir="/WEB-INF/tags" %>5.6.7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">8. <html>9. <head>10.11.12. <title>标签文件简介示例</title>13.14. <meta http-equiv="pragma"content="no-cache">15. <meta http-equiv="cache-control"content="no-cache">16. <meta http-equiv="expires"content="0">17. <meta http-equiv="keywords"content="keyword1,keyword2,keyword3">18. <meta http-equiv="description"content="This is my page">19. <!--20. <link rel="stylesheet" type="text/css" href="styles.css">21. -->22.23. </head>24.26. <%27. L istPage listPage=new ListPage();28. l istPage.setHasNext(true);29. l istPage.setHasPrev(false);30. l istPage.setTotalPage(10);31. l istPage.setCurrentPage(1);32. l istPage.setNextPage(2);33. l istPage.setPrevPage(10);34. L ist<Author>atuhors=new ArrayList<Author>();35. A uthor author=new Author();36. a uthor.setId(1);37. a uthor.setName("liao");38. a tuhors.add(author);39. l istPage.setAuthors(atuhors);40. %>41. <tags:tagDemo url="tagDemo.jsp?page="listPage="<%=listPage%>"color="red">这是我传入的Body内容</tags:tagDemo>42. </body>43. </html>44. </pre><br>45. <pre></pre>。

OneThink部分标签的使用说明

OneThink部分标签的使用说明

OneThink部分标签的使用说明所有标签需要参照标签库文件进行分析:\ThinkPHP\Library\OT\TagLib\Article.class.php1、分页标签:<article:page cate="$category['id']" listrow="$category['list_row']" paramk="$paramk" paramv="$paramv" />cate属性是模型分类的id,listrow属性是每页显示多少条数据,paramk属性是URL参数名,paramv是URL参数值。

其中:listrow="$category['list_row']"参数值可在后台编辑分类里高级选项里设置,如下:2、推荐位标签:<article:position pos="2" cate="$category['id']" limit="6" filed="title,cover_id,link_id" name="vo"><div class="tjblock"><div class="tjbooks"><img src="{:get_cover($vo['cover_id'],'path')}" width="100" height="144"> </div><div class="tjbooksname"><a href="{:get_link($vo['link_id'])}">{$vo.title}</a></div></div></article:position>pos属性是推荐位的值,由后台设置。

ThinkPHP笔记完全配置参考手册

ThinkPHP笔记完全配置参考手册

ThinkPHP笔记——完全配置参考手册ThinkPHP2.0配置CHECK_FILE_CASE -- windows环境下面的严格检查大小写。

/* 项目设定*/'APP_DEBUG' => false, // 是否开启调试模式'APP_DOMAIN_DEPLOY' => false, // 是否使用独立域名部署项目'APP_PLUGIN_ON' => false, // 是否开启插件机制'APP_FILE_CASE' => false, // 是否检查文件的大小写对Windows平台有效'APP_GROUP_DEPR' => '.', // 模块分组之间的分割符'APP_GROUP_LIST' => '', // 项目分组设定,多个组之间用逗号分隔,例如'Home,Admi n''APP_AUTOLOAD_REG' => false, // 是否开启SPL_AUTOLOAD_REGISTER'APP_AUTOLOAD_PATH' => 'Think.Util.',// __autoLoad 机制额外检测路径设置,注意搜索顺序'APP_CONFIG_LIST' => array('taglibs','routes','tags','htmls','modules','actions'),// 项目额外需要加载的配置列表,默认包括:taglibs(标签库定义),routes(路由定义),tags(标签定义),(ht mls)静态缓存定义, modules(扩展模块),actions(扩展操作)/* Cookie设置*/'COOKIE_EXPIRE' => 3600, // Coodie有效期'COOKIE_DOMAIN' => '', // Cookie有效域名'COOKIE_PATH' => '/', // Cookie路径'COOKIE_PREFIX' => '', // Cookie前缀避免冲突/* 默认设定*/'DEFAULT_APP' => '@', // 默认项目名称,@表示当前项目'DEFAULT_GROUP' => 'Home', // 默认分组'DEFAULT_MODULE' => 'Index', // 默认模块名称'DEFAULT_ACTION' => 'index', // 默认操作名称'DEFAULT_CHARSET' => 'utf-8', // 默认输出编码'DEFAULT_TIMEZONE' => 'PRC', // 默认时区'DEFAULT_AJAX_RETURN' => 'JSON', // 默认AJAX 数据返回格式,可选JSON XML ...'DEFAULT_THEME' => 'default', // 默认模板主题名称'DEFAULT_LANG' => 'zh-cn', // 默认语言/* 数据库设置*/'DB_TYPE' => 'mysql', // 数据库类型'DB_HOST' => 'localhost', // 服务器地址'DB_NAME' => '', // 数据库名'DB_USER' => 'root', // 用户名'DB_PWD' => '', // 密码'DB_PORT' => 3306, // 端口'DB_PREFIX' => 'think_', // 数据库表前缀'DB_SUFFIX' => '', // 数据库表后缀'DB_FIELDTYPE_CHECK' => false, // 是否进行字段类型检查'DB_FIELDS_CACHE' => true, // 启用字段缓存'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8'DB_DEPLOY_TYPE' => 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)'DB_RW_SEPARATE' => false, // 数据库读写是否分离主从式有效/* 数据缓存设置*/'DATA_CACHE_TIME' => -1, // 数据缓存有效期'DATA_CACHE_COMPRESS' => false, // 数据缓存是否压缩缓存'DATA_CACHE_CHECK' => false, // 数据缓存是否校验缓存'DATA_CACHE_TYPE' => 'File', // 数据缓存类型,支持:File|Db|Apc|Memcache|Shmop|Sqli te| Xcache|Apachenote|Eaccelerator'DATA_CACHE_PATH' => TEMP_PATH,// 缓存路径设置(仅对File方式缓存有效)'DATA_CACHE_SUBDIR' => false, // 使用子目录缓存(自动根据缓存标识的哈希创建子目录) 'DATA_PATH_LEVEL' => 1, // 子目录缓存级别/* 错误设置*/'ERROR_MESSAGE' => '您浏览的页面暂时发生了错误!请稍后再试~',//错误显示信息,非调试模式有效'ERROR_PAGE' => '', // 错误定向页面/* 静态缓存设置*/'HTML_CACHE_ON' => false, // 默认关闭静态缓存'HTML_CACHE_TIME' => 60, // 静态缓存有效期'HTML_READ_TYPE' => 0, // 静态缓存读取方式0 readfile 1 redirect'HTML_FILE_SUFFIX' => '.shtml',// 默认静态文件后缀/* 语言设置*/'LANG_SWITCH_ON' => false, // 默认关闭多语言包功能'LANG_AUTO_DETECT' => true, // 自动侦测语言开启多语言功能后有效/* 日志设置*/'LOG_RECORD' => false, // 默认不记录日志'LOG_FILE_SIZE' => 2097152, // 日志文件大小限制'LOG_RECORD_LEVEL' => array('EMERG','ALERT','CRIT','ERR'),// 允许记录的日志级别/* 分页设置*/'PAGE_ROLLPAGE' => 5, // 分页显示页数'PAGE_LISTROWS' => 20, // 分页每页显示记录数/* SESSION设置*/'SESSION_AUTO_START' => true, // 是否自动开启Session// 内置SESSION类可用参数//'SESSION_NAME' => '', // Session名称//'SESSION_PATH' => '', // Session保存路径//'SESSION_CALLBACK' => '', // Session 对象反序列化时候的回调函数/* 运行时间设置*/'SHOW_RUN_TIME' => false, // 运行时间显示'SHOW_ADV_TIME' => false, // 显示详细的运行时间'SHOW_DB_TIMES' => false, // 显示数据库查询和写入次数'SHOW_CACHE_TIMES' => false, // 显示缓存操作次数'SHOW_USE_MEM' => false, // 显示内存开销'SHOW_PAGE_TRACE' => false, // 显示页面Trace信息由Trace文件定义和Action操作赋值'SHOW_ERROR_MSG' => true, // 显示错误信息/* 模板引擎设置*/'TMPL_ENGINE_TYPE' => 'Think', // 默认模板引擎以下设置仅对使用Think模板引擎有效'TMPL_DETECT_THEME' => false, // 自动侦测模板主题'TMPL_TEMPLATE_SUFFIX' => '.html', // 默认模板文件后缀'TMPL_CACHFILE_SUFFIX' => '.php', // 默认模板缓存后缀'TMPL_DENY_FUNC_LIST' => 'echo,exit', // 模板引擎禁用函数'TMPL_PARSE_STRING' => '', // 模板引擎要自动替换的字符串,必须是数组形式。

jsf 标签使用文档

jsf 标签使用文档

修订记录*页面的开头<%@ taglib uri="/jsf/core" prefix="f"%><%@ taglib uri="/jsf/html" prefix="h"%><%@ taglib uri="/extensions" prefix="x"%><%@ taglib uri="/htmLib" prefix="htm"%><%@ taglib uri="/xmdc" prefix="xmdc"%><%@ taglib uri="/jstl/core" prefix="c"%><%@ taglib uri="/jstl/fmt" prefix="fmt"%><%@ taglib prefix="tiles" uri="/tags-tiles"%><link rel="stylesheet" type="text/css"href="<%=request.getContextPath()%>/css/style_organ.css" /><link rel="stylesheet" type="text/css"href="<%=request.getContextPath()%>/css/public.css" /><link rel="stylesheet" type="text/css"href="<%=request.getContextPath()%>/css/ext.css" />*假数据的构造<%String str[] = new String[] { "项目名称1", "项目名称2" };javax.faces.model.ArrayDataModel ad = new javax.faces.model.ArrayDataModel(str);pageContext.setAttribute("ad", ad, PageContext.SESSION_SCOPE);%>1、inputTextarea常用属性:colsRows常用的写法:<h:inputTextarea value=”” rows=”8” style=”width:100%” />2、inputText常用属性:readonlySize 框的大小Maxlength 最多字符数常用的写法:<h:inputText value=”” size=”5” readonly=”true”Maxlength=”6”style=”color:yellow;background:Teal;” />3、outputText常用属性:escape 如果设置为true,会转义<、>和&字符。

史上最全的DEDECMS文件目录详细解释(初学必备)

史上最全的DEDECMS文件目录详细解释(初学必备)

Dedecms文件目录结构分析本文主要是为了今后对Dedecms做二次开发所写。

安装后dedecms的目录,如(图1)所示,图1-文件根目录“a”:默认HTML文件存放目录“data”:系统缓存或其它可写入数据存放目录“dede”:默认后台管理目录“images”:系统默认模板图片存放目录“include”:类库文件目录“install”:安装程序目录,安装完后可删除“member”:会员目录“plus”:附助程序目录“special”:专题目录“templets”:系统默认内核模板目录“uploads”:默认上传目录“index.php”:网站默认首页“robots.txt”:搜索控制文件“tags.php”:标签页详细的目录结构如下:|a/*生成HTML的目录,老版本为html文件夹*/|data/*程序生成常用数据保存目录*/||admin/*保存系统后台常规配置,例如作者、快速导航、来源这些内容,通常以文本格式存放*/||backupdata/*数据库备份存放目录,可以在系统后台设置处修改*/||cache/*系统缓存*/||enums/*联动类别生成的缓存和js文件*/||js/*栏目js调用生成的js文件*/||mark/*图片水印设置目录*/||module/*系统后台那些模块安装包存放的目录,通常文件名称加密过*/||rss/*生成RSSmap存放的文件目录*/||sessi*****/*系统sessi*****存放目录,一般登陆后就会生成个session,目录不可写那可能无法登陆*/||textdata/*文本数据,系统后台保存为文本数据存放目录*/||tplcache/*模板缓存目录,这个缓存一般是那些动态页*/||ziptmp/*压缩缓存目录*/|dede/*系统后台管理目录*/||img||inc||js||templets/*系统后台的模板存放目录*/|images||js||swfupload|||images|||plugins|include/*系统核心类库、函数存放目录*/||calendar/*日历控件,就是日期编辑框跳出来的那个日历框*/||code/*datalistcp动态分页类的编码语言包*/||data/*系统核心设置的数据,比如词库默认验证码*/||dialog/*系统对话框存放目录,通常是编辑器上面选择的类似于缩略图、插入图片文件*/|||img||FCKeditor/*编辑器存放目录,用的是开源编辑器FCK*/|||editor||||css|||||images||||dialog|||||common|||||fck_about|||||fck_codes|||||fck_flash|||||fck_image|||||fck_link||||dtd||||images|||||smiley||||js||||lang||||skins|||||images||inc/*这里存放一些用才引入的比较长的函数*/||taglib/*就是那些用在模板中的标签存放的目录了*/|||channel/*解析一些特殊字段的扩展函数库*/|||help/*基本的标签说明*/||tpllib/*动态模板标签,一般用在动态调用页面上面的标签*/ |install/*安装目录*/||images||templates|member/*会员中心目录*/||images|||pay||inc/*会员中心*/||js||paycenter/*支付接口配置*/|||alipay|||cbpayment|||nps|||tenpay|||yeepay||space/*会员中心的空间模板*/|||coffee||||images|||company||||images|||flower||||images|||gray||||images|||lxblog||||images|||lxbrown||||images|||lxvista||||images|||person||||blue||||common|||||css|||||images||||images|||pwblue||||images|||pwglight||||images|||pwlake||||images|||pwpink||||images||templets|plus/*系统插件存放目录*/||guestbook/*留言板插件*/|||images||img|||face||paycenter|||alipay|||cbpayment|||nps|||tenpay|||yeepay||task|special/*专题存放目录*/|templets/*织梦模板存放目录*/||default/*系统默认模板目录*/||images|||mood||js||plus/*插件页面的模板文件存放目录*/||style/*默认模板存放的CSS样式*/||system/*系统核心底层模板文件夹*/||wap/*那个wap模块的样式目录了*/|uploads/*文件上传存放目录*/||allimg/*图片*/|||090731||flink/*友情链接图片*/||litimg/*缩略图*/||media/*多媒体存放目录*/||soft/*软件*/||userup/*用户文件存放,例如那些头像什么的*/在了解了Dedecms根目录的结构以后,下面来看一看几个在二次开发中比较重要的部分。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用定制标记进行流控制和 URL 管理 级别:中级

Mark A. Kolb(mak@taglib.com) 软件工程师 2003 年 6 月

顾名思义,JSP 标准标记库(JSP Standard Tag Library,JSTL)core 库为一些基本功能(如,管理限定了作用域的变量和与 URL 交互等)和基本操作(如,迭代和条件化)提供了定制标记。这些标记不仅可以由页面设计人员直接利用,而且还为与其它 JSTL 库相结合从而提供更复杂的表示逻辑奠定了基础。Mark Kolb 在本文中继续对 JSTL 和 core 库进行探讨,研究用标记来协助流控制和 URL 管理。 通过阅读本系列的第一篇文章,您对 JSTL 有了初步的了解。我们描述了使用其表达式语言(EL)来访问数据和操作数据。正如您所了解的那样,EL 用来为 JSTL 定制标记的属

性赋予动态值,因此,它所起的作用与 JSP 表达式一样,为内置操作及其它定制标记库指定请求时的属性值。

为了演示 EL 的用法,我们介绍了 core 库中的三个标记:、 和 。 和 用于管理限定了作用域的变量;而 用于

显示数据,尤其是显示用 EL 计算出的值。在此基础上,接下来本文把注意力集中在 core 库的其余标记上,这些标记可以大致归为两大类别:流控制和 URL 管理。

示例应用程序 为了演示 JSTL 标记,我们将使用来自一个工作应用程序的示例,本系列中余下的文章都将使用此应用程序。由于基于 Java 的 Weblog 日渐流行及为人们所熟悉,因此我们将出于此目的使用一个简单的基于 Java 的 Weblog;参阅参考资料以下载该应用程序的 JSP 页面和源代码。Weblog(也称为 blog)是一种基于 Web 的简短注释的日志,这些注释是有关 Weblog 的作者所感兴趣的主题,通常带有与 Web 上其它地方的相关文章及讨论的链接。图 1 中显示了该应用程序正在运行时的抓屏。 图 1. Weblog 应用程序

虽然完整的实现需要二十四个 Java 类,但在表示层中却只涉及 Weblog 应用程序中的两个类,Entry 和 UserBean。这样,对于理解 JSTL 示例而言,只有这两个类比较重要。图 2 显示了 Entry 和 UserBean 的类图。 图 2. Weblog 应用程序的类图 Entry 类表示 Weblog 中一个标有日期的项。其 id 属性用于在数据库中存储及检索该

项,而 title 和 text 属性则表示该项的实际内容。created 和 lastModified 属性引用了 Java 语言中 Date 类的两个实例,分别用来表示最初创建该项的时间和最后编辑该项的时间。author 属性引用了标识该项的创建者的 UserBean 实例。

UserBean 类存储了有关应用程序的已认证用户的信息,如用户名、全名和电子邮件地址。

该类还包含一个用于与相关数据库进行交互的 id 属性。其最后一个属性 roles 引用一列 String 值,这列值标识与相应用户相关的、特定于应用程序的角色。对于 Weblog 应用

程序,相关的角色是“User”(所有应用程序用户常用的缺省角色)和“Author”(该角色指定可以创建和编辑 Weblog 项的用户)。

流控制 由于可以用 EL 替代 JSP 表达式来指定动态属性值,因此页面创作人员无需使用脚本编制元素。因为脚本编制元素可能是引起 JSP 页面中维护问题的主要原因,所以 JSTL 的主要优点就在于提供了这样简单(且标准)的替代方法。

EL 从 JSP 容器检索数据,遍历对象层次结构,然后对结果执行简单的操作。不过,除了访问和操作数据之外,JSP 脚本编制元素的另一个常见用法是流控制。尤其是,页面创作人员常借助 scriptlet 来实现迭代或条件内容。然而,因为这样的操作超出了 EL 的能力,所以 core 库提供了几个定制操作来管理流控制,其形式有迭代、条件化和异常处理。

迭代 在 Web 应用程序环境中,迭代主要用于访存和显示数据集,通常是以列表或表中的一系列行的形式显示。实现迭代内容的主要 JSTL 操作是 定制标记。该标记支持两种不同样式的迭代:整数范围上的迭代(类似 Java 语言的 for 语句)和集合上的迭代(类似 Java 语言的 Iterator 和 Enumeration 类)。

进行整数范围迭代用到了清单 1 中所示的 标记的语法。begin 和 end 属性要么是静态整数值,要么是可以得出整数值的表达式。它们分别指定迭代索引的初始值以及迭代索引的终止值。当使用 在整数范围内进行迭代时,这两个属性是必需的,而其它所有属性都是可选的。

清单 1. 通过 操作进行数字迭代的语法 end="expression" step="expression"> body content 当出现 step 时,它也必须是整数值。它指定每次迭代后索引的增量。这样,迭代索引从 begin 属性的值开始,以 step 属性的值为增量进行递增,在迭代索引超过 end 属性的

值时停止迭代。注:如果省略了 step 属性,那么步长缺省为 1。

如果指定了 var 属性,那么将会创建一个带有指定名称的并限定了作用域的变量,并将每次迭代的当前索引值赋给该变量。这一限定了作用域的变量具有嵌套式可视性 — 只可以在 标记体内对其进行访问。(我们很快将讨论可选属性 varStatus 的用法。)

清单 2 显示了对一组固定整数值进行迭代的 操作示例。

清单 2. 使用 标记来生成表列数据,这些数据对应于某一范围内的数值。 Value Square begin="0" end="10" step="2">

如图 3 中所示,上面的示例代码生成了一张表,显示前五个偶数及其平方。这是通过将 begin 和 step 属性值指定为 2,而将 end 属性值指定为 10 实现的。此外,用 var 属

性创建用于存储索引值的限定了作用域的变量, 标记体内引用了该变量。尤其是,使用了一对 操作来显示索引及其平方,其中索引的平方是使用一个简单的表达式计算得来的。

图 3. 清单 2 的输出

在对集合的成员进行迭代时,用到了 标记的另一个属性:items 属性,清单 3 中显示了该属性。当使用这种形式的 标记时,items 属性是唯一必需的属性。items 属性的值应该是一个集合,对该集合的成员进行迭代,通常使用 EL 表达式指定值。如果变量名称是通过 标记的 item 属性指定的,那么对于每次迭代该已命名变量都将被绑定到集合后续元素上。

清单 3. 通过 操作对集合进行迭代的语法 begin="expression" end="expression" step="expression"> body content 标记支持 Java 平台所提供的所有标准集合类型。此外,您可以使用该操作

来迭代数组(包括基本类型数组)中的元素。表 1 列出了 items 属性所支持的所有值。正如表的最后一行所指出的那样,JSTL 定义了它自己的接口 javax.servlet.jsp.jstl.sql.Result,用来迭代 SQL 查询的结果。(我们将在本系

列后面的文章中详细讨论这一功能。)

表 1. 标记的 items 属性所支持的集合 items 的值 所产生的 item 值

java.util.Collection 调用 iterator() 所获得的元素

java.util.Map java.util.Map.Entry 的实例

java.util.Iterator 迭代器元素

java.util.Enumeration 枚举元素

Object 实例数组 数组元素

基本类型值数组 经过包装的数组元素 用逗号定界的 String 子字符串 javax.servlet.jsp.jstl.sql.Result SQL 查询所获得的行

可以使用 begin、end 和 step 属性来限定在迭代中包含集合中哪些元素。和通过 进行数字迭代的情形一样,在迭代集合中的元素时同样要维护一个迭代索

引。 标记实际上只处理那些与索引值相对应的元素,这些索引值与指定的 begin、end 和 step 值相匹配。

清单 4 显示了用来迭代集合的 标记。对于该 JSP 代码段,entryList 这一限定了作用域的变量被设置成了 Entry 对象列表(确切的说,ArrayList)。 标记依次处理列表中的每个元素,将其赋给一个限定了作用域的变量

blogEntry,然后生成两个表行 — 一个用于 Weblog 项的 title,另一个则用于该项

text。这些特性是通过一对带有相应 EL 表达式的 操作从 blogEntry 变量检

索得到的。注:由于 Weblog 项的标题和文本都可能包含 HTML 标记,因此这两个 标记的 escapeXml 属性都被设置成了 false。图 4 显示了结果。

清单 4. 使用 标记显示表示给定日期的 Weblog 项 align="left" class="blogTitle"> escapeXml="false"/>

相关文档
最新文档