component标签
component标签用于使用自己的自定义组件,这是一个非常灵活的用法,如果经常需要使用某个效果片段,就可以考虑将这个效果片段定义成一个自定义组件,然后在页面中使用component标签来使用该自定义组件。
因为使用自定义组件还是基于主题、模板管理的,因此在使用component标签时,常常需要指定如下三个属性:
-
theme:自定义组件所使用的主题,如果不指定该属性,默认使用xhtml主题。
-
templateDir:指定自定义组件的主题目录,如果不指定,默认使用系统的主题目录,即template目录。
-
template:指定自定义组件所使用的模板。
除此之外,还可以在cmponent标签内使用param子标签,子标签表示向该标签模板中传入额外的参数。如果希望在模板中取得该参数,总是采用如下形式:$parameters.paramname,或者$parameters['paramname']。
提示:自定义的模板文件可以采用FreeMarker、JSP和Velocity三种技术来书写。
采用JSP模板的例子:
1.模板文件所在的文件目录结构:
2. *.jsp页面的片段:
<div id="box-questions">
<s:iterator value="paperQuestions" id="groupMap">
<s:iterator value="#groupMap['QUESTION_LIST']" id="qstMap">
<s:component templateDir="/includes" theme="custom" template="question.jsp">
<s:param name="mode">exam</s:param>
<s:param name="questionType" value="#qstMap['QUESTION'].questionType" />
. ........................................................................
</s:component>
</s:iterator>
</s:iterator>
</div>
3. 模板页面:
question.jsp(整体结构完整,无其他标签体)
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<s:if test="parameters.questionType == @cn.epis.ets.pojo.Question@QT_SINGLE_SELECT">
<s:component templateDir="/includes" theme="custom" template="single_select.jsp">
<s:param name="mode" value="parameters.mode" />
.......................................................................................
</s:component>
</s:if>
<s:elseif test="parameters.questionType == @cn.epis.ets.pojo.Question@QT_MULTI_SELECT">
<!--templateDir路径加个template目录就是multi_select.jsp的 路径-->
<s:component templateDir="/includes" theme="custom" template="multi_select.jsp">
<s:param name="mode" value="parameters.mode" />
..................................................................................................
</s:component>
</s:elseif>