Как заставить динамические атрибуты работать в файлах тегов JSP?

Итак, согласно моему справочнику JSP, а также любой другой ссылке, которую я могу найти в Интернете, я должен уметь делать что-то вроде:

<%@ tag dynamic-attributes="dynamicAttributesVar" %>

а затем, когда кто-то использует атрибут, который я не определил в директиве атрибута, я должен иметь доступ к этому атрибуту из карты «dynamicAttributesVar»:

<%= dynamicAttributesVar.get("someUnexpectedAttribute") %>

Однако это совсем не работает; Я просто получаю сообщение об ошибке «dynamicAttributesVar не может быть разрешено», когда пытаюсь.

Теперь я обнаружил (посмотрев на сгенерированный класс Java для тега), что я могу «взломать» рабочую переменную динамических атрибутов, выполнив:

<% Map dynamicAttributesVar = _jspx_dynamic_attrs; %>

Теперь этот хак не сработает, если я также не использую параметр dynamic-attributes в своей директиве тега, так что кажется, что этот параметр что-то делает.

Но что я хочу знать, так это то, как я могу заставить его делать то, что он делает для любого другого пользователя JSP?


person machineghost    schedule 17.04.2009    source источник


Ответы (2)


Разве «dynamicAttributesVar» не является именем ключа в контексте страницы, в который помещаются динамические атрибуты? Так что вы могли бы сделать

<c:out value="${dynamicAttributesVar.someUnexpectedAttributes}"/>

или если вы должны использовать скриптлеты:

Map dynamicAttributes = (Map) pageContext.getAttribute("dynamicAttributesVar")

(Отказ от ответственности: я не пробовал, я просто использовал динамические атрибуты в тегах с прямой реализацией Java... но это кажется разумным)

person araqnid    schedule 18.04.2009
comment
О, это имеет гораздо больше смысла! Ваше предложение сработало с небольшой модификацией (мне пришлось использовать jspContext.getAttribute вместо pageContext.get). Огромное спасибо!! - person machineghost; 18.04.2009
comment
Ах, я обновлю ответ для этого. Прошло некоторое время с тех пор, как я написал один. - person araqnid; 18.04.2009

Просто пытаюсь получить значок за ответ на вопрос четырехлетней давности.

У меня тоже есть эта проблема, и я нашел помощь в O'Reilly использовать JSTL вместо скриптлетов.

Оригинальный постер мог бы использовать этот код для получения всех ключей/значений:

<c:forEach items="${dynamicAttributesVar}" var="a"> 
${a.key}="${a.value}" 
</c:forEach> 

Это получит определенное значение:

<c:out value="${dynamicAttributesVar['someUnexpectedAttribute']}"/>
person Bumptious Q Bangwhistle    schedule 23.09.2013