JSP/JSF在Wndow条目上初始化
我有: SP/JSF网页delegebean.jsp 关联的bean DelegateBean.java DelegateBean.java:JSP/JSF在Wndow条目上初始化,jsp,jsf,Jsp,Jsf,我有: SP/JSF网页delegebean.jsp 关联的bean DelegateBean.java DelegateBean.java: String msg; public DelegateBean() {} clearMsg(); ... } public void clearMsg() { msg = "": } .. other methods 当页面第一次打开时,调用构造函数DelegateBean() 如果操作员按下页面上的命令按钮,刷新页面,则不会调用构造
String msg;
public DelegateBean() {}
clearMsg();
...
}
public void clearMsg() {
msg = "":
}
.. other methods
当页面第一次打开时,调用构造函数DelegateBean()
如果操作员按下页面上的命令按钮,刷新页面,则不会调用构造函数(也不应该调用)
如果操作员按下后退按钮,然后按下前进按钮,则不会调用构造函数(可能不应该调用构造函数)
问题是:如何强制clearMsg()在从“前进”按钮(另一个网页)重新输入时执行,而在从自身重新输入时不执行(按下命令按钮)
有一个好的(简单的)例子吗
谢谢,
Johnfaces-config.xml中bean的作用域是什么 在描述问题时,它看起来像是
会话
,因为每个会话构造的是哪个bean,而不是请求
将范围更改为request
,您可能会表现良好
根据与@BalusC的讨论进行更新
上述请求
范围与不从同一页面调用的要求冲突
如果您使用的是JSF2.x,请将范围更改为viewscope
更新#2
我认为看到您的需求,
jsf1.2
,不能改变bean的范围
最简单的方法是添加一个显式调用
clearmessage()
前进按钮的内部操作faces-config.xml中bean的作用域是什么
在描述问题时,它看起来像是会话
,因为每个会话构造的是哪个bean,而不是请求
将范围更改为request
,您可能会表现良好
根据与@BalusC的讨论进行更新
上述请求
范围与不从同一页面调用的要求冲突
如果您使用的是JSF2.x,请将范围更改为viewscope
更新#2
我认为看到您的需求,
jsf1.2
,不能改变bean的范围
最简单的方法是添加一个显式调用
clearmessage()
前进按钮的内部操作看起来您的托管Bean是@SessionScoped
,并且只有当用户第一次访问页面时才会调用构造函数
在JSF2中,这可以通过将托管Bean更改为@ViewScoped
来实现
@ManagedBean
@ViewScoped
public class Bean {
public Bean() {
}
@PostConstruct
public void init() {
clearMsg();
}
}
BalusC在以下回答中对JSF托管Bean作用域给出了很好的解释:。此外,我建议您阅读答案底部的链接,以便更好地理解这些概念
在JSF1.x中,您应该将托管Bean配置为在
faces config.xml
文件中请求作用域,并在@PostConstruct public void init
方法中调用clearMsg
。注意,这意味着clearMsg
方法将在涉及创建托管bean类的每个请求(甚至是ajax请求)上被调用。为了解决这个问题,您应该提供更多关于如何以及何时在JSF代码中调用这个bean的信息。默认情况下,您可以通过在会话中设置一个标志来解决此问题,并在调用clearMsg
方法(或只需调用一次的方法)之前检查此标志
面配置
<managed-bean>
<managed-bean-name>bean</managed-bean-name>
<managed-bean-class>your.package.Bean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
看起来您的托管Bean是
@SessionScoped
,只有当用户第一次访问页面时,才会调用构造函数
在JSF2中,这可以通过将托管Bean更改为@ViewScoped
来实现
@ManagedBean
@ViewScoped
public class Bean {
public Bean() {
}
@PostConstruct
public void init() {
clearMsg();
}
}
BalusC在以下回答中对JSF托管Bean作用域给出了很好的解释:。此外,我建议您阅读答案底部的链接,以便更好地理解这些概念
在JSF1.x中,您应该将托管Bean配置为在
faces config.xml
文件中请求作用域,并在@PostConstruct public void init
方法中调用clearMsg
。注意,这意味着clearMsg
方法将在涉及创建托管bean类的每个请求(甚至是ajax请求)上被调用。为了解决这个问题,您应该提供更多关于如何以及何时在JSF代码中调用这个bean的信息。默认情况下,您可以通过在会话中设置一个标志来解决此问题,并在调用clearMsg
方法(或只需调用一次的方法)之前检查此标志
面配置
<managed-bean>
<managed-bean-name>bean</managed-bean-name>
<managed-bean-class>your.package.Bean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
这与“如果操作员按下页面上的命令按钮,刷新页面,则不会调用(也不应该调用)构造函数”相冲突;@BalusC-yup您是正确的。将bean放在会话作用域中,并从
向前
操作显式调用构造函数,这是一个好的设计。不确定-如果DIf OP使用的是JSF2,那么您可以只使用视图范围。但是这在JSF1.x中并不存在,尽管一些JSF1.x组件库有实现同样功能的解决方案。由于开发/测试周期中的当前位置,很难更改范围。这与“如果操作员按下页面上的命令按钮,刷新页面,则不会调用(也不应该调用)构造函数”冲突;“@BalusC yup您是正确的。将bean放在会话作用域中,并从向前
操作显式调用构造函数,这是一个好的设计。不确定-如果DIf OP使用的是JSF2,那么您可以只使用视图范围。但是这在JSF1.x中并不存在,尽管一些JSF1.x组件库有实现同样功能的解决方案。由于当前在开发/测试周期中的位置,很难更改范围。这个假设正确吗