如何在不调用 <f:viewparam> 转换器的情况下调用 setter?

Posted

技术标签:

【中文标题】如何在不调用 <f:viewparam> 转换器的情况下调用 setter?【英文标题】:how can i call setter without calling <f:viewparam> converter? 【发布时间】:2012-05-22 06:12:30 【问题描述】:

我正在使用 jsf 2.1.1 和 primefaces 3.0.M4。我有一个用于发布国家 cmets 的示例 jsf 页面。我使用带有转换器的 f:viewparam 标签来查看国家页面。以下是代码:

国家/地区.xhtml

<f:metadata>
        <f:viewParam name="country" value="#countryBean2.selectedCountry" converter="countryConverter" required="true"/>
    </f:metadata>

    <h:head>
        <title>Country</title>
    </h:head>

    <h:body>
        <h:form id="form">
            <h:outputText value="#countryBean2.selectedCountry.countryName" />
            <br/><br/>
            <h:outputText value="Comment:" />
            <h:inputText value="#countryBean2.comment" />
            <br/>
            <p:commandButton value="Send" action="#countryBean2.sendComment" update="@this" />
        </h:form>
    </h:body>

CountryBean2.java:

@Named("countryBean2")
@SessionScoped
public class CountryBean2 implements Serializable 
    private EntityCountry selectedCountry;
    private String comment;

    public EntityCountry getSelectedCountry()  return selectedCountry; 
    public void setSelectedCountry(EntityCountry newValue)  selectedCountry = newValue; 

    public String getComment()  return comment; 
    public void setComment(String newValue)  comment = newValue; 

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("testPU");

    public void sendComment() 
        EntityManager em = emf.createEntityManager();
        try 
            FacesMessage msg = null;
            EntityTransaction entr = em.getTransaction();
            boolean committed = false;
            entr.begin();
            try 
                EntityCountryComment c = new EntityCountryComment();
                c.setCountry(selectedCountry);
                c.setComment(comment);
                em.persist(c);
                committed = true;
                msg = new FacesMessage();
                msg.setSeverity(FacesMessage.SEVERITY_INFO);
                msg.setSummary("Comment was sended");
             finally 
                if (!committed) entr.rollback();
            
         finally 
            em.close();
        
    

CountryConverter.java:

public class CountryConverter implements Converter 
    public static EntityCountry country = new EntityCountry();

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("testPU");


    @Override
    public EntityCountry getAsObject(FacesContext context, UIComponent component, String value) 
        EntityManager em = emf.createEntityManager();
        Query query = em.createQuery("SELECT c FROM EntityCountry c WHERE c.countryName = :countryName")
                .setParameter("countryName", value);
        country = (EntityCountry) query.getSingleResult();
        return country;
    


    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) 
        EntityCountry c = (EntityCountry) value;
        return c.getCountryName();
    

当我使用命令按钮发表评论时,我想在不调用 CountryConverter 的情况下调用“setComment”设置器。我该怎么做?

【问题讨论】:

【参考方案1】:

不幸的是,这是&lt;f:viewParam&gt; 组件的设计。它将转换请求参数并在每个 HTTP 请求以及回发上设置属性。为了更改此行为,您需要使用自定义组件扩展&lt;f:viewParam&gt;,该组件不记得其状态下的初始请求参数。它相对简单,而不是将setSubmittedValue()getSubmittedValue() 委托给StateHelper,您只需将其设为实例变量即可。这在this blog中有详细描述。

@FacesComponent("com.my.UIStatelessViewParameter")
public class UIStatelessViewParameter extends UIViewParameter 

    private String submittedValue;

    @Override
    public void setSubmittedValue(Object submittedValue)   
        this.submittedValue = (String) submittedValue;
    

    @Override
    public String getSubmittedValue()  
        return submittedValue;
       

OmniFaces 有一个现成的组件,类似于&lt;o:viewParam&gt;。这是live example。

【讨论】:

以上是关于如何在不调用 <f:viewparam> 转换器的情况下调用 setter?的主要内容,如果未能解决你的问题,请参考以下文章

f:viewParam 在 ajax 调用后丢失

如果位于 template.xhtml 中,JSF f:viewParam 不调用 setter

根据 f:viewParam 有条件地调用 f:viewAction

f:viewParam 具有多个值

<f:viewParam> 的验证/转换错误不会本地化到 <f:view locale>,而是本地化到默认语言环境

将 f:viewParam 与必需的属性和命令一起使用