Jsf 2 JSF为facelets中的每个el表达式创建同一类的新实例

Jsf 2 JSF为facelets中的每个el表达式创建同一类的新实例,jsf-2,Jsf 2,我在web应用程序项目中有一个登录页: <h:form> <h:messages /> <h:inputText label="Username" value="#{login.username}" required="true" /> <h:inputSecret label="Password" value="#{login.pass}" required="true" /> <h:commandButto

我在web应用程序项目中有一个登录页:

<h:form>
    <h:messages />
    <h:inputText label="Username" value="#{login.username}" required="true" />
    <h:inputSecret label="Password" value="#{login.pass}" required="true" />
    <h:commandButton value="Accedi" action="#{login.check()}"  />
</h:form>

当我提交表单时,jsf创建了登录类的三个实例(我使用调试器注意到了这种行为)。这样,我就不能在Login.check()方法中使用用户名和密码:它们都是null


此外,我还测试了另一个我不久前创建的更复杂的项目,它运行良好:只创建了一个实例。我不明白我错在哪里。

看看登录bean的托管bean配置(类的注释或在
faces config.xml
中),特别是它的范围。“无”的范围将与您观察到的效果完全相同。合适的作用域可能是“request”。

当然,登录类是@requestscope,我也尝试过@sessionscope,但没有创建任何三个实例。@Alf:您也看过faces-config.xml吗?我认为任何配置都会覆盖注释。如果不是这样,创建一个构造函数并在其上设置一个断点可能有助于跟踪问题,如果您愿意仔细检查JSF实现的源代码的话!我使用javax.faces.bean.RequestScope。使用javax.enterprise.context.RequestScoped它可以工作!导入由netbeans自动添加。为什么会有这种歧义?@Alf:不幸的时机——一个是通用标准(不仅仅是JSF),另一个是早期发布的特定于JSF的API。然而,这两种方法都应该有效,事实上我在项目中使用了javax.faces注释。当然,这取决于JSF实现和/或servlet容器。