0

我的 JSF 2.0 应用程序中的一个页面使用来自特定学校(数据库操作)的教师数量(以教师 ID 的形式)填充数据表。针对每一行,我需要分配两个属性,一个整数值 (intValue) 和一个字符串值 (strValue)。当我提交页面以将其保存到数据库时,我最终为teacherList 中的所有教师保存了相同的strValue 和intValue。也许我不知道如何使用数据表,我有点关注“ http://www.primefaces.org/showcase/ui/datatableRowEditing.jsf ”。任何人都可以提出任何其他替代方案或解决方案。我的代码粘贴在下面。谢谢!

豆子

@ManagedBean(name="myBean")
@SessionScoped
public class MyBean implements Serializable{

    private Integer indId;
    private Integer teacherId;
    private Integer schoolId;
    private String strValue;
    private Integer intValue;
    private List<Teacher> teacherList;
    private List<Att> tList;

    public myBean(){
        tList = new ArrayList<Att>();

        // Some database operations to load the att.xhtml page
        indId = findId();
        teacherList = teacherDataProvider(schoolId);    
    }

    public void attEntry(){

        for (int i = 0;i<teacherList.size();i++){

            tList.add(new Att(this.teacherList.get(i).getTeacherId(),
                                                            this.indId,
                                                            this.strValue,
                                                            this.intValue,
                                                            );
            dataProvider.addAtt(tList.get(i)); // call for database archival from the DAO   
        }
    }

    // getters & setters

}   

att.xhtml

<h:dataTable id="teachers" class="table table-condensed" 
    value="#{myBean.teacherList}" var="t">
    <h:column>
        <f:facet name="header">
            <h:outputText value="Teacher Id" />
        </f:facet>
        <h:outputText value="#{t.teacherId}" />
    </h:column> 

    <h:column>
        <f:facet name="header">
            <h:outputText value="Att" />
        </f:facet>
        <h:inputText value="#{myBean.intValue}" />
    </h:column>

    <h:column>
        <f:facet name="header">
            <h:outputText value="Comments" />
        </f:facet>
        <h:inputTextarea value="#{myBean.strValue}" />
    </h:column>
</h:dataTable>      
<div>
    <h:commandButton action="#{myBean.attEntry}" value="Submit" />
</div>
4

1 回答 1

1

您的问题不在于数据表,而在于未能掌握 JSF 基础知识。JSF 正在做你告诉它做的事情。你所说的基本上是在一个对象列表旁边拥有一个一个bean属性这显然会产生不一致。 Integer StringTeacher

您的问题隐含的结果恰恰相反:您希望将一个整数字符串对附加到您的类的每个实例。这假定您希望将这两个值存储在一个Teacher类中,或者将一个Teacher对象与这两个值一起包含在一个包装类中:

  1. 在类中添加两个字段Teacher

    public class Teacher {
    
        private int intValue;//getter+setter
        private String stringValue;//getter+setter
    
    }
    
  2. 将对象封装在包装类中:

    public class TeacherWrapper {
    
        private int intValue;//getter+setter
        private String stringValue;//getter+setter
        private Teacher teacher;//getter+setter
    
    }
    

当然Teacher,如果您在 Servlet 3.0 和 EL 2.2 上,您也可以将这两个值对存储在 bean 中的两个单独列表中,就在 list of 旁边,并使用带参数的 EL 方法调用。

这样,如果您将必要的绑定添加到输入组件,您的命令按钮将执行您想要的操作。

作为旁注,请务必检查使用会话范围来处理最可能属于视图/请求范围的数据的原因。此外,您可能希望保留每行数据(如单个Teacher对象),您可以在每个数据表行中添加一个命令按钮来处理作业,但这是一个不同的问题。

于 2013-03-27T18:17:50.653 回答