Вопросы по пользовательским тегам jstl - игнорирование c: out, параметров тегов и сокращение кода - PullRequest
0 голосов
/ 29 февраля 2012

Я использую jstl для создания собственного тега.Вот содержимое файла location.tag:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ attribute name="id" required="true" %>
<%@ attribute name="locationType" required="false" %>
<br/>
<c:out value="${param.id}" /> <---THIS ALWAYS PRINTS NOTHING! WHY?
<br/>
<c:out value="${param.locationType}" /> <---THIS ALWAYS PRINTS NOTHING! WHY?
<br/>
<c:if test="${empty param.locationType}" >
    <select id="<c:out value="${param.id}" />_locationTypeSelect">
        <option value="ADDRESS">כתובת</option>
        <option value="INSTITUTE">מוסד</option>
    </select>
    <script type="text/javascript">
        $(document).ready(function() {
            $('<c:out value="${param.id}" />_locationTypeSelect').change(function() {
                switch($(this).val()) {
                    case 'ADDRESS':
                        $('<c:out value="${param.id}" />_addressCitySelect').show();
                        $('<c:out value="${param.id}" />_addressStreetSelect').show();
                        $('<c:out value="${param.id}" />_addressHouseNumberInput').show();

                        $('<c:out value="${param.id}" />_instituteNameSelect').hide();
                        $('<c:out value="${param.id}" />_instituteBranchSelect').hide();
                        break;
                    case 'INSTITUTE':
                        $('<c:out value="${param.id}" />_addressCitySelect').hide();
                        $('<c:out value="${param.id}" />_addressStreetSelect').hide();
                        $('<c:out value="${param.id}" />_addressHouseNumberInput').hide();

                        $('<c:out value="${param.id}" />_instituteNameSelect').show();
                        $('<c:out value="${param.id}" />_instituteBranchSelect').show();
                        break;
                }
            });
        });
    </script>
</c:if>

<c:if test="${empty param.locationType or param.locationType == 'ADDRESS'}" >
    <select id="<c:out value="${param.id}" />_addressCitySelect"></select>

    <select id="<c:out value="${param.id}" />_addressStreetSelect"></select>

    <input type="text" id="<c:out value="${param.id}" />_addressHouseNumberInput"/>
</c:if>

<c:if test="${empty param.locationType or param.locationType == 'INSTITUTE'}" >
    <select id="<c:out value="${param.id}" />_instituteNameSelect"></select>

    <select id="<c:out value="${param.id}" />_instituteBranchSelect"></select>
</c:if>

Здесь я использую тег местоположения:

<h:location id="a" locationType="ADDRESS"></h:location>
<h:location id="b"></h:location>
  1. По некоторым причинам сгенерированные идентификаторы элементов неимеет префикс <c:out value="${param.id}" />.Например, в location.tag я написал <input type="text" id="<c:out value="${param.id}" />_addressHouseNumberInput"/>, но результатом обоих использований является: <input type="text" id="_addressHouseNumberInput"/> (игнорируется c:out. Что не так?
  2. Для обоих случаев результат htmlто же самое, как если бы он не распознал параметр locationType. Почему это так?
  3. У меня много дублирования кода. Например, все префиксы id: <c:out value="${param.id}" />. Есть ли способуменьшить количество кода?

1 Ответ

0 голосов
/ 29 февраля 2012

Используемая вами переменная param представляет собой неявно созданную карту параметров запроса клиентов, которые были переданы в jsp. Атрибут, определенный в вашем файле тегов, доступен без префикса, поэтому используйте

<c:out value="${id}" />

должно быть достаточно для вывода правильного значения.

Если ваша поддерживаемая версия jsp не ниже 2.0, вы также можете опустить тег c:out и напрямую использовать выражение el в тексте или атрибутах. c:out потребуется, если вам нужно экранирование xml от значения, но, поскольку вы, похоже, управляете значением id, это не должно быть проблемой.

...