2012-02-28 84 views
0

我正在使用jstl來創建自定義標記。這裏是location.tag的內容:jstl自定義標記問題 - 忽略c:out,標記參數並減少代碼

<%@ 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}" />有沒有什麼辦法來減少代碼量

回答

0

param?你使用的變量有一個隱式地創建的傳遞給jsp的客戶請求參數的映射。你的標記文件中定義的屬性是可用的w沒有任何前綴,所以使用

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

應該足以輸出正確的值。

如果您支持的jsp版本至少爲2.0,您還可以省略c:out標記並直接在文本或屬性中使用el表達式。如果您需要xml轉義值,則需要c:out,但由於您似乎控制了id的值,因此這不應該成爲問題。

+0

什麼是el表達式? – Naor 2012-02-29 18:36:31

+0

@Naor:EL =表達式語言,因爲JSP 2.0是JSP標準的一部分,可以直接在頁面中使用,所以可以省略'c:out'並使用'$ {id}'。 – 2012-02-29 19:22:15