Лично я почти всегда помещаю свои «критерии поиска» и «показ результатов» в один и тот же сервлет или файл JSP. Я пишу их с этой базовой структурой:
if request data is present
collect search criteria from request object
check for errors
else // i.e. first time in
fill search criteria with blanks or defaults
end if
display error messages // if any, of course
display search criteria // either what we got from last cycle or defaults
if request data was present
process request
display results
end if
Мне нравится эта структура, потому что в случае ошибки я настроен на отображение неверных данных, позволяю пользователю исправить то, что было не так, и затем возвращаюсь назад. В случае успеха я собираюсь позволить ему скорректировать критерии и провести повторный запуск. Все в одном месте, но оно структурировано, так что это не беспорядок.
Когда это зависит от меня, я редко использую сервлеты: я предпочитаю использовать JSP для верхнего уровня и помещать нетривиальный не отображаемый код в другие классы, которые я просто вызываю, но это деталь реализации. Принцип работает как с сервлетами, так и с JSP.