I usually use ${} everywhere I can. It is simple and straightforward. I use <c:out> when I need additional functions, such as the escapeXml function.
In your example, you can really leave without <c:out> :
<input type="text" name="firstname" value="${param.firstname}"/>
Edit: problems with XSS
My answer is not about the XSS holes mentioned by BalusC and StuartWakefield. Although my answer is simplified, you really should always reduce XSS holes. I prefer to use the OWASP taglib .
<span>${esc:forHtml(sketchyText)}</span> <span><esc:forHtml(sketchyText)/></span> <input value="${esc:forHtmlAttribute(sketchyText)}"/>
RustyTheBoyRobot
source share