0

我有这个 JSF 代码

<f:view>
    <h:form>                    
        <h:commandButton value="Generate License File" type="button" action="#{agreement.generateLicenseFile}"/>                    
    </h:form>
</f:view>

这就是豆子

@ManagedBean(name="agreement")
@RequestScoped
public class AgreementBean {

    private boolean generate=false; 

    public void generateLicenseFile(){
        generate=true;
    }
}

当我执行应用程序并单击按钮时,绝对没有任何反应。执行过程中没有错误。它根本没有做任何事情。

有任何想法吗?

- 编辑 -

我的意思是布尔值没有被修改。

4

1 回答 1

1

当我执行应用程序并单击按钮时,绝对没有任何反应

很多事情都发生在幕后!

  • 它将触发对POST将由 Faces Servlet 处理的服务器的请求。
  • 这将启动JSF 生命周期,您可以按照本教程对其进行调试。对于 JSF 生命周期,我将只解释最后两个阶段(其他链接很好地解释了其他 4 个阶段,特别是 BalusC)。
  • 在调用应用程序阶段(第 5 阶段),服务器将执行generateLicenseFile绑定到<h:commandButton>您的<h:form>.
  • 由于您从此阶段没有返回任何内容,因此在渲染响应阶段(第 6 阶段)将仅检索更新了 ViewState 的当前视图。此外,由于您没有对视图中的任何组件进行大更新,因此您什么也看不到

此外,由于 bean 配置为@RequestScoped将在每次提交表单时创建,并且该generate字段将始终false在根据请求创建时创建(因为您没有更改其值,因此它将保持false值)。bean 创建可以根据声明的范围而有所不同。更多信息:JSF 2 中的通信:托管 bean 范围

如果您想在视图中看到某些内容,我建议您稍微更改一下代码:

JSF 代码

<h:form>
    #{agreement.generate}
    <br />
    <h:commandButton value="Generate License File" type="button"
        action="#{agreement.generateLicenseFile}" />
</h:form>

托管豆

@ManagedBean(name="agreement")
@ViewScoped //removed RequestScoped, this WILL make the difference
public class AgreementBean {
    private boolean generate = false; 
    public void generateLicenseFile(){
        generate = !generate;
    }
    //getter and setter for generate field
}
于 2013-07-11T21:57:18.190 回答