我们正在对表单变量进行一些奇怪的处理。无论如何,我已经设法从请求中获取变量,因此我可以做一些数据库工作。现在,我想回发自,以便可以使用原始选择填充选择框。
这是一个选择字段的示例:
JSP:
Condition Code: <select size="1" name="filterCriteria('CONDITION_CODE').values"> <option value=""> </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}: ${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
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>
"<c:if test="${bean.code == form.filterCriteria('CONDITION_CODE').values}"> selected="selected"</c:if>
当我这样做时…我得到这个错误:
未指定默认名称空间时,必须将函数filterCriteria与前缀一起使用
编辑:
Condition Code: <select size="1" name="filterCriteria('CONDITION_CODE').values"> <c:set var="condition" value="filterCriteria('CONDITION_CODE').values" /> <option value=""> </option> <c:forEach var="bean" items="${conditions}"> <option value="'${bean.code}'" <c:if test="${bean.code == param[condition]}">selected="selected"</c:if>>${bean.code}: ${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=""> </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}: ${bean.description}</option> </c:forEach> </select>
为什么要给表单和输入元素这样的无效名称?
无论如何,您的 具体 问题是您不是在与普通字符串进行比较,而是与EL对象进行比较。如您现在所见,它期望一个${form}带有方法的bean ,该方法filterCriteria(String)返回某个具有getValues()方法的对象。那不是你想要的。您希望它是一个纯字符串。
${form}
filterCriteria(String)
getValues()
对其进行修复,如下所示,您需要引用它:
<c:if test="${bean.code == 'form.filterCriteria(\'CONDITION_CODE\').values'}">
但这不能满足您的功能要求。您似乎在将Java / JSP与JavaScript混淆,并期望它们同步运行。事实并非如此,Java / JSP在Web服务器中运行并生成HTML。JavaScript是HTML的一部分,并且仅在Web浏览器中运行。该form变量仅在JavaScript中可用,而在JSTL标记中不可用。
form
您 实际上 需要通过来获取提交的值作为请求参数${param}。所有输入元素的值都可以通过其名称在请求参数映射中获得。它看起来像如下:
${param}
<c:if test="${bean.code == param['filterCriteria(\'CONDITION_CODE\').values']}">
我只是不保证这样做是否可行,我从未使用过带有无效字符的名称,您可能需要对奇数字符进行URL编码。如果给表单和输入元素一个有效的名称,该名称与HTML规范中的规则相匹配,则容易得多。
<select name="condition"> <option value=""> </option> <c:forEach items="${conditions}" var="condition"> <option value="${condition.code}" ${condition.code == param.condition ? 'selected' : ''}>${condition.code}: ${condition.description}</option> </c:forEach> </select>
(请注意,您在中的值无效<option value>,那些单引号不属于该值,我已将其删除)
<option value>
更新 :根据注释,访问EL中的非法参数名称时,您似乎遇到EL语法错误问题。逃逸字符\似乎被EL解析器完全吞噬了。最好的选择可能是使用<c:set>:
\
<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=""> </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}: ${bean.description}</option> </c:forEach> </select>