为什么在 jsf 中从 bean 转到 .xhtml 页面时我的对象变为空
Why does my Object become null when going from bean to .xhtml page in jsf
我正在使用 primfaces 构建一个 JSF 2.0 应用程序。我有一个托管 bean,它有几个针对不同场景的对象。
在应用程序的这个特定部分,我从数据 table/form 移动到具有标识号的托管 bean。
我从数据库中提取信息,甚至将其保存在日志中。然而,当我到达
JSF xhtml 页面对象值为空,我似乎无法弄清楚为什么,任何帮助都会很棒,因为我没有收到任何错误,
日志中的异常或警告,所有信息似乎都指向加载数据,包括日志。
我来自的 JSF 页面... jobs.xhtml(我正在使用 jsf 2.2 和 primefaces 构建此应用程序)从该页面
link 指定要检索的作业编号,下一个 bean 将根据作业编号检索该作业,我只需要一个按钮
这将带您进入主要方法并将信息带到下一页...
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<body>
<div style="margin-bottom:350px;">
<p:column>
<h:form>
<h:commandButton id="editProject" action="#{editProjects.getProjectForm()}" value="Edit" />
</h:form>
</p:column>
</div>
</body>
</html>
EditProjects.java editMailerJob.xhtml 的支持 bean,它将接收媒体 ID 和将使用媒体 ID 的作业编号
将应用程序定向到下一页,职位编号将用于检索特定职位
::::已更新::::
package beans;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.RossProjectManagement.rpm.objects.MailerProject;
@ManagedBean
@RequestScoped
public class EditProjects implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6680733133634363295L;
private final Log LOG = LogFactory.getLog(this.getClass().getName());
// Editable projects
private MailerProject edit_mailer = new MailerProject();
//Changed this to be a static set value
private String mailerProject = "THIS IS THE MAILER STRING";
public int getProjectForm() {
loadEditMailer();
return 1;
}
public void loadEditMailer() {
this.edit_mailer = new MailerProject("REDJ15061005",
convertDate("2015-06-29"), false, "RickD",
"RickD and the Gang", "new", true, true, "SPEC", 1, 1, 1,
"REDJ15061005", "11X17", "SPOT_COLOR", "20,000",
convertDate("2015-06-30"), convertDate("2015-07-13"),
convertDate("2015-07-06"), convertDate("2015-07-06"),
convertDate("2015-07-15"), true, "BDC",
"someone@example.com", "STANDARD", 7500.00, "CONQUEST",
"NONE", "JS DIRECT", "NONE");
//Commented this out to keep the value static
//setMailerProject(edit_mailer.toString());
LOG.debug(":::MAILER PROJECT TO STRING::: " + this.mailerProject);
}
public Date convertDate(String date) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = null;
try {
date1 = df.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return date1;
}
}
我要重定向到的 JSF 页面 editMailerJob.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"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<body>
<div style="margin-bottom: 350px;">
<h:outputLabel>#{editProjects.edit_mailer}</h:outputLabel>
<h:outputLabel>Mailer String::: #{editProjects.mailerProject} </h:outputLabel>
</div>
</body>
</html>
日志显示所有信息都已接收并加载,但没有显示信息已清理或重新创建对象的位置。我试过在不同的时间在不同的地方实例化这个对象,但是没有用。
在我离开bean之前对象有值,当我到达页面时对象没有值,我不明白为什么
然后我尝试从不同的地方加载信息。我曾尝试将 bean 的范围从请求更改为查看请求,但没有运气,(我考虑过进行会话,但我没有看到好处,而且我只是看不出将所有这些信息放在一起的理由进入会话)。
问题似乎直接围绕着 bean 本身和 getProjectForm 方法,因为在某一时刻加载了对象,然后它就丢失了所有信息。
据我所知,我的所有值似乎都是正确的,但正在加载 none 的信息。
我似乎无法解决这个问题,因此非常感谢您的帮助。如果需要更多信息,请告诉我。
希望所有这些对您有所帮助,如果我忘记了什么,请告诉我。
编辑:::
我只创建了一个字符串,以查看它是否会在任何时候交付,但到目前为止我仍然一无所获,.xhtml 页面显示它存在但没有价值。如果其他人有解决方案,那将继续使用此解决方案,那将是很棒的,或者如果您知道解决方案并且至少可以为我指出正确的方向,那也很棒。
更新#2
所以我发现,如果我在方法之外设置值,它将正确显示,所以在我看来这些方法将值保留在 xhtml 页面中。这是怎么回事,我有变量的 getter 和 setter 我已经正确声明和定义了它们,但是无论出于什么原因,方法加载时的值都不会保留在方法之外,无法访问这些值通过 xhtml 页面。
晚上10:00更新
发现如果我以相同的方式实例化 MailerProject 对象,我不会得到相同的结果,我仍然会生成一个充满空属性值的对象。
大家有什么想法吗?
Start Here - 这将使其余部分变得非常微不足道。
问题
您正在使用 @RequestScoped
bean,您遇到的是该范围内 bean 的预期行为。
在第一页和第二页之间,您现在应该明白,您正在处理 editProjects
bean 的两个不同实例:您在第一页上设置的字段,由 [=14= 的一个实例支持] 将不会在目标页面上可用,由 editBean
.
的 new 实例支持
求解
虽然我链接到的答案中没有提到它,但您在这里需要的是 FlashScope
,它具有暂时性的明确目的:仅使用它来传输 "stuff" 在两个 pages/beans/scopes 之间等等。使用:
表明您对数据源点附近的闪光示波器的不懈热爱。这样做时,您将数据存储在 flash 范围对象中,正如 JSF 隐式提供的那样,之后您可以导航离开:
Flash fScope = FacesContext.getCurrentInstance().getExternalContext().getFlash();
fScope.put("editMailer",edit_mailer);
然后您可以在目标页面上引用存储在 flash 作用域中的变量:
<h:outputLabel>#{flash.edit_mailer}</h:outputLabel>
正如我之前提到的,flash 作用域是一个临时作用域:一旦呈现目标页面并显示作用域的内容,您就可以认为数据已经消失了。如果你只想坚持一个页面重定向更长的时间,你可以指定 keep
指令:
<h:outputLabel>#{flash.keep.edit_mailer}</h:outputLabel>
与问题无关
避免在 getter/accessor 方法中做任何繁重的工作(就像你在 getProjectForm
中所做的那样)。这对生意不利
- Why JSF calls getters multiple times
- Initialization of List in a JSF Managed bean
从该导航方法返回“1”有什么意义?为什么不 "destination_page" 或 "edit_page.xhtml",你知道的,一些更容易阅读的东西?无论如何,这只是一种风格,不会有任何邪恶。
我正在使用 primfaces 构建一个 JSF 2.0 应用程序。我有一个托管 bean,它有几个针对不同场景的对象。 在应用程序的这个特定部分,我从数据 table/form 移动到具有标识号的托管 bean。 我从数据库中提取信息,甚至将其保存在日志中。然而,当我到达 JSF xhtml 页面对象值为空,我似乎无法弄清楚为什么,任何帮助都会很棒,因为我没有收到任何错误, 日志中的异常或警告,所有信息似乎都指向加载数据,包括日志。
我来自的 JSF 页面... jobs.xhtml(我正在使用 jsf 2.2 和 primefaces 构建此应用程序)从该页面 link 指定要检索的作业编号,下一个 bean 将根据作业编号检索该作业,我只需要一个按钮 这将带您进入主要方法并将信息带到下一页...
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<body>
<div style="margin-bottom:350px;">
<p:column>
<h:form>
<h:commandButton id="editProject" action="#{editProjects.getProjectForm()}" value="Edit" />
</h:form>
</p:column>
</div>
</body>
</html>
EditProjects.java editMailerJob.xhtml 的支持 bean,它将接收媒体 ID 和将使用媒体 ID 的作业编号 将应用程序定向到下一页,职位编号将用于检索特定职位
::::已更新::::
package beans;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.RossProjectManagement.rpm.objects.MailerProject;
@ManagedBean
@RequestScoped
public class EditProjects implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6680733133634363295L;
private final Log LOG = LogFactory.getLog(this.getClass().getName());
// Editable projects
private MailerProject edit_mailer = new MailerProject();
//Changed this to be a static set value
private String mailerProject = "THIS IS THE MAILER STRING";
public int getProjectForm() {
loadEditMailer();
return 1;
}
public void loadEditMailer() {
this.edit_mailer = new MailerProject("REDJ15061005",
convertDate("2015-06-29"), false, "RickD",
"RickD and the Gang", "new", true, true, "SPEC", 1, 1, 1,
"REDJ15061005", "11X17", "SPOT_COLOR", "20,000",
convertDate("2015-06-30"), convertDate("2015-07-13"),
convertDate("2015-07-06"), convertDate("2015-07-06"),
convertDate("2015-07-15"), true, "BDC",
"someone@example.com", "STANDARD", 7500.00, "CONQUEST",
"NONE", "JS DIRECT", "NONE");
//Commented this out to keep the value static
//setMailerProject(edit_mailer.toString());
LOG.debug(":::MAILER PROJECT TO STRING::: " + this.mailerProject);
}
public Date convertDate(String date) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = null;
try {
date1 = df.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return date1;
}
}
我要重定向到的 JSF 页面 editMailerJob.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"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<body>
<div style="margin-bottom: 350px;">
<h:outputLabel>#{editProjects.edit_mailer}</h:outputLabel>
<h:outputLabel>Mailer String::: #{editProjects.mailerProject} </h:outputLabel>
</div>
</body>
</html>
日志显示所有信息都已接收并加载,但没有显示信息已清理或重新创建对象的位置。我试过在不同的时间在不同的地方实例化这个对象,但是没有用。
在我离开bean之前对象有值,当我到达页面时对象没有值,我不明白为什么
然后我尝试从不同的地方加载信息。我曾尝试将 bean 的范围从请求更改为查看请求,但没有运气,(我考虑过进行会话,但我没有看到好处,而且我只是看不出将所有这些信息放在一起的理由进入会话)。
问题似乎直接围绕着 bean 本身和 getProjectForm 方法,因为在某一时刻加载了对象,然后它就丢失了所有信息。
据我所知,我的所有值似乎都是正确的,但正在加载 none 的信息。
我似乎无法解决这个问题,因此非常感谢您的帮助。如果需要更多信息,请告诉我。
希望所有这些对您有所帮助,如果我忘记了什么,请告诉我。
编辑:::
我只创建了一个字符串,以查看它是否会在任何时候交付,但到目前为止我仍然一无所获,.xhtml 页面显示它存在但没有价值。如果其他人有解决方案,那将继续使用此解决方案,那将是很棒的,或者如果您知道解决方案并且至少可以为我指出正确的方向,那也很棒。
更新#2 所以我发现,如果我在方法之外设置值,它将正确显示,所以在我看来这些方法将值保留在 xhtml 页面中。这是怎么回事,我有变量的 getter 和 setter 我已经正确声明和定义了它们,但是无论出于什么原因,方法加载时的值都不会保留在方法之外,无法访问这些值通过 xhtml 页面。
晚上10:00更新 发现如果我以相同的方式实例化 MailerProject 对象,我不会得到相同的结果,我仍然会生成一个充满空属性值的对象。
大家有什么想法吗?
Start Here - 这将使其余部分变得非常微不足道。
问题
您正在使用 @RequestScoped
bean,您遇到的是该范围内 bean 的预期行为。
在第一页和第二页之间,您现在应该明白,您正在处理 editProjects
bean 的两个不同实例:您在第一页上设置的字段,由 [=14= 的一个实例支持] 将不会在目标页面上可用,由 editBean
.
求解
虽然我链接到的答案中没有提到它,但您在这里需要的是 FlashScope
,它具有暂时性的明确目的:仅使用它来传输 "stuff" 在两个 pages/beans/scopes 之间等等。使用:
表明您对数据源点附近的闪光示波器的不懈热爱。这样做时,您将数据存储在 flash 范围对象中,正如 JSF 隐式提供的那样,之后您可以导航离开:
Flash fScope = FacesContext.getCurrentInstance().getExternalContext().getFlash(); fScope.put("editMailer",edit_mailer);
然后您可以在目标页面上引用存储在 flash 作用域中的变量:
<h:outputLabel>#{flash.edit_mailer}</h:outputLabel>
正如我之前提到的,flash 作用域是一个临时作用域:一旦呈现目标页面并显示作用域的内容,您就可以认为数据已经消失了。如果你只想坚持一个页面重定向更长的时间,你可以指定
keep
指令:<h:outputLabel>#{flash.keep.edit_mailer}</h:outputLabel>
与问题无关
避免在 getter/accessor 方法中做任何繁重的工作(就像你在
getProjectForm
中所做的那样)。这对生意不利- Why JSF calls getters multiple times
- Initialization of List in a JSF Managed bean
从该导航方法返回“1”有什么意义?为什么不 "destination_page" 或 "edit_page.xhtml",你知道的,一些更容易阅读的东西?无论如何,这只是一种风格,不会有任何邪恶。