jsf中jsp .tag文件的模拟是什么,或者如何避免复制和粘贴jsf / facelets代码?

时间:2010-01-21 11:44:55

标签: java jsp jsf facelets

我认为标题很清楚,所以我只添加一个典型情况的例子。

第一段代码:

<div id="mailpanel">
    <h:panelGroup id="sendmailpane" styleClass="sendmailpane" layout="block"
                  rendered="#{userReports.reportRendered}">
        <o:inputTextarea promptText="#{msg['mail.listrules']}" promptTextStyle="color: #333"
               value="#{userReports.mailingList}" styleClass="maillist"/>
        <br/>
        <h:commandLink id="sendlink" value="#{msg['mail.sendLink']}"
                   action="#{userReports.sendMail}"/>
    </h:panelGroup>
</div>

第二个(复制的)代码块:

<div id="mailpanel">
    <h:panelGroup id="sendmailpane" styleClass="sendmailpane" layout="block"
                  rendered="#{projectReports.reportRendered}">
        <o:inputTextarea promptText="#{msg['mail.listrules']}" promptTextStyle="color: #333"
               value="#{projectReports.mailingList}" styleClass="maillist"/>
        <br/>
        <h:commandLink id="sendlink" value="#{msg['mail.sendLink']}"
                   action="#{projectReports.sendMail}"/>
    </h:panelGroup>
</div>

正如您所看到的,两个代码块几乎相似,但每个代码块都使用不同的支持bean(但是即使bean也有一个超类,并且在这个示例方法中使用的所有代码实际上都是该超类的方法)。

2 个答案:

答案 0 :(得分:2)

<ui:include src="commonFile.jsp">
    <ui:param name="reportsBean" value="#{projectReports}" />
</ui:include>

并在commonFile.jsp中:

<h:commandLink id="sendlink" value="#{msg['mail.sendLink']}"
               action="#{reportsBean.sendMail}" />

你不能,唉,指明准确包含哪些参数。这就是我使用以下做法的原因:每当你添加一个参数时,你都会在commonFile.jsp的顶部放置注释,说明名称,类型和必需/可选。例如:

<!-- param: reportsBean, required -->
<!-- param: showLegend, optional, default: false, type: boolean -->

答案 1 :(得分:1)

在JSP中,您可以使用custom tags。在Facelets中,您可以使用templating或JSF 2.0 composite components来实现此目的。