You could access single-value request parameters by ${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 eq 'a' ? 'checked' : ''} />
<input type="radio" name="faz" value="b" ${param.faz eq 'b' ? 'checked' : ''} />
<input type="radio" name="faz" value="c" ${param.faz eq 'c' ? 'checked' : ''} />
...
<select name="baz">
<option value="a" ${param.baz eq 'a' ? 'selected' : ''}>label a</option>
<option value="b" ${param.baz eq 'b' ? 'selected' : ''}>label b</option>
<option value="c" ${param.baz eq 'c' ? 'selected' : ''}>label c</option>
</select>
Do note that JSTL's fn:escapeXml()
is necessary in order to prevent XSS attacks. See also XSS prevention in JSP/Servlet web application.
You could access multi-value request parameters by ${paramValues}
and EL 3.0 streams.
<input type="checkbox" name="far" value="a" ${paramValues.far.stream().anyMatch(v -> v eq 'a').get() ? 'checked' : ''} />
<input type="checkbox" name="far" value="b" ${paramValues.far.stream().anyMatch(v -> v eq 'b').get() ? 'checked' : ''} />
<input type="checkbox" name="far" value="c" ${paramValues.far.stream().anyMatch(v -> v eq 'c').get() ? 'checked' : ''} />
...
<select name="boo" multiple>
<option value="a" ${paramValues.boo.stream().anyMatch(v -> v eq 'a').get() ? 'selected' : ''}>label a</option>
<option value="b" ${paramValues.boo.stream().anyMatch(v -> v eq 'b').get() ? 'selected' : ''}>label b</option>
<option value="c" ${paramValues.boo.stream().anyMatch(v -> v eq 'c').get() ? 'selected' : ''}>label c</option>
</select>
The alternative to this all is to submit form by Ajax and then update for example only the validation messages. Start here: How should I use servlets and Ajax?