JSF ajax 验证不验证需要 true 的项目

Posted

技术标签:

【中文标题】JSF ajax 验证不验证需要 true 的项目【英文标题】:JSF ajax validation don't validate items with required true 【发布时间】:2013-07-23 09:37:55 【问题描述】:

我有一个数据表,一个带有 h:commandlink 的列用于编辑(a​​jax 请求),详细信息显示在 jquery 对话框中,一切正常,在编辑表单中我有 h:commandlink(ajax 请求)用于保存,如果我制作更改,例如,在所需的输入中删除一个值,然后推送提交,jsf 不验证此输入,并且不显示消息“此输入是必需的”

    <div id="container">
        <button id="create-user" >Create new user</button>

    <h:dataTable value="#gasweb.lsProveedor" var="tabpro" id="example" class="display dataTable" >
        <h:column>
            <f:facet name="id">
                <h:outputLabel value="Id"/>
            </f:facet>
            <h:outputText value="#tabpro.proveedor_id"/>
        </h:column>
        <h:column>
            <f:facet name="header">
                <h:outputLabel value="Cedula"/>
            </f:facet>
            <h:outputText value="#tabpro.cedula_ruc"/>
        </h:column>
        <h:column>
            <f:facet name="header">
                <h:outputLabel value="NombreComercial"/>
            </f:facet>
            <h:commandLink value="#tabpro.nombre_comercial" actionListener="#gasweb.doEditProveedor2" class="labrir"    >
                <f:param name="pproveedor_id" value="#tabpro.proveedor_id" />
                <f:ajax execute="@this"   render=":forma:editgrid"  >
                </f:ajax>
            </h:commandLink>

        </h:column>
        <h:column>
            <f:facet name="header">
                <h:outputLabel value="Razon Social"/>
            </f:facet>
            <h:outputText value="#tabpro.razon_social"/>
        </h:column>

    </h:dataTable>

    </div> 

    <div id="divformap" title="Proveedor">

            <h:inputHidden value="#gasweb.newRecord" id="txtnewrecord"  />
            <h:inputHidden value="#gasweb.ruc_proveedor_ori" id="txtcedulaori"  />
            <h:panelGrid  columns="2" id="editgrid" >
                <h:outputLabel value="Id             :" />
                <h:outputText id="txtid" value="#gasweb.proveedor.proveedor_id"  />
                <h:outputLabel value="Ruc             :" />
                <h:inputText id="txtcedula" value="#gasweb.proveedor.cedula_ruc" size="20" class="text ui-widget-content ui-corner-all" />
                <h:outputLabel value="Nombr Comercial :" />
                <h:inputText id="txtnombre" value="#gasweb.proveedor.nombre_comercial" required="true" size="80"  class="text ui-widget-content ui-corner-all"/>
                <h:outputLabel value="Razón Social    :" />
                <h:inputText id="txtrazon" value="#gasweb.proveedor.razon_social" size="80" class="text ui-widget-content ui-corner-all"/>
                <h:outputLabel value="Dirección       :" />
                <h:inputText id="txtdireccion" value="#gasweb.proveedor.direccion" size="80" class="text ui-widget-content ui-corner-all"/>
                <h:outputLabel value="Telefono        :" />
                <h:inputText id="txttelefono" value="#gasweb.proveedor.telefono" size="20" class="text ui-widget-content ui-corner-all"/>
                <h:outputLabel value="Estado          :" />
                <h:outputText id="txtestado" value="#gasweb.proveedor.estado"  />
                <h:commandButton id="aceptar"   value="Aceptar" actionListener="#gasweb.doGrabaProveedor"  >
                    <f:param name="pproveedor_id2" value="#gasweb.proveedor.proveedor_id" />
                    <f:ajax render="bProveedor" execute="@form" onevent="resetFocus"  />
                  </h:commandButton>
                <h:outputText id="bProveedor" value="#gasweb.bProveedorExiste" />
            </h:panelGrid>

    </div>

我的托管 bean

公共类 GasperWebMB 实现 Serializable

private List<Contribuyente> lsContribuyente;
private List<Proveedor> lsProveedor;
private Contribuyente contribuyente;
private Proveedor proveedor;
private Declara serdec;
private FacesContext fc = FacesContext.getCurrentInstance();
private Boolean newRecord;
private String ruc_proveedor_ori;
private String bProveedorExiste;
//@ManagedProperty("#param.pproveedor_id")
//private Integer pproveedor_id;
//private HttpServletRequest request;

public GasperWebMB()
    serdec = new Declara();
    contribuyente = new Contribuyente();
    proveedor = new Proveedor();
    lsContribuyente = serdec.getAllContribuyente();
    lsProveedor = serdec.getAllProveedor();
    newRecord = true;
    log("creado");
    //request.getHeader(ruc_proveedor_ori);


public String getbProveedorExiste() 
    return bProveedorExiste;


public void setbProveedorExiste(String bProveedorExiste) 
    this.bProveedorExiste = bProveedorExiste;


public String getRuc_proveedor_ori() 
    log(ruc_proveedor_ori);
    return ruc_proveedor_ori;


public void setRuc_proveedor_ori(String ruc_proveedor_ori) 
    log(ruc_proveedor_ori);
    this.ruc_proveedor_ori = ruc_proveedor_ori;


public Boolean getNewRecord() 
    log(newRecord);
    return newRecord;


public void setNewRecord(Boolean newRecord) 
    log(newRecord);
    this.newRecord = newRecord;


public List<Proveedor> getLsProveedor() 
    log(lsProveedor);
    return lsProveedor;


public void setLsProveedor(List<Proveedor> lsProveedor) 
    log(lsProveedor);
    this.lsProveedor = lsProveedor;


public Proveedor getProveedor() 
    log(proveedor);
    return proveedor;


public void setProveedor(Proveedor proveedor) 
    log(proveedor);
    this.proveedor = proveedor;


public List<Contribuyente> getLsContribuyente() 
    return lsContribuyente;


public void setLsContribuyente(List<Contribuyente> lsContribuyente) 
    this.lsContribuyente = lsContribuyente;


public Contribuyente getContribuyente() 
    return contribuyente;


public void setContribuyente(Contribuyente contribuyente) 
    this.contribuyente = contribuyente;


public String doEditContribuyente()

    Map<String, String> params = fc.getExternalContext().getRequestParameterMap();

    contribuyente = serdec.getContribuyenteById(Integer.parseInt(par));
    newRecord = false;
    ruc_proveedor_ori = proveedor.getCedula_ruc();
    return "FContribuyente";



public String doGrabaContribuyente()
    System.out.println("grabar " + contribuyente.getCedula_ruc()+ " id " + contribuyente.getContribuyente_id());
    serdec.updContribuyente(contribuyente);
    return "lisContribuyente";


public String doEditProveedor()
    System.out.println("Entra");
    Map<String, String> params = fc.getExternalContext().getRequestParameterMap();
    String par = params.get("pproveedor_id");
    System.out.println("pro" + par);
    proveedor = serdec.getProveedorById(Integer.parseInt(par));

    newRecord = false;
    System.out.println("va a salir");
    return "editprov";



public void doGrabaProveedor(ActionEvent event)
    System.out.println("gra"+proveedor.getNombre_comercial()+" new "+ newRecord);
    Proveedor xpro = serdec.getProveedorByRuc(proveedor.getCedula_ruc());
    if (xpro != null && !proveedor.getCedula_ruc().equals(ruc_proveedor_ori))
        System.out.println("Ya existe");
        bProveedorExiste = xpro.getNombre_comercial();
        //FacesContext.getCurrentInstance().validationFailed();
        FacesMessage fmes = new FacesMessage("El Ruc "+proveedor.getCedula_ruc()+" ya se encuentra registrado para otro proveedor");
        fc.addMessage(null, fmes);
        //fc.addMessage("Proveedor ya existe", fmes);
        //return "sucess";
        return;
    
    if (newRecord)
        proveedor.setEstado("A");
        //serdec.insProveedor(proveedor);
    
    else 
        //serdec.updProveedor(proveedor);
    
    System.out.println("Si graba");
    //return "sucess";


public void doEditProveedor2(ActionEvent event)
    /*Map<String, String> params = fc.getExternalContext().getRequestParameterMap();
    String par = params.get("pproveedor_id");
    proveedor = serdec.getProveedorById(Integer.parseInt(par));
    newRecord = false;
    return "FProveedor";*/
    String pproveedor_id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("pproveedor_id");
    proveedor = serdec.getProveedorById(Integer.parseInt(pproveedor_id));
    newRecord = false;
    System.out.println("si edit2  param "+ pproveedor_id + " new "+ newRecord);
    System.out.println("si edit2  proveedor "+ proveedor.getNombre_comercial() + " new "+ newRecord);


private void log(Object object) 
    String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
    System.out.println("Bean " + methodName + ": " + object);

在此代码中,删除了 jquery 对话框并在 div 中显示详细信息

【问题讨论】:

添加 h:messages 以显示人脸消息。 【参考方案1】:

您必须将&lt;h:messages /&gt;&lt;h:message /&gt; 放在html 页面上。h:messages – 输出当前页面中的所有消息。h:message – 为特定组件输出一条消息. 1-在您的情况下,请尝试将&lt;h:messages /&gt; 放在首页或编辑表单内。 2- 或者您可以为每个必需的输入添加&lt;h:message /&gt;,例如 &lt;h:message for="txtnombre" style="color:red" /&gt; 在输入之后/之前。

【讨论】:

我将 h:messages 放在 html 页面和表单内,但结果相同,在 ajax 请求后不显示验证。我为每个必需的输入添加了 h:message,什么都没有

以上是关于JSF ajax 验证不验证需要 true 的项目的主要内容,如果未能解决你的问题,请参考以下文章

如何通过ajax验证两个密码字段?

带有 AJAX 验证的 JSF 表单 - 焦点问题

在与 JSF 和 Apache Shiro 的 Ajax 交互中处理身份验证

JSF 跳过没有立即=真的必需验证

当jsf验证失败时,跳过ajax

JSF 2.0中的AJAX onSubmit验证