自定义JSP标记不呈现动态正文内容

时间:2011-09-29 16:11:58

标签: jsp jsp-tags tiles

我创建了一个新的JSP标记(在Struts 1.2.9 / Java 5 / Tomcat 5.5 Web应用程序中),当登录用户具有一个给定角色时,它会在标记体内呈现内容。


<?xml version="1.0" encoding="UTF-8"?>
<%@ attribute name="userRoles" rtexprvalue="false" required="true" description="Comma-separated list of user role names, against which the logged-in user's roles are tested." %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<jsp:directive.tag description="Evaluates the nested body content if the logged-in user has one of the roles given in the userRoles attribute." />
<jsp:directive.tag body-content="tagdependent" />

<c:if test="${sessionScope.userData ne null}">
    <jsp:doBody var="bodyContent" scope="page"/>
    <jsp:scriptlet>
        String userRoles = (String) jspContext.getAttribute("userRoles");
        com.initech.core.db.model.UserData userData = (com.initech.core.db.model.UserData) session.getAttribute("userData");
        if(com.initech.web.struts.action.UserUtils.hasOneOfRolesInCommaSeparatedList(userData, userRoles)){
            String bodyContent = (String) jspContext.getAttribute("bodyContent");
            out.write(bodyContent);
        }
    </jsp:scriptlet>
</c:if>

使用自定义标记的文件示例:


<?xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
    xmlns:tiles="http://jakarta.apache.org/struts/tags-tiles"
    xmlns:initech-user="urn:jsptagdir:/WEB-INF/tags/initech-user/">
    <html:xhtml />

    <initech-user:userHasRole userRoles="Admin,TPS Manager,">
        abcde
        <tiles:insert name="tiles.components.deletebutton">
            <tiles:put name="deleteClass" value="build"/>
            <tiles:put name="deleteId" value="${sessionScope.buildForm.id}"/>
        </tiles:insert>
    </initech-user:userHasRole>

</jsp:root>

标签部分工作,意味着标签内的所有“正常”内容都会呈现(html标签,文本)。在上面的示例中,文本“abcde”在JSP页面上可见,但使用嵌套tile标签插入的内容不可见。为了澄清,以下部分未正确呈现:


<tiles:insert name="tiles.components.deletebutton">
            <tiles:put name="deleteClass" value="build"/>
            <tiles:put name="deleteId" value="${sessionScope.buildForm.id}"/>
        </tiles:insert>

当我查看HTML源代码时,我看到内容直接呈现给JSP页面“按原样”(即写入页面就好像它是普通的HTML内容),但当然我想要tile标签要评估和要在我自己的标签中写入的标签的输出。这显然不仅适用于tile标签,也适用于其他动态内容。

是否可以实现自定义标记,以便渲染tiles标记库插入的内容?

2 个答案:

答案 0 :(得分:1)

通过随后更改标签指令“body-content”解决了问题:

<jsp:directive.tag body-content="scriptless" />

答案 1 :(得分:0)

在tomcat 6.x jsp 2.1中你必须使用:

<%@tag body-content="scriptless"  %>