JSP-тег, который сокращает пустые атрибуты - PullRequest
1 голос
/ 20 марта 2012

Я ищу более чистый способ написать такой фрагмент jsp:

<a href="${model.link}" class="button"<c:if test="${not empty model.title"> title="${model.title}"</c:if>>

Этот код трудно читать. Проблема заключается в том, что не должно быть сгенерировано пустого атрибута тега title="", поэтому эту часть нужно указывать.

Я нашел тег <c:out> с его атрибутом значения по умолчанию, однако:

<c:out value='title="${model.title}"' default=""/>

не будет работать нормально, потому что значение не будет равно нулю (поскольку это безопасно String concat).

Есть ли способ написать такой простой материал короче, чище, лучше?

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Другой подход как таковой:

<a href="${model.link}" class="button"<% if (model.title != null) { %> title="${model.title}"<% } %>>

немного короче, чем ваш первый пример, но все еще слишком загроможден.

Имейте в виду, однако, что ваш заголовок по-прежнему нуждается в дезинфекции, поскольку он инкапсулирован в HTML-тег.

StringEscapeUtils.escapeHtml(mode.title)
1 голос
/ 20 марта 2012
<c:if test = "${not empty model.title}">
<c:set var = "title" value = "title = '${model.title}'"/>
</c:if>
<a href="${model.link}" class="button" ${title}>

Вы также можете создать пользовательский taglib, чтобы в итоге получилось что-то вроде этого:

<my:link class = "button" model = "${model}">...</my:link>

Поскольку спецификация сервлета что-то делает, вы можете реализовать taglib как jsp-фрагментили вы можете пройти весь путь, используя Java.

...