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

Java 不重定向到托管bean中指定的新页面,java,jsf,jsf-2,Java,Jsf,Jsf 2,我最近开始学习JavaEE6,我可能需要一些帮助。我制作了一个search.xhtml页面,它有一个表单、一些字段和一个commandbutton。该操作调用托管bean中的方法并返回字符串。但是,浏览器中的url字段不会更新为search-results.xhtml,它是包含结果的另一个页面。它显示search.xhtml页面中的内容(但它似乎从search results.xhtml获得了布局和所有内容) (很简单,现在做的不多) @ManagedBean @请求范围 公共类搜索{ 私有Se

我最近开始学习JavaEE6,我可能需要一些帮助。我制作了一个search.xhtml页面,它有一个表单、一些字段和一个commandbutton。该操作调用托管bean中的方法并返回字符串。但是,浏览器中的url字段不会更新为search-results.xhtml,它是包含结果的另一个页面。它显示search.xhtml页面中的内容(但它似乎从search results.xhtml获得了布局和所有内容)

(很简单,现在做的不多)

@ManagedBean
@请求范围
公共类搜索{
私有SearchBackingBean SearchBackingBean;
私有数组列表;
公开检索(){
searchBackingBean=新的searchBackingBean();
列表=新的ArrayList();
}
公共字符串find(){
返回“搜索结果”;
}
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>




基本上,您在查看初始页面的同一个
URL上发送POST请求,并在后处理过程中告诉JSF使用给定的目标页面来显示结果。它在内部使用将请求/响应转发到给定的目的地。这完全在服务器端进行。如果您是fam使用基本的ServletAPI(JSF在封面下使用),您应该了解它的工作原理

如果希望更改浏览器地址栏URL,则基本上需要将
URL更改为所需的URL(在标准JSF中,如果不根据某些配置文件操作
ViewHandler
,这是不可能的),或在POST后通过向结果中添加
?faces redirect=true
来发送完全值得的重定向

return "search-results?faces-redirect=true";
重定向基本上指示webbrowser在给定的URL上发送一个新的GET请求,因此地址栏中的URL将更改。然而,缺点是,所有请求范围的bean都被丢弃并重新创建(因为重定向是一个新的请求!),因此您将丢失搜索结果

我不知道你为什么要更改URL,但是如果你想让它成为书签,那么你不应该使用
(默认为POST),而应该使用普通的HTML
(默认为GET)使用纯HTML输入和按钮,并在目标页面中将参数定义为
,以便JSF在与目标页面关联的bean中设置它们

例如,在搜索表单中:


在结果页面中:


(顺便说一下,我更喜欢将它们组合在一个页面中,并使用
rendered
属性有条件地呈现结果)


请注意,您的
SearchBackingBean
的名称是错误的。它不是一个支持bean。它只是一个实体(或POJO或DTO或您想命名的任何名称)。你的
搜索
类才是真正的支持bean。

@BalcusC:谢谢你的回答!我问的原因是我认为它实际上应该更改浏览器中的url。不过我不需要更改浏览器中的url。我今天开始阅读JSF部分,但我会记住渲染!不客气。就像你一样您是JSF新手,您可能会发现这两篇文章对学习“最佳实践”和“技巧”也很有帮助:和。
return "search-results?faces-redirect=true";