编辑4
我想做的是实现forgotPassword页面。出于示例目的,我采取了以下示例,但这不是真正的用户相关问题,我将在会话范围内保留用户名。index.xhtml
将是我将在其中输入用户名的忘记密码页面。输入用户名后,我将单击Welcome Me - Action
,然后在chkMe()
中,我将检查该用户并在其电子邮件ID和welcome.xhtml中发送新密码,我会说Hi User ABC, we have sent new password at [email protected]
。
主要职位
我试图用两种情况将数据从一个bean打印到另一个。下面是我的代码。
index.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>JSF 2.0 Hello World</title>
</h:head>
<h:body>
<h3>JSF 2.0 Hello World Example - hello.xhtml</h3>
<h:form>
<h:inputText value="#{helloBean.name}"></h:inputText>
<h:commandButton value="Welcome Me - Plain" action="welcome"></h:commandButton>
<h:commandButton value="Welcome Me - Action" action="#{helloBean.chkMe()}"></h:commandButton>
</h:form>
</h:body>
</html>
welcome.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>JSF 2.0 Hello World</title>
</h:head>
<h:body bgcolor="white">
<h3>JSF 2.0 Hello World Example - welcome.xhtml</h3>
<h4>Welcome --#{helloBean.name}--</h4>
</h:body>
</html>
HelloBean.java
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.io.Serializable;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped
public class HelloBean implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String chkMe() {
return takeMeToAnotherPage("welcome");
}
public String takeMeToAnotherPage(String linkToGo) {
return linkToGo + "?faces-redirect=true";
}
}
当我在文本字段中输入
Checking
作为文本并单击按钮Welcome Me - Plain
时,我在welcome.xhtml中将文本视为Welcome --Checking--
文本,但是当我单击Welcome Me - Action
时,我看不到任何文本(我看到为Welcome ----
)我不知道为什么会这样。
任何想法/建议为什么会这样。
编辑1
我相信这都是由于
?faces-redirect=true
引起的,但是我必须使用它,就像我不使用?faces-redirect=true
一样,地址栏中的URL是以前的URL。例如如果我在page1.xhtml上,然后转到page2.xhtml,则URL仍会显示page1.xhtml。
因此,不确定在这种情况下该怎么办。
编辑2
好吧,我真正想要做的是forgotPassword页面,我将在index.xhtml中输入用户名(考虑上述示例),如果该用户名正确,则在welcome.xhtml上将显示
Hi User ABC, Please use new password for next login. We have sent you email at [email protected]
。RequestScope运行正常,但问题出在URL地址,因此我添加了
?faces-redirect=true
。但是由于其重定向,http会话正在关闭,因此在welcome.xhtml上,我没有任何价值(上面发生的事情)。skuntsel
的另一种解决方案是使用FlashScope,但是再次出现问题是,当我刷新welcome.xhtml时,数据消失了,这使我发疯。谁能建议需要做什么?
编辑3
会话范围中的问题如下。
考虑我打开两个选项卡,在两个选项卡上都有index.xhtml。在tab1上,输入
Fahim
并单击Welcome Me - Action
。在tab1上,welcome.xhtml出现了,我看到的文字为Welcome Fahim
。太棒了。现在,我进入tab2,并输入名称为
XYZ
,然后单击Welcome Me - Action
,我得到welcome.xhtml,并且文本显示为Welcome XYZ
。这也是完美的。问题是当我回到tab1并刷新页面时。刷新tab1(welcome.xhtml)时,我看到
Welcome XYZ
错了,因为它早先是Welcome Fahim
,应该是Welcome Fahim
。 最佳答案
在我看来,在会话范围内使用当前用户是一个好主意。
不过,如果不合适,我可以提供更多选择。
传递用户名作为视图参数
转化为
<h:form>
<h:inputText value="#{helloBean.name}"/>
<h:commandButton value="Welcome Me - Action" action="#{helloBean.chkMe}"/>
</h:form>
和
public String chkMe() {
return takeMeToAnotherPage("welcome");
}
public String takeMeToAnotherPage(String linkToGo) {
return linkToGo + "?faces-redirect=true&username=" + name;
}
和
welcome.xhtml
中的其他视图参数<f:metadata>
<f:viewParam name="username"/>
</f:metadata>
另一个选择是及时实例化另一个请求范围的Bean并将信息传递给它
<h:form>
<h:inputText value="#{helloBean.name}"/>
<h:commandButton value="Welcome Me - Plain" action="welcome">
<f:setPropertyActionListener value="#{helloBean.name}" target="#{welcomePageBean.username}"/>
</h:commandButton>
</h:form>
与
@ManagedBean
@RequestScoped
WelcomePageBean {
private String username;//+getter + setter
//other fields associated with the welcome view
}
使用Flash对象
详细信息输入视图(片段),
base.xhtml
:<h:form>
<h:outputText value="Enter user name for password reset: " />
<h:inputText value="#{flash.username}" />
<br/>
<h:commandButton value="Send me a confirmation email" action="#{forgotBean.changePassword}" />
<h:form>
ForgotBean
的base.xhtml
:@ManagedBean
@RequestScoped
public class ForgotBean {
public ForgotBean() { }
public String changePassword() {
//check user constraints and return failure outcome in case somthing is wrong
//generate new password and persist it to the database
//send a configmation e-mail
return "successful-reset?faces-redirect=true";
}
}
成功视图(片段),
successful-reset.xhtml
:<h:outputText value="Password was reset for user #{receptorBean.username}, e-mail configmation sent." />
<br/>
<h:link value="View homepage" outcome="home" />
ReceptorBean
的successful-reset.xhtml
:@ManagedBean
@RequestScoped
public class ReceptorBean {
@ManagedProperty("#{flash}")
private Flash flash;
private String username;
public ReceptorBean() { }
public String getUsername() {
if(username == null) {
String uname = (String)flash.get("username");
flash.keep("inputText");
username= uname;
}
return username;
}
public Flash getFlash() {
return flash;
}
public void setFlash(Flash flash) {
this.flash = flash;
}
}
关于java - 在另一个页面中打印Bean数据(RequestScope),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15037870/