我正在使用带有GlassFish 3.0的JSF 2.0。
我有以下托管豆:
@ManagedBean
@RequestScoped
public class OverviewController{
private List<Event> eventList;
@PostConstruct
public void init(){
System.out.println("=> OverviewController - init() - enter");
System.out.println("=< OverviewController - init() - exit");
}
}
从overview.xhtml文件中,我从OverviewController中调用不同的属性或方法。
<ui:repeat var="event" value="#{overviewController.eventList}">
...
</ui:repeat>
一切正常,但问题出在日志文件上:
INFO: Enter : RESTORE_VIEW 1
INFO: Exit : RESTORE_VIEW 1
INFO: Enter : RENDER_RESPONSE 6
INFO: => OverviewController - init() - enter
INFO: => Overview Controller - updateSelectedTab() - enter
INFO: =< Overview Controller - updateSelectedTab() - exit
INFO: =< OverviewController - init() - exit
INFO: => OverviewController - init() - enter
INFO: => Overview Controller - updateSelectedTab() - enter
INFO: =< Overview Controller - updateSelectedTab() - exit
INFO: =< OverviewController - init() - exit
INFO: Exit : RENDER_RESPONSE 6
如您所见,init()方法在同一请求中被两次调用,无缘无故。据我所知,每个带有PostConstruct注释的方法都会被调用一次。我错了吗?
编辑:
页面上未使用AJAX。
我用 Firebug 检查了请求的数量。有树请求:
参考方案
如果您有多个框架管理同一个bean类,则会发生这种情况。例如。 JSF和CDI,或JSF和Spring,或CDI和Spring等。仔细检查bean上的配置和注释。
如果您使用的是CDI,并且在整个类中使用了多个@Named
注释,那么也会发生这种情况。例如,直接在类上输入@Named
以将其注册为托管Bean,而在@Produces
getter方法中将另一个注册。您需要问自己是否真的必要。您也可以只使用#{bean.someObject}
而不是#{someObject}
。
@Named
@RequestScoped
public class Bean {
@PostConstruct
public void init() {
// ...
}
@Named
@Produces
public SomeObject getSomeObject() {
// ...
}
}
如果您的托管bean扩展了一些抽象类,那么该类又在方法上也带有@PostConstruct
,那么也会发生这种情况。您应该从中删除注释。另外,您应该使init方法变得抽象,并且在实现的bean上没有@PostConstruct
:
public abstract class BaseBean {
@PostConstruct
public void postConstruct() {
init();
}
public abstract void init();
}
JSF:清除会话范围的Bean - java我想知道,在用户关闭JSF 1.2上的窗口(点击浏览器的“ X”)后,如何在JSF中执行session.remove("userBean")。我当时想在用户点击浏览器的“ X”后弹出一个确认消息,但我不太确定如何访问Ok按钮或将其绑定到我定义的方法上,在这里我有逻辑来清除作用域中的bean。还是有更好的方法呢?任何帮助将不胜感激。谢谢。 …
Java:线程池如何将线程映射到可运行对象 - java试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …
JAVA:字节码和二进制有什么区别? - javajava字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…
java:继承 - java有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…
Java:BigInteger,如何通过OutputStream编写它 - java我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…