Не перенаправляет на новую страницу, указанную в управляемом компоненте - PullRequest
1 голос
/ 04 октября 2011

Я недавно начал изучать Java EE 6, и мне может понадобиться помощь. Я сделал страницу search.xhtml, которая имеет форму, несколько полей и командную кнопку. Действие вызывает метод в управляемом компоненте и возвращает строку. Однако поле URL в браузере не обновляется до search-results.xhtml, который является другой страницей с результатами. Он показывает контент внутри страницы search.xhtml (но похоже, что он получает макет и все это из search-results.xhtml).

(это очень просто, сейчас мало что делается)

@ManagedBean
@RequestScoped
public class Search {

private SearchBackingBean searchBackingBean;
private ArrayList<String> list;

public Search() {
    searchBackingBean = new SearchBackingBean();
    list = new ArrayList<String>();
}

public String find() {
    return "search-results";
}

search.xhtml

<h:form>

    <h:inputText value="#{search.searchBackingBean.query}" 
                 size="60"
                 required="true"
                 requiredMessage="Please enter what you want to search for." />
    <h:commandButton value="Find" action="#{search.find}" /><br />

    <h:outputText value="Search criterias to be included in your search." /><br />
</h:form>

1 Ответ

2 голосов
/ 04 октября 2011

По сути, вы отправляете запрос 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 класс - настоящий боб поддержки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...