从JSF中的表单保存操作方法获取多个支持bean的值

时间:2012-02-20 07:42:31

标签: jsf

在我创建的jsf页面中,通过页面include添加了3个其他jsp页面,每个页面都有自己的支持bean,并通过scriptcollector预渲染方法从webservices预填充值。在保存时,如何在我的保存操作方法中获取提交的值?是否有可能从Faces Context获取每个bean的当前值? 我正在使用JSF 1.1。

2 个答案:

答案 0 :(得分:1)

您可以在其他托管bean中注入一个托管bean作为托管属性。在JSF 1.x中,这是使用<managed-property>中的faces-config.xml声明来完成的。

这是一个启动示例,说明如何在1个表单bean中注入3个Web服务bean。

<managed-bean>
    <managed-bean-name>webServiceBean1</managed-bean-name>
    <managed-bean-class>com.example.WebServiceBean1</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>webServiceBean2</managed-bean-name>
    <managed-bean-class>com.example.WebServiceBean2</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>webServiceBean3</managed-bean-name>
    <managed-bean-class>com.example.WebServiceBean3</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>formBean</managed-bean-name>
    <managed-bean-class>com.example.FormBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>webServiceBean1</property-name>
        <value>#{webServiceBean1}</value>
    </managed-property>
    <managed-property>
        <property-name>webServiceBean2</property-name>
        <value>#{webServiceBean2}</value>
    </managed-property>
    <managed-property>
        <property-name>webServiceBean3</property-name>
        <value>#{webServiceBean3}</value>
    </managed-property>
</managed-bean>

这样你就可以在表单提交方法中“通常的方式”访问它们。

public class FormBean {

    private WebServiceBean1 webServiceBean1;
    private WebServiceBean2 webServiceBean2;
    private WebServiceBean3 webServiceBean3;

    public String submit() {
        // Here you can just access the submitted data through the injected beans.
    }

    // Add/generate setters. Getters are not necesary.
}

作为替代方案,您可以使用Application#createValueBinding()以编程方式评估EL。

public String submit() {
    FacesContext context = FacesContext.getCurrentInstance();
    Application application = context.getApplication();
    WebServiceBean1 webServiceBean1 = (WebServiceBean1) application.createValueBinding("#{webServiceBean1}").getValue(context);
    WebServiceBean1 webServiceBean1 = (WebServiceBean2) application.createValueBinding("#{webServiceBean2}").getValue(context);
    WebServiceBean1 webServiceBean1 = (WebServiceBean3) application.createValueBinding("#{webServiceBean3}").getValue(context);
    // ...
}

请注意,上述方法在JSF 1.2及更新版本中已弃用,有利于统一EL API。另请参阅Get JSF managed bean by name in any Servlet related class

答案 1 :(得分:0)

  

保存时,如何在保存操作方法中获取提交的值?

在应用请求值阶段,分配的提交值和可以使用以下方法input.getSubmittedValue()访问,其中input是基于输入的UIComponent。提交的值将在验证阶段进行验证和转换,如果成功发生,则将适当地设置UIComponent的value。您应该能够从FacesContext找到您正在寻找的UIComponent。

  

是否可以从Faces Context获取每个bean的当前值?

我真的不确定你的目标是什么,但如果你想要的只是其他托管bean,那么你可以从外部文本中提供的HttpSession中获取它们的值。

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("nameOfManagedBean");