Ответ 1
Ни один из них не является хорошим подходом. Контроллер/бизнес-логика не принадлежит JSP (тегу). Фильтр почти хорош, но он не достаточно конкретный. Эта работа должна выполняться сервлетом. Вы отправляете форму сервлету для постпроцесса, верно? Похоже, что вы еще этого не делаете, ответ в противном случае был бы довольно простым.
В нашей странице wiki-метки сервлетов вы можете найти приветственный пример хорошего подхода к использованию JSP с сервлетом для постпроцесса отправки формы. Здесь выдержка релевантности:
<input id="name" name="name" value="${fn:escapeXml(param.name)}">
<span class="error">${messages.name}</span>
с
String name = request.getParameter("name");
if (name == null || name.trim().isEmpty()) {
messages.put("name", "Please enter name");
}
// ...
request.getRequestDispatcher("/WEB-INF/hello.jsp").forward(request, response);
Кроме того, существуют MVC-рамки, которые удаляют весь код сервлета (дублированный/повторяющийся) для таких видов использования, таких как JSF, Spring MVC, Wicket, Stripes, Struts2 и т.д. Например, JSF он выглядит примерно так:
<h:inputText id="name" value="#{bean.name}" required="true" requiredMessage="Please enter name" />
<h:message for="name" />
Это все. Сервлет контроллера JSF FacesServlet
будет проверять, был ли он заполнен и отобразить (настраиваемое) сообщение в данном месте, без необходимости использования специального кода Java. Вы даже можете перенести его в модель, JSF имеет прозрачную поддержку для проверки JSR303 bean. Например.
<h:inputText id="name" value="#{bean.name}" />
<h:message for="name" />
с
@NotNull(message="Please enter name")
private String name;
Обновить в соответствии с вашими изменениями:
Благодарим вас за хорошие ответы, но мне было интересно, какая будет лучшая практика в случае, если вы предлагаете такую услугу, как API диаграммы Google, где вы не можете ожидать, что параметры будут проверяться формой до того, как они посланы. Пример: https://chart.googleapis.com/chart?cht=&chd=&chs=&...additional_parameters...
Просто используйте сервлет так же. Единственное различие заключается в том, что вы должны выполнить задание в doGet()
вместо doPost()
и при необходимости вернуть HTTP 400 на ошибку:) Еще раз, проверьте наш сервлет тегов wiki страница, чтобы лучше понять их цель. Или, чтобы сделать шаг дальше, вместо этого используйте инфраструктуру webservice, такую как JAX-WS или JAX-RS, которые делают это задание прозрачно, как структура MVC для HTML-страниц.