如何将变量的值从jsf的bean页面(即bean.java)移动到另一个java类?当我试图这样做时,第二个java类中的变量值为NULL。,
我使用了primefaces UI框架(类似于jsf)并将每个字段值分配给bean类。分配给bean类中每个变量的值是正确的。但是当我试图将这些值移动到另一个.java文件时。变量的范围死亡,值为NULL。查看我的编码..
LOGIN.XHTML
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head></h:head>
<h:body>
<p:panel header="Login" style="">
<h:form>
<h:panelGrid columns="2" cellpadding="2">
<h:outputText value="Username"></h:outputText>
<p:inputText id="userName" value="#{loginBean.userName}"></p:inputText>
<h:outputText value="Password"></h:outputText>
<p:password id="password" value="#{loginBean.password}"></p:password>
<p:commandButton value="Sign in" ajax="false" actionListener="#{loginBean.forward}"></p:commandButton>
</h:panelGrid>
</h:form>
</p:panel>
</h:body>
</html>
loginBean.java
package bean;
import receive.*;
public class loginBean {
public String userName;
public String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void forward()
{
System.out.println(getUserName());
receiveclass r=new receiveclass();
r.dbc();
}
}
receiveclass.java
package receive;
import bean.loginBean;
public class receiveclass {
loginBean lb=new loginBean();
public void dbc()
{
String s= lb.getUserName();
String p=lb.getPassword();
System.out.println(s);
System.out.println(p);
//System.out.println("hi");
}
}
输出是,
如果我以管理员身份提供,管理员在文本字段中
我收到的是
管理 空值 空
答案 0 :(得分:1)
您手动创建bean而不是让JSF管理bean。 JSF根本不会使用手动创建的bean。您需要让JSF自动创建和管理这些bean。您可以通过将其注入@ManagedProperty
来访问其他JSF托管bean:
在您的特定情况下,以下内容应该有效:
@ManagedBean
@RequestScoped
public class LoginBean {
private String userName;
private String password;
@ManagedProperty
private ReceiveClass receiveClass;
public void forward() {
receiveClass.dbc(this);
}
// Add/generate getters and setters.
}
与
@ManagedBean
@SessionScoped
public class ReceiveClass {
public void dbc(LoginBean loginBean) {
System.out.println(loginBean.getUserName());
}
}
(请注意,我已修复代码以正确遵守Java Naming Conventions。类名称应以大写字母开头)
答案 1 :(得分:0)
在您的接收类中,您创建了一个全新的loginBean实例。值只能为空。
我是这样做的:我创建了一个Java类,其中我有像这样的静态函数
public class JSFHelper
{
public static Object getMyObject(String objname, Class<?> classname )
{
FacesContext fCtx = FacesContext.getCurrentInstance();
ELContext elCtx = fCtx.getELContext();
ExpressionFactory ef = fCtx.getApplication().getExpressionFactory();
ValueExpression ve =
ef.createValueExpression(elCtx, "#{" + objname+ "}",classname);
return (Object) ve.getValue(elCtx);
}
}
如果我需要来自另一个Bean的值,它将在你的接收类中看起来像这样:
public class receiveclass
{
public void dbc()
{
loginBean lb=(loginBean)JSFHelper.getMyObject("loginBean",loginBean.class);
String s= lb.getUserName();
String p=lb.getPassword();
System.out.println(s);
System.out.println(p);
//System.out.println("hi");
}
}