2012-02-16 40 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> 
相关问题