如何在不调用 <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】:不幸的是,这是<f:viewParam>
组件的设计。它将转换请求参数并在每个 HTTP 请求以及回发上设置属性。为了更改此行为,您需要使用自定义组件扩展<f:viewParam>
,该组件不记得其状态下的初始请求参数。它相对简单,而不是将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 有一个现成的组件,类似于<o:viewParam>
。这是live example。
【讨论】:
以上是关于如何在不调用 <f:viewparam> 转换器的情况下调用 setter?的主要内容,如果未能解决你的问题,请参考以下文章
如果位于 template.xhtml 中,JSF f:viewParam 不调用 setter
根据 f:viewParam 有条件地调用 f:viewAction