我们正在对表单变量进行一些奇怪的处理.无论如何,我已经设法从请求中获取变量,所以我可以做一些数据库的东西.现在我想回发自,因此选择框可以填充原始选择.
以下是选择字段的示例:
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="="/>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,名称是表单中的函数: 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; }
}
Run Code Online (Sandbox Code Playgroud)
无论如何,通常我会在jsp上做类似的事情,将字段设置回形式: "<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>
Run Code Online (Sandbox Code Playgroud)
这是什么工作......我再次仔细看了一下这个表格......拿出单引号并使用了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>
Run Code Online (Sandbox Code Playgroud)
为什么你给你的表单和输入元素这样的无效名称?
无论如何,你的具体问题是你没有比较普通的字符串,而是比较EL对象.就像你现在一样,它期望一个${form}带有方法的bean filterCriteria(String)返回一个有方法的对象getValues().那不是你想要的.你希望它是一个普通的字符串.
修复如下,你需要引用它:
<c:if test="${bean.code == 'form.filterCriteria(\'CONDITION_CODE\').values'}">
Run Code Online (Sandbox Code Playgroud)
但这不会让你实现功能要求.看起来你将Java/JSP与JavaScript混淆并期望它们同步运行.事实并非如此,Java/JSP在Web服务器中运行并生成HTML.JavaScript是HTML的一部分,仅在webbrowser中运行.该form变量仅在JavaScript中可用,而不在JSTL标记中.
实际上,您需要将提交的值作为请求参数获取${param}.所有输入元素的值都可以通过请求参数映射中的名称获得.它看起来如下:
<c:if test="${bean.code == param['filterCriteria(\'CONDITION_CODE\').values']}">
Run Code Online (Sandbox Code Playgroud)
我只是不保证如果这样可行,我从未使用过无效字符的名字,你可能需要对奇数字符进行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>
Run Code Online (Sandbox Code Playgroud)
(注意你有一个无效的值<option value>,那些单引号不属于那里,我已经删除了它们)
更新:根据注释,您在访问EL中的非法参数名称时似乎有EL语法错误问题.转义字符\似乎被EL解析器完全吞噬.你最好的选择可能是用它来代替它<c:set>:
<c:set var="condition" value="filterCriteria('CONDITION_CODE').values" />
...
<c:if test="${bean.code == param[condition]}">
Run Code Online (Sandbox Code Playgroud)
更新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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30839 次 |
| 最近记录: |