gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:58:46 25 4
gpt4 key购买 nike

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

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

最佳答案

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

如果你想改变浏览器地址栏的URL,那么你基本上需要改变<form action>指向所需 URL 的 URL(如果不根据某些配置文件操作 ViewHandler,这在标准 JSF 中是不可能的),通过添加 ?faces-redirect=true 在 POST 后发送完整的重定向到结果。

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

重定向基本上指示网络浏览器在给定的 URL 上发送新的 GET 请求,因此地址栏中的 URL 将发生变化。然而,缺点是所有请求作用域的 bean 都会被垃圾化并重新创建(因为重定向是一个请求!),因此您将丢失搜索结果。

我不确定为什么您想要更改 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 命名错误。它不是支持 bean 。它只是一个实体(或 POJO 或 DTO 或任何您想命名的实体)。您的Search类是真正的支持 bean。

关于java - 不重定向到托管 bean 中指定的新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7649861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com