По сути, вы отправляете запрос POST по тому же URL-адресу <form action>
, что и исходная просматриваемая страница, и во время постобработки говорите JSF использовать данную целевую страницу для отображения результатов.Он использует внутренне RequestDispatcher#forward()
для пересылки запроса / ответа указанному адресату.Это происходит полностью на стороне сервера.Если вы знакомы с базовым Servlet API (который JSF использует под прикрытием), то вы должны понимать, как он работает.
Если вы хотите изменить URL-адрес в адресной строке браузера, то вам, по сути, нужно изменить<form action>
URL-адрес нужного URL-адреса (что невозможно в стандартном JSF без манипулирования ViewHandler
на основе какого-либо файла конфигурации), или для отправки полного перенаправления после POST путем добавления ?faces-redirect=true
к результату.
return "search-results?faces-redirect=true";
Перенаправление в основном предписывает веб-браузеру отправлять новый GET-запрос по указанному URL, поэтому URL-адрес в адресной строке изменится.Недостаток, однако, заключается в том, что все bean-объекты области запроса обрабатываются и воссоздаются (потому что перенаправление - это новый запрос!), И поэтому вы потеряете результаты поиска.
I'mне уверен, почему вы хотите изменить URL, но если вы хотите сделать его закладкой, вам не следует использовать <h:form>
(по умолчанию POST), а просто обычный HTML <form>
(по умолчанию это GET) с простыми HTML-входами и кнопкой и определите параметры как <f:viewParam>
на целевой странице, чтобы JSF установил их в bean-компоненте, связанном с целевой страницей.
Например, в форме поиска:
<form action="search-results.xhtml">
<input name="query" size="60" />
<input type="submit" value="Find" />
</form>
и на странице результатов:
<f:metadata>
<f:viewParam name="query" value="#{search.query}" required="true" requiredMessage="Please enter what you want to search for." />
<f:event type="preRenderView" listener="#{search.find}" />
<f:metadata>
(кстати, я бы предпочел объединить их на одной странице и сделать результаты условно, используяrendered
атрибут)
Обратите внимание, что ваш SearchBackingBean
имеет неправильное имя IMO.Это не боб.Это просто сущность (или POJO, или DTO, или как вы хотите это назвать).Ваш Search
класс - настоящий боб поддержки.