【问题标题】:Does not redirect to new page specified in the managed bean不重定向到托管 bean 中指定的新页面
【发布时间】:2011-10-04 14:56:32
【问题描述】:

我最近开始学习 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";
}

搜索.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>

【问题讨论】:

    标签: java jsf jsf-2


    【解决方案1】:

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

    如果您想更改浏览器地址栏 URL,那么您基本上需要将 &lt;form action&gt; URL 更改为所需的 URL(如果不根据某些配置文件操作 ViewHandler,这在标准 JSF 中是不可能的),通过在结果中添加?faces-redirect=true来在POST之后发送一个完整的重定向。

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

    重定向基本上指示网络浏览器在给定的 URL 上发送一个新的 GET 请求,因此地址栏中的 URL 会改变。但是,缺点是所有请求范围的 bean 都被丢弃并重新创建(因为重定向是 new 请求!),因此您将丢失搜索结果。

    我不确定为什么您想要更改 URL,但是如果您想让它成为书签,那么您不应该使用 &lt;h:form&gt;(默认为 POST),但是只是一个带有纯 HTML 输入和按钮的纯 HTML &lt;form&gt;(默认为 GET),并在目标页面中将参数定义为 &lt;f:viewParam&gt;,以便 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 类是真正的支持 bean。

    【讨论】:

    • @BalcusC:感谢您的回复!我问的原因是我认为它实际上应该更改浏览器中的 url。不过,我不需要更改浏览器中的 url。我今天开始阅读 JSF 部分,但我会牢记渲染!
    • 不客气。由于您是 JSF 新手,您可能会发现这两篇文章对了解“最佳实践”和“提示和技巧”也很有帮助:JSF 2.0 tutorialCommunication in JSF 2.0
    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2014-04-01
    • 2021-07-02
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多