我该如何在将表单提交到Servlet后,在JSP中保留HTML表单字段的值?

7
在HTML表单中提交数据后,servlet将这些数据添加到我的数据库中,并向JSP页面转发结果消息。我想在转发后保留表单中最初提交的值。
是否明智在servlet中创建一个对象,将我收到的所有参数添加到其中,并使用请求将其发送到JSP?是否有其他更好的方法?
2个回答

14

您可以通过${param}访问单值请求参数。

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
...
<input name="foo" value="${fn:escapeXml(param.foo)}">
<textarea name="bar">${fn:escapeXml(param.bar)}</textarea>
...
<input type="radio" name="faz" value="a" ${param.faz == 'a' ? 'checked' : ''} />
<input type="radio" name="faz" value="b" ${param.faz == 'b' ? 'checked' : ''} />
<input type="radio" name="faz" value="c" ${param.faz == 'c' ? 'checked' : ''} />
...
<select name="baz">
    <option value="a" ${param.baz == 'a' ? 'selected' : ''}>label a</option>
    <option value="b" ${param.baz == 'b' ? 'selected' : ''}>label b</option>
    <option value="c" ${param.baz == 'c' ? 'selected' : ''}>label c</option>
</select>

需要注意的是,为了防止 XSS 攻击,JSTL 的 fn:escapeXml() 是必要的。详见JSP/Servlet Web 应用中的 XSS 预防

你可以通过 ${paramValues} 和 EL 3.0 流来访问多值请求参数。

<input type="checkbox" name="far" value="a" ${paramValues.far.stream().anyMatch(v->v == 'a').get() ? 'checked' : ''} />
<input type="checkbox" name="far" value="b" ${paramValues.far.stream().anyMatch(v->v == 'b').get() ? 'checked' : ''} />
<input type="checkbox" name="far" value="c" ${paramValues.far.stream().anyMatch(v->v == 'c').get() ? 'checked' : ''} />
...
<select name="boo" multiple>
    <option value="a" ${paramValues.boo.stream().anyMatch(v->v == 'a').get() ? 'selected' : ''}>label a</option>
    <option value="b" ${paramValues.boo.stream().anyMatch(v->v == 'b').get() ? 'selected' : ''}>label b</option>
    <option value="c" ${paramValues.boo.stream().anyMatch(v->v == 'c').get() ? 'selected' : ''}>label c</option>
</select>

有条件地渲染“checked”。例如${param.foo == 'E' ? 'checked' : ''}。我更新了答案并添加了更多示例。 - BalusC
2
在请求处理期间清理XSS会在长期内造成麻烦,因为这不是正常的做法。应用程序和数据的可维护性、可重用性和可移植性将因此受到影响。只有在响应处理期间才能进行。当我说“在重新显示用户控制的输入”时,我指的是直接在JSP中进行,就像我的答案所示。如果您坚持可以采取不同的方法,我只是警告未来可能会后悔和浪费时间。 - BalusC
2
脚本不会在数据库中执行。这绝对没有任何影响。这是完全正常的。当要在HTML中重新显示时,escapeXml()将对它们进行转义。删除它并重新测试。您会发现脚本将被执行。 - BalusC
喜欢“stream”方法在多选框场景中的简单性,但是是否有EL 2.2等效版本?我所在的服务器使用的是servlet版本3.0而不是3.1。 - AlexM
@Aender:很遗憾,不行。你最好使用一个EL函数 - BalusC
显示剩余5条评论

3

对于选择语句,您可以使用JavaScript。

document.getElementById('baz').value = '${param.baz}';


超级答案。非常容易。 - Veerendar Chary Munigadapa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接