【发布时间】:2012-12-17 19:32:13
【问题描述】:
我有一个 jsp 页面,在该页面的顶部有一个 scriplet 元素。在 f:view 和 h:form 标签之后的正文中,我有 a4j:commandButton,我在其中提供操作。现在,当我每次执行 scriplet 元素时按下 a4j:commandButton 时,它是我对服务器的 ajax 调用。这是正常行为还是我做错了什么。
【问题讨论】:
我有一个 jsp 页面,在该页面的顶部有一个 scriplet 元素。在 f:view 和 h:form 标签之后的正文中,我有 a4j:commandButton,我在其中提供操作。现在,当我每次执行 scriplet 元素时按下 a4j:commandButton 时,它是我对服务器的 ajax 调用。这是正常行为还是我做错了什么。
【问题讨论】:
JSP scriptlets 是由于在 JSF 视图构建期间执行的遗留 JSP 视图技术的性质(因此,也在回发的恢复视图阶段)。所以是的,这绝对是预期的行为。
您听起来好像只想在初始 GET 请求中执行一些 Java 代码,而不是在随后的回发中。在这种情况下,如果ResponseStateManager#isPostback() 返回false,请检查scriptlet。
FacesContext context = FacesContext.getCurrentInstance();
if (!context.getRenderKit().getResponseStateManager().isPostback(context)) {
// Not a postback. Do your job here.
}
请注意,FacesContext#isPostback() 在 JSF 2.x 中有更短的方法,但由于您使用的是旧版 JSP,我假设您仍在使用旧版 JSF 1.x。
与具体问题无关,自十年前的 JSP 2.0 以来,不鼓励使用 scriptlets。建议在普通的 Java 类中执行该作业。例如。在支持 bean 的(后)构造函数中。您可以使用<a4j:keepAlive> 在 JSF 1.x 请求范围 bean 上模拟新的 JSF 2.0 视图范围。
【讨论】: