不会重定向到托管bean中指定的新页面

时间:2011-10-04 14:56:33

标签: java jsf jsf-2

我最近开始学习Java EE 6,我可能需要一些帮助。我创建了一个search.xhtml页面,其中包含一个表单,一些字段和一个命令按钮。该操作调用托管bean中的方法并返回一个字符串。但是,浏览器中的url-field不会更新为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 个答案:

答案 0 :(得分:2)

基本上,您在与您正在查看的初始页面相同的<form action> URL上发送POST请求,并在后处理期间告知JSF使用给定的目标页面来显示结果。它使用内部RequestDispatcher#forward()将请求/响应转发到给定目标。这完全发生在服务器端。如果您熟悉基本的Servlet API(JSF在幕后使用),那么您应该了解它的工作原理。

如果您想要更改浏览器地址栏网址,那么您基本上需要将<form action>网址更改为所需的网址(在标准JSF中无法操作,而无需基于ViewHandler进行操作在某些配置文件上),通过在结果中添加?faces-redirect=true来在POST后发送完全重定向。

return "search-results?faces-redirect=true";

重定向基本上指示webbrowser在给定的URL上发送新的GET请求,因此地址栏中的URL将会更改。然而,缺点是所有请求范围的bean都被包含和重新创建(因为重定向是请求!),因此您将丢失搜索结果。

我不确定为什么您希望更改网址,但如果您想将其设为可收藏,则不应使用<h:form>(默认为POST) ,但只是一个普通的HTML <form>(默认为GET),带有纯HTML输入和按钮,并在目标页面中将参数定义为<f:viewParam>,以便JSF将它们设置在与目标关联的bean中页。

E.g。在搜索表单中:

<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错误命名的。它不是支持bean。它只是一个实体(或POJO或DTO或您想要命名的任何东西)。你的Search类是真正的支持bean。