当未指定默认命名空间时,函数“”必须与前缀一起使用

时间:2012-02-16 13:51:23

标签: java jsp

我们正在对表单变量进行一些奇怪的处理。无论如何,我已经设法从请求中获取变量,所以我可以做一些数据库的东西。现在我想回发给你,所以选择框可以用原始选项填充。

以下是选择字段的示例:

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>

当我这样做时......我收到了这个错误:

  

当未指定默认命名空间时,函数filterCriteria必须与前缀一起使用

编辑:

    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>

这是什么工作....我再次仔细看了一下表格......取出单引号并使用了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> 

1 个答案:

答案 0 :(得分:5)

为什么你给表单和输入元素这样的无效名称?

无论如何,您的具体问题是您不是要与普通字符串进行比较,而是与EL对象进行比较。就像你现在一样,它期望一个方法${form}的bean filterCriteria(String)返回一个具有getValues()方法的对象。那不是你想要的。你希望它是一个普通的字符串。

修复如下,你需要引用它:

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

但这不会让你达到功能要求。看起来你将Java / JSP与JavaScript混淆并期望它们同步运行。事实并非如此,Java / JSP在Web服务器中运行并生成HTML。 JavaScript是HTML的一部分,仅在webbrowser中运行。 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>中有一个无效值,那些单引号不属于那里,我已将其删除了)


更新:根据评论,您在访问EL中的非法参数名称时似乎有EL语法错误问题。转义字符\似乎被EL解析器完全吞没。您最好的选择可能是<c:set>

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

更新2 :围绕选项值的那些单引号似乎是绝对必要的。在这种情况下,您需要在其上添加另一个别名。完整代码如下所示:

<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>