2012-02-16 76 views
5

我們正在對錶單變量進行一些奇怪的處理。無論如何,我設法從請求中獲取變量,所以我可以做一些數據庫的東西。現在我想回發到,所以選擇框可以填充原始選擇。當沒有指定默認名稱空間時,函數「」必須與前綴一起使用

這裏是一個選擇欄的一個例子:

JSP:

Condition Code:  
<select size="1" name="filterCriteria('CONDITION_CODE').values"> 
    <option value="">&nbsp;</option> 
    <c:forEach var="bean" items="${conditions}"> 
    <option value="'${bean.code}'"<c:if test="${bean.code == form.filterCriteria('CONDITION_CODE').values}"> selected="selected"</c:if>>${bean.code}:&nbsp;${bean.description}</option> 
    </c:forEach> 
</select> 
<input type="hidden" name="filterCriteria('CONDITION_CODE').fieldName" value="CONDITION_CODE"/> 
<input type="hidden" name="filterCriteria('CONDITION_CODE').operation" value="="/> 

正如你所看到的名稱是形式的函數:name="filterCriteria('CONDITION_CODE').values

這裏是形式:

private String[] fieldNames; 

private Map<String, FilterCriteriaForm> filters = 
    new HashMap<String, FilterCriteriaForm>(); 




public String[] getFieldNames() { return this.fieldNames; } 
    public Map<String, FilterCriteriaForm> getFilters() { return this.filters; } 



    public FilterCriteriaForm getFilterCriteria(String fieldName) 
    throws ServletException 
{ 
    FilterCriteriaForm filter = (FilterCriteriaForm)filters.get(fieldName); 

    if (filter == null) 
    { 
     filter = new DetFilterCriteriaForm(requestAction); 
     filters.put(fieldName, filter); 
    } 

    return filter; 
} 


    public void setFilters(Map<String, FilterCriteriaForm> val) { this.filters = val; } 
    } 

無論如何,通常我在jsp上做這樣的事情來設置字段回是什麼形式:"<c:if test="${bean.code == form.filterCriteria('CONDITION_CODE').values}"> selected="selected"</c:if>

當我做到這一點...我得到這個錯誤:

The function filterCriteria must be used with a prefix when a default namespace is not specified

編輯:

Condition Code:&nbsp;<select size="1" name="filterCriteria('CONDITION_CODE').values"> 
       <c:set var="condition" value="filterCriteria('CONDITION_CODE').values" /> 
         <option value="">&nbsp;</option> 
         <c:forEach var="bean" items="${conditions}"> 
         <option value="'${bean.code}'" <c:if test="${bean.code == param[condition]}">selected="selected"</c:if>>${bean.code}:&nbsp;${bean.description}</option> 
         </c:forEach> 
         </select> 
         <input type="hidden" name="filterCriteria('CONDITION_CODE').fieldName" value="CONDITION_CODE"/> 
         <input type="hidden" name="filterCriteria('CONDITION_CODE').operation" value="="/> 
         <br/></br> 

THIS IS什麼工作....我再次仔細觀察窗體...取出單引號並使用getFilters():

<select size="1" name="filterCriteria(CONDITION_CODE).values"> 
      <option value="">&nbsp;</option> 
       <c:forEach var="bean" items="${conditions}">  
       <c:set var="code" value="'${bean.code}'" />  
       <option value="${code}" <c:if test='${code == form.filters["CONDITION_CODE"].values[0]}'>selected="selected"</c:if>>${bean.code}:&nbsp;${bean.description}</option> 
       </c:forEach> 
       </select> 

回答

5

爲什麼要給你的fo RM和輸入元素這樣的無效名稱?

無論如何,你的混凝土問題是你沒有比較一個普通的字符串,而是一個EL對象。正如你現在所期待的那樣,它期望使用方法filterCriteria(String)的方法${form},該方法返回一個具有getValues()方法的對象。這不是你想要的。你希望它是一個普通的字符串。

修復它,如下所示,你需要引用它:

<c:if test="${bean.code == 'form.filterCriteria(\'CONDITION_CODE\').values'}"> 

但是,這不會讓你達到功能要求。它看起來像是讓Java/JSP與JavaScript混淆並期望它們同步運行。這不是真的,Java/JSP在web服務器上運行並生成HTML。 JavaScript是HTML的一部分,只能在web瀏覽器中運行。 form變量僅適用於JavaScript,不適用於JSTL標籤。

實際上需要通過${param}獲取提交的值作爲請求參數。所有輸入元素的值都可以通過請求參數映射中的名稱獲取。它看起來像如下:帶有無效字符

<c:if test="${bean.code == param['filterCriteria(\'CONDITION_CODE\').values']}"> 

我只是不保證,如果這樣做的工作,我從來沒有使用過的名字,你也許需要URL編碼奇怪的字符。如果您爲表單和輸入元素輸入一個符合HTML specification規則的有效名稱,那將更容易。

<select name="condition"> 
    <option value="">&nbsp;</option> 
    <c:forEach items="${conditions}" var="condition"> 
    <option value="${condition.code}" ${condition.code == param.condition ? 'selected' : ''}>${condition.code}:&nbsp;${condition.description}</option> 
    </c:forEach> 
</select> 

(請注意,您在<option value>有一個無效的值,這些singlequotes不屬於那裏,我已經刪除它們)


更新:根據意見,在訪問EL中的非法參數名稱時,您似乎遇到EL語法錯誤問題。轉義字符\似乎完全被EL分析器吞噬。最好的辦法是可能與<c:set>別名它:

<c:set var="condition" value="filterCriteria('CONDITION_CODE').values" /> 
... 
<c:if test="${bean.code == param[condition]}"> 

更新2:周圍的期權價值的singlequotes似乎是絕對必要的。在這種情況下,您需要在其上添加另一個別名。完整的代碼如下所示:

<select size="1" name="filterCriteria('CONDITION_CODE').values"> 
    <c:set var="condition" value="filterCriteria('CONDITION_CODE').values" /> 
    <option value="">&nbsp;</option> 
    <c:forEach var="bean" items="${conditions}"> 
    <c:set var="code" value="'${bean.code}'" /> 
    <option value="${code}" <c:if test="${code == param[condition]}">selected="selected"</c:if>>${bean.code}:&nbsp;${bean.description}</option> 
    </c:forEach> 
</select> 
相關問題