Пользовательский тег JSP не отображает динамическое содержимое тела - PullRequest
1 голос
/ 29 сентября 2011

Я создал новый тег JSP (в веб-приложении Struts 1.2.9 / Java 5 / Tomcat 5.5), который отображает содержимое в теле тега, когда зарегистрированный пользователь имеет одну из указанных ролей.


<?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, но содержимое, вставленное с тегами вложенных плиток, не отображается.Чтобы уточнить, следующая часть отображается неправильно:


<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), но, конечно, я хочу, чтобы теги плиток оценивались, а вывод тегов записывался в моем собственном теге.По-видимому, это относится не только к тегам плиток, но и к другому динамическому контенту.

Можно ли реализовать пользовательский тег, чтобы также отображался контент, вставленный библиотекой тегов плиток?

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Проблема решена путем изменения директивы тега "body-content" следующим образом:

<jsp:directive.tag body-content="scriptless" />
0 голосов
/ 30 декабря 2013

В Tomcat 6.x JSP 2.1 вы должны использовать:

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