【问题标题】:JSF buttons doesn't send data to beanJSF 按钮不向 bean 发送数据
【发布时间】:2013-01-26 17:40:44
【问题描述】:

我有一些 JSF 页面和一些 bean,因为它正在编辑当前元素,我使用更新,否则我使用保存方法。

我尝试调试并认为按钮上的方法永远不会执行

这是我的 JSF 页面:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:head>
        <title>Manage panel</title>
    </h:head>
    <h:body>
        <h3>Add/edit patient</h3>
        <h:form>           
            <c:set var="patient" value="#{manageBean.patient}" />
            <c:choose>
                <c:when test="#{patient!=null}">
                    <p:panel id="panel1" header="Patient" style="margin-bottom:10px;">  
                        <h:panelGrid columns="2">  
                            <h:outputLabel for="name" value="First  name" />  
                            <p:inputText id="firstName" required="true" value="#{patient.firstName}" />  

                            <h:outputLabel for="name" value="Family  name" />  
                            <p:inputText id="familyName" required="true" value="#{patient.familyName}" />  

                            <h:outputLabel for="name" value="Sex" />  
                            <p:selectOneMenu id="sex" value="#{patient.sex}">  
                                <f:selectItems value="#{manageBean.sex}"/>
                            </p:selectOneMenu>  

                            <h:outputLabel for="name" value="Birthday date" />  
                            <p:calendar value="#{patient.birthdayDate}" mode="inline" id="birthdayDate"/>  

                            <h:outputLabel for="name" value="Nationality" />  
                            <p:selectOneMenu id="nationality" value="#{patient.nationality}">  
                                <f:selectItems value="#{manageBean.nationality}"/>
                            </p:selectOneMenu>  

                            <h:outputLabel for="name" value="Adress" />  
                            <p:inputText id="adress" required="true" value="#{patient.adress}" />  

                            <h:outputLabel for="name" value="Phone number" />  
                            <p:inputMask id="phoneNumber" required="true" value="#{patient.phoneNumber}" mask="(999) 999-9999"/>
                        </h:panelGrid>  
                    </p:panel>  
                    <p:commandButton value="Update" type="submit" action="#{manageBean.update(patient)}" />  
                </c:when>   
                <c:otherwise>
                    <p:panel id="panel2" header="Patient" style="margin-bottom:10px;">  
                        <h:panelGrid columns="2">  
                            <h:outputLabel for="name" value="First  name" />  
                            <p:inputText id="firstName" required="true" value="" />  

                            <h:outputLabel for="name" value="Family  name" />  
                            <p:inputText id="familyName" required="true" value="" />  

                            <h:outputLabel for="name" value="Sex" />  
                            <p:selectOneMenu id="sex" value="">  
                                <f:selectItems value="#{manageBean.sex}"/>
                            </p:selectOneMenu>  

                            <h:outputLabel for="name" value="Birthday date" />  
                            <p:calendar mode="inline" id="birthdayDate"/>  

                            <h:outputLabel for="name" value="Nationality" />  
                            <p:selectOneMenu id="nationality" value="">  
                                <f:selectItems value="#{manageBean.nationality}"/>
                            </p:selectOneMenu>  

                            <h:outputLabel for="name" value="Adress" />  
                            <p:inputText id="adress" required="true" value="" />  

                            <h:outputLabel for="name" value="Phone number" />  
                            <p:inputMask id="phoneNumber" required="true" value="" mask="(999) 999-9999"/>
                        </h:panelGrid>  
                    </p:panel>  
                    <p:commandButton value="Save" action="#{manageBean.save(firstName, familyName, sex, birthdayDate, nationality, adress, phoneNumber)}" />  
                </c:otherwise>
            </c:choose>
        </h:form>      
    </h:body>
</html>

这是我的 bean 方法:

   public String update(Patient patient) {       
        Session session = factory.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.update(patient);
            tx.commit();
        } catch (HibernateException ex) {
            if (tx != null) {
                tx.rollback();
            }
            ex.printStackTrace();
        } finally {
            session.close();
        }
        return "go_home";
    }

    public String save(String fitstName, String familyName, Sex sex, Date birthdayDate, Nationality nationallity, String adress, String phoneNumber){
        Session session = factory.openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Patient patient = new Patient();
            patient.setFirstName(fitstName);
            patient.setFamilyName(familyName);
            patient.setSex(sex);
            patient.setBirthdayDate(birthdayDate);
            patient.setNationality(nationallity);
            patient.setAdress(adress);
            patient.setPhoneNumber(phoneNumber);
            session.save(patient);            
            tx.commit();
        } catch (HibernateException ex) {
            if (tx != null) {
                tx.rollback();
            }
            ex.printStackTrace();
        } finally {
            session.close();
        }
        return "go_home";
    }

【问题讨论】:

  • JSF 应该如何知道您发送给操作的参数的值?您真的误解了可以在UICommand 中传递给action 的参数。
  • 不是从inputText中取参数吗?
  • inputText 中的值在 JSF 的 update model 阶段的模型中更新。因此,当您开始运行 save 方法时,patient.getFirstName() 将已经返回您在 inputText 中设置的值。

标签: jsf


【解决方案1】:

一旦你在你的输入标签中给出了 value 属性,它就会直接将给定的值绑定到 java 类。在您的 java 类中创建类变量并绑定输入标签。前任:- 在您的 bean 类中创建变量,如

private String firstName 

并创建 getter 和 setter 方法

<f:view>

    <h3>Add/edit patient</h3>

    <h:form>           
                <p:panel id="panel1" header="Patient" style="margin-bottom:10px;">  

                    <h:panelGrid columns="2">
                        <h:outputLabel for="name" value="First  name" />
                        <p:inputText id="firstName" required="true" value="#{manageBean.firstName}" />

                        <h:outputLabel for="name" value="Family  name" />  
                        <p:inputText id="familyName" required="true" value="#{manageBean.familyName}" />  

                        <h:outputLabel for="name" value="Sex" />  
                        <p:selectOneMenu id="sex" value="#{manageBean.sex}">  
                            <f:selectItems value="#{manageBean.sex}"/>
                        </p:selectOneMenu>  

                        <h:outputLabel for="name" value="Birthday date" />  
                        <p:calendar value="#{manageBean.birthdayDate}" mode="inline" id="birthdayDate"/>  

                        <h:outputLabel for="name" value="Nationality" />  
                        <p:selectOneMenu id="nationality" value="#{manageBean.nationality}">  
                            <f:selectItems value="#{manageBean.nationality}"/>
                        </p:selectOneMenu>  

                        <h:outputLabel for="name" value="Adress" />  
                        <p:inputText id="adress" required="true" value="#{manageBean.adress}" />  

                        <h:outputLabel for="name" value="Phone number" />  
                        <p:inputMask id="phoneNumber" required="true" value="#{manageBean.phoneNumber}" mask="(999) 999-9999"/>
                    </h:panelGrid>  
                </p:panel>  
                <p:commandButton value="Update" type="submit" action="#{manageBean.update}" />  

                    </h:form> 

创建一个新的jsp页面并将这些代码复制粘贴到body标签中。 在您的 java 类中创建变量和 getter setter 方法。 更新应该是一个返回字符串的方法。

【讨论】:

  • 现在只需调用命令按钮中的方法即可。
  • 在你的测试中给 $ 而不是 # JSTL 将只取 $。如果有任何异常或错误信息,请提供。
  • 你为什么使用&lt;f:view&gt;?您是否尝试使用 JSF 1.2 代码回答 JSF 2 问题?请注意,OP 使用 Facelets 而不是 JSP。
猜你喜欢
  • 2013-05-19
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多