我在index.xhtml上,我有这段代码:
<h:form>
<h:commandButton action="#{blogentryListerBean.olderBlogEntries}"
value="Older Blog Entries"/>
</h:form>
BlogEntryListerBean是 RequestScoped 。这是我在 olderBlogEntries
中的代码public String olderBlogEntries() {
HttpServletRequest request
= (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
String id = request.getParameter("id");
if (id == null || id.equals("")) {
id = "0";
}
int pageIamOn = Integer.valueOf(id);
String stringToBeReturned = "index.xhtml?id=" + (pageIamOn + 1) + "&faces-redirect=true";
return stringToBeReturned;
}
所以当我第一次点击index.xhtml时,我看到的URL是:index.xhtml,如预期的那样。 我第一次点击“较旧的博客条目”按钮,我看到URL:index.xhtml?id = 1 现在,当我点击旧版博客条目按钮时,我再次登录index.xhtml?id = 1
这里有什么问题?我为什么不去index.xhtml?id = 2
感谢。
答案 0 :(得分:3)
你实际上误解了当前的Http生命周期。您的问题基本上是目标页面(对于您的情况 index.xhtml 本身)没有在任何地方捕获已发送的参数。
请记住,您首先要执行重定向,但是当您下次按下按钮时,它当前是另一个对您的参数一无所知的不同请求,因此,当处理操作时,您的request.getParameter("id")
会返回{ {1}}一次又一次,因为没有发送参数。
您的问题有一个简单的解决方案,它基于使用null
将收到的参数绑定到您的视图:
f:viewParam
你的java代码就像这样:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<f:metadata>
<f:viewParam name="id" />
</f:metadata>
</h:head>
<h:body>
<h:form>
<h:commandButton action="#{bean.olderBlogEntries(id)}"
value="Older Blog Entries" />
</h:form>
</h:body>
</html>
在这种情况下,您需要将参数传递给action方法,以便在类路径中使用EL 2.2。如果您尚未设置,请按that steps。
生命周期应该是:
@ManagedBean
@RequestScoped
public class Bean {
public String olderBlogEntries(Integer id) {
if (id == null) {
id = 0;
}
String stringToBeReturned = "index.xhtml?id=" + (id + 1)
+ "&faces-redirect=true";
return stringToBeReturned;
}
}
,这会导致客户端对此URL执行GET请求。现在,JSF捕获http://localhost:8080/basic-jsf/index.xhtml?id=1
视图参数,并将其绑定到名为id
的视图。id
。重定向现在转到1
。或者,您可以将视图参数绑定到bean属性。在这种情况下,不需要将其作为方法参数传递:
http://localhost:8080/basic-jsf/index.xhtml?id=2
实现属性的get / set方法:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<f:metadata>
<f:viewParam name="id" value="#{bean.id}" />
</f:metadata>
</h:head>
<h:body>
<h:form>
<h:commandButton action="#{bean.olderBlogEntries}"
value="Older Blog Entries" />
</h:form>
</h:body>
</html>
另见: