2013-03-08 77 views
0

我有JSF页面。我的目标是通过从数据库获取模式来动态构建验证器。validateregex的动态模式不起作用,但静态版本是

我的代码下面不能正常工作。我的意思是正则表达式失败。

<p:inputText value="#{basvuruBean.basvuru.sistem.tavsiyeEdilenID}" 
      requiredMessage="Lütfen Tavsiye Edilen ID giriniz" 
      validatorMessage="#{basvuruBean.basvuru.sistem.tavsiyeEdilenIDHataMesaji}" 
      rendered="#{basvuruBean.basvuru.sistem.tavsiyeEdilenIDRendered}"> 
    <f:validateRegex pattern="#{basvuruBean.basvuru.sistem.tavsiyeEdilenIDRegEX}" /> 
</p:inputText> 

,但这个工作如预期

<p:inputText value="#{basvuruBean.basvuru.sistem.tavsiyeEdilenID}" 
      requiredMessage="Lütfen Tavsiye Edilen ID giriniz" 
      validatorMessage="#{basvuruBean.basvuru.sistem.tavsiyeEdilenIDHataMesaji}" 
      rendered="#{basvuruBean.basvuru.sistem.tavsiyeEdilenIDRendered}"> 
    <f:validateRegex pattern="\d" /> 
</p:inputText> 

basvuruBean.basvuru.sistem.tavsiyeEdilenIDRegEX等于\d。我通过在JSF页面上打印来检查它。

我必须做些什么才能使它工作?

支持bean的相关部分

import java.io.IOException; 
import com.itextpdf.text.DocumentException; 
import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 
import javax.faces.context.FacesContext; 
import org.primefaces.event.FlowEvent; 

@ManagedBean 
@ViewScoped 
public class BasvuruBean implements Serializable { 

private Basvuru basvuru = new Basvuru(); 
private Sistem sistem; 

private static final long serialVersionUID = 1L; 
private String url; 
private List<Sistem> sistemler = new ArrayList<Sistem>(); 
private SistemDAO sistemDAO = new SistemDAO(); 

    @PostConstruct 
void initialiseSession() { 
    FacesContext.getCurrentInstance().getExternalContext().getSession(true); 
    sistem=sistemler.get(0); 
} 

public BasvuruBean() { 

    sistemler = sistemDAO.tumSistemler(); 


    this.basvuru.setSistem(sistem); 
    this.basvuru.setSirketAdi("Şirket Adı"); 
    this.basvuru.setePosta("[email protected]"); 

} 


public void sistemChangeListener() { 

    System.out.println(sistem.getSistemAdi()); 
    sistem.setKapsamaYaricapi(this.sistem.getKapsamaYaricapiDefault()); 
    this.sistem.setKapsamaYuksekligi(this.sistem.getKapsamaYuksekligiDefault()); 
    this.sistem.setFrekansMax(this.sistem.getFrekansMaxDefault()); 
    this.sistem.setFrekansMin(this.sistem.getFrekansMinDefault()); 
    this.sistem.setTavsiyeEdilenID(this.sistem.getTavsiyeEdilenIDDefault()); 
    this.sistem.setRunway(this.sistem.getRunwayDefault()); 
    this.sistem.setTrueRadiationDirection(this.sistem.getTrueRadiationDirectionDefault()); 
    this.sistem.setApproachCAT(this.sistem.getApproachCATDefault()); 
    this.sistem.setAntenVericiGucuDefault(this.sistem.getAntenVericiGucuDefault()); 
    this.sistem.setAntenYuksekligiAGL(this.sistem.getAntenYuksekligiAGLDefault()); 
    this.sistem.setFrekans(this.sistem.getFrekansDefault()); 
} 
} 

和selectOneMenu用于哪些改变SISTEM对象

<p:selectOneMenu value="#{basvuruBean.basvuru.sistem}" converter="sistemConverter"> 
    <f:selectItems value="#{basvuruBean.sistemler}" var="s" itemLabel="#{s.sistemAdi}" itemValue="#{s}" /> 
    <p:ajax listener="#{basvuruBean.sistemChangeListener}" update="p2 genelbilgi" /> 
</p:selectOneMenu> 
+0

你能向我们展示你的支持bean吗?至少它的所有相关部分。 – partlov 2013-03-08 20:35:07

+0

我已经添加了一些更多的代码部分 – nsumer 2013-03-08 20:44:13

回答

1

很难naildown原因在你的代码,因为它是比较笨拙。

事实是,<f:validateRegex>是视图构建时间标记。因此,引用其中的视图scoped bean属性将导致创建一个全新的实例,该实例与UI组件中引用的实例不同,如<p:selectOneMenu>。所以,最终得到2个支持bean实例,一个参考<f:validateRegex>,另一个参考<p:selectOneMenu>及其<p:ajax>。所以,如果你在一个bean实例中通过ajax操作正则表达式模式,它将不会反映到另一个bean实例中。

除了可能的设计问题,您可以使用OmniFaces中的<o:validator>而不是<f:validateRegex>来解决特定的功能问题。

<o:validator validatorId="javax.faces.RegularExpression" pattern="#{basvuruBean.basvuru.sistem.tavsiyeEdilenIDRegEX}" /> 

这将在rendertime而不是buildtime期间解析属性。