【问题标题】:View scoped managed bean with setPropertyActionListener使用 setPropertyActionListener 查看作用域托管 bean
【发布时间】:2011-10-07 15:15:20
【问题描述】:

我似乎无法让视图范围的托管 bean 与 setPropertyActionListener 一起工作:

   <h:commandButton value="Edit"  action="edit-company.xhtml">
    <f:setPropertyActionListener target="#{companyHolder.item}" value="#{company}"/>            
   </h:commandButton>

如果 companyHolder 是会话或请求范围,则此方法工作正常,但如果其视图范围为无效。这正常吗?

【问题讨论】:

    标签: jsf-2 scope managed-bean


    【解决方案1】:

    创建新视图时会创建一个全新的视图范围 bean。目标视图保存的视图范围 bean 的实例与表单的初始视图上的 action 方法设置属性的实例不同。

    乍一看确实不直观,但这就是视图范围的工作方式。视图范围 bean 的存在时间与视图存在的时间一样长。毕竟是有道理的。

    最好的办法是使用&lt;f:param&gt; 而不是&lt;f:setPropertyActionListener&gt;,并让目标视图由&lt;f:viewParam&gt; 设置它。

    例如

    <h:commandButton value="Edit"  action="edit-company.xhtml">
        <f:param name="companyId" value="#{company.id}"/>            
    </h:commandButton>
    

    <f:metadata>
        <f:viewParam name="companyId" value="#{bean.company}" required="true" />
    </f:metadata>
    

    @ManagedBean
    @ViewScoped
    public class Bean {
    
        private Company company;
    
        // ...
    }
    

    @FacesConverter(forClass=Company.class)
    public class CompanyConverter implements Converter {
    
        @Override
        public void getAsObject(FacesContext context, UIComponent component, Object value) throws ConverterException {
           try {
               return companyService.find(Long.valueOf(value));
           } catch (Exception e) {
               throw new ConverterException(new FacesMessage(
                   String.format("Cannot convert %s to Company", value)), e);
           }
        }
    
        // ...
    }
    

    作为一种完全不同的替代方案,您也可以通过返回 voidnull 导航回同一视图并有条件地呈现包含。

    <ui:include src="#{bean.editmode ? 'edit' : 'view'}.xhtml" />
    

    但是,如果您需要支持 GET 而不是 POST(顺便说一下,您需要将 &lt;h:commandButton&gt; 替换为 &lt;h:button&gt;),这将不起作用。

    【讨论】:

    • 如果我使用 param 方法,我是否需要开始为其他人的公司发布 params 的人添加安全性?
    • 我会说,使用条件包含。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2013-02-23
    • 2011-07-14
    • 2013-03-04
    • 2012-05-18
    • 1970-01-01
    • 2012-12-03
    相关资源
    最近更新 更多