【问题标题】:Why does my Object become null when going from bean to .xhtml page in jsf为什么在jsf中从bean转到.xhtml页面时我的对象变为空
【发布时间】: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


【解决方案1】:

Start Here - 它会让剩下的事情变得非常简单。

问题

您正在使用@RequestScoped bean,而您所遇到的是该范围的bean 的预期行为。 在第一页和第二页之间,您现在应该明白,您正在处理 editProjects bean 的两个不同实例:您在第一页上设置的一个字段,由一个 editProjects 实例支持将不会在目标页面上可用,由 editBeannew 实例支持。

解决

虽然我链接到的答案中没有提到它,但您在这里需要的是 FlashScope,它具有本质上是暂时性的明确目的:仅使用它在两个页面/bean 之间传输“东西” /scopes 等等。使用方法:

  1. 表明您对围绕数据起源点的闪存范围的永恒热爱。这样做时,您将数据存储在 JSF 隐式提供的 flash 范围对象中,之后您可以离开:

    Flash fScope = FacesContext.getCurrentInstance().getExternalContext().getFlash();
    fScope.put("editMailer",edit_mailer);
    
  2. 然后您可以在目标页面上引用您存储在闪存范围中的变量:

    <h:outputLabel>#{flash.edit_mailer}</h:outputLabel>
    

    就像我之前提到的,flash 范围是一个临时范围:一旦目标页面被渲染并显示了范围的内容,您就可以认为数据已经消失了。如果您希望只停留一页重定向更长的时间,您可以指定keep 指令:

    <h:outputLabel>#{flash.keep.edit_mailer}</h:outputLabel>
    

与问题无关

  1. 避免在 getter/accessor 方法中做任何繁重的工作(就像您在 getProjectForm 中所做的那样)。这对生意不利

  2. 从那个导航方法返回“1”有什么意义?为什么不是“destination_page”或“edit_page.xhtml”,你知道,更容易阅读的东西?无论如何,这只是一种风格,不会有坏处。

【讨论】:

  • 绝对棒极了,我不敢相信我没有听说过这个,我喜欢 jsf 有很多原因,所以我边走边学,这里非常棒,而且能带来很多感觉。即使我的问题写得不好并向我展示了我需要去的地方,我也非常感谢你坚持下去。谢谢
猜你喜欢
  • 2014-06-02
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 2016-02-21
  • 2012-03-18
相关资源
最近更新 更多