【发布时间】:2015-10-22 02:14:03
【问题描述】:
我正在使用 primfaces 构建一个 JSF 2.0 应用程序。我有一个托管 bean,它具有用于不同场景的多个对象。 在应用程序的这个特定部分中,我从一个数据表/表单移动到一个带有标识号的托管 bean。 我从数据库中提取信息,甚至将其保存在日志中。但是,当我到达 JSF xhtml页面对象值为空,我似乎无法弄清楚为什么,任何帮助都会很好,因为我没有收到任何错误, 日志中的异常或警告以及所有信息似乎都指向数据的加载,包括日志。
我来自的 JSF 页面...jobs.xhtml(我正在使用 jsf 2.2 和 primefaces 来构建这个应用程序)从这个页面 链接指定要检索的作业编号,下一个 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;
}
}
我正在重定向到 editMailerJob.xhtml 的 JSF 页面
<?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 的范围从 request 更改为 view 回 request 但没有运气,(我想过做会话,但我没有看到好处,我只是看不到放置所有这些信息的理由进入会话)。
问题似乎直接围绕 bean 本身和 getProjectForm 方法,因为在某一时刻,对象被加载,然后它就丢失了所有信息。
据我所知,我的所有值似乎都是正确的,但没有加载任何信息。
我似乎无法解决这个问题,因此我们将不胜感激。如果需要更多信息,请告诉我。
我希望所有这些对我有帮助 如果我忘记了什么,请告诉我。
编辑:::
我只创建了一个字符串以查看它是否会在任何时候交付,但到目前为止我仍然一无所获,.xhtml 页面正在读取它存在但没有价值。如果其他人有解决方案,仍然可以使用它,那将是很棒的,或者如果您知道解决方案并且至少可以为我指出正确的方向,那也很棒。
更新 #2 所以我发现,如果我在方法之外设置值,它将正确显示,所以在我看来,这些方法保留了 xhtml 页面中的值。这是怎么回事,我有变量的getter和setter,我已经正确声明和定义了它们,但是无论出于什么原因,方法加载时的值没有保留在方法之外,无法访问这些值通过 xhtml 页面。
晚上 10:00 更新 发现如果我以同样的方式实例化 MailerProject 对象,我不会得到相同的结果,我仍然会生成一个充满空属性值的对象。
各位有什么想法吗?
【问题讨论】:
-
请创建一个 mcve。这对我来说太多了。
-
@Kukeltje 好的,在此之前,我想知道您是否愿意保留 .xhtml 信息,如果可以,我可以保留它,如果您觉得没有必要,我会删除它,我想提供它,以防有人想根据页面彻底重新起草问题。我可以向表单页面和 faces-config.xml 提供对象列表以及支持 bean 的对象,但是在创建 mcve 或至少尝试这样做时,我不想遗漏有价值的信息,此处提供的 bean 是它们所能达到的最低限度。
-
@Kukeltje 我也可以提供运行示例所必需的对象,这样如果您需要,您可以有效地启动应用程序的模型,但同样是问题的边界最小化,而不是它是必需的
-
点击 jsf 标签时检查How to Ask 和信息选项卡。关于如何创建 mcve 的大量信息
-
@Kukeltje 我已经根据我对 mcve 的理解从这个链接 stackoverflow.com/help/mcve 编辑了这个问题我可能会遗漏一些东西或忽略一些要求,但看看这是否更好你。我已经摆脱了大部分不需要的代码,提供了对象和代码来重新组装项目的基本级别,并实例化了这些对象以供使用。请让我知道是否还有其他我不应该做的事情,谢谢。
标签: jsf jakarta-ee web-applications jsf-2 primefaces