我正在使用主界面构建JSF 2.0应用程序。我有一个托管bean,它有用于不同场景的几个对象。在应用程序的这个特定部分中,我将从数据表/表单转移到具有标识号的托管bean。我从数据库中提取信息,甚至在日志中。然而当我到达JSF xhtml页面的对象值是空的,我似乎不能弄清楚为什么,任何帮助将是伟大的,因为我没有得到错误,日志中的异常或警告以及所有信息似乎都指向包括日志在内的数据加载。
JSF页面,我来自…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;
}
}
我要重定向到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的范围从请求更改为视图再更改为请求,但没有运气,(我考虑过做会话,但我没有看到好处,因为我只是看不出将所有这些信息放入会话的理由)。
这个问题似乎是直接围绕bean本身和getProjectForm方法旋转的,因为在某一点上对象被加载,然后它就失去了所有的信息。
据我所知,我所有的值似乎都是正确的,但没有任何信息正在加载。
我似乎不太明白这个问题,所以任何帮助都会非常感激。如果需要更多的信息请告诉我。
我希望所有这些对你有帮助,如果我忘记了什么,请告诉我。
编辑:::
我只创建了一个字符串,看看它是否会在任何时候被传递,到目前为止,我仍然没有得到任何东西,.xhtml页面读取到它存在,但没有读取到它有值。如果有人有解决方案,那就太棒了,或者如果你知道解决方案,至少可以为我指出正确的方向,那也会很棒。
更新# 2因此,我发现,如果我在方法外部设置值,它将正确显示,因此在我看来,方法似乎保留了xhtml页面中的值。什么是处理,我有getter和setter的变量,我有它们的声明和定义正确,但无论出于什么原因,值加载时的方法不保留在方法之外,这些值不能被xhtml页面访问。
晚上10:00更新发现如果我用同样的方式实例化MailerProject对象,我不会得到相同的结果,我仍然会产生一个充满null属性值的对象。
有什么想法吗?
Start Here -这将使其余部分变得非常简单。
您正在使用@RequestScoped
bean,并且您正在体验的是该作用域的bean的预期行为。在第一页和第二页之间,您现在应该明白,您正在处理editProjects
bean的两个不同实例:您在第一页上设置的由editProjects
的一个实例支持的字段在目标页上不可用,目标页由editBean
的一个新实例支持。解决
虽然它没有在我链接到的答案中提到,你这里需要的是FlashScope
,它在本质上是暂时的:使用它只是为了在两个页面/bean/作用域之间传输"东西"。有几分。使用方法:
-
声明你对数据起源点周围的闪光范围的永恒的爱。这样做,您将数据存储在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
中所做的那样)。这对生意不好- 为什么JSF多次调用getter
- 在JSF管理bean中初始化列表
-
从那个导航方法返回"1"的意义是什么?为什么不使用"destination_page"或"edit_page.xhtml"呢?不管怎么说,这只是一种风格,不会有什么不好的。