0

我正在使用 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. 由于某些原因,生成的元素 id 没有前缀<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}" />. 有什么办法可以减少代码量?
4

1 回答 1

0

您在那里使用的param变量是传递给 jsp 的客户端请求参数的隐式创建映射。标签文件中定义的属性不带任何前缀可用,因此使用

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

应该足以输出正确的值。

如果你支持的jsp版本至少为2.0,你也可以省略c:out标签,直接在文本或属性中使用el表达式。如果c:out您需要 xml 转义值,则需要 ,但由于您似乎控制了 this 的值,id这应该不是问题。

于 2012-02-28T23:26:22.637 回答