Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Arraylist最后一个元素覆盖以前的元素_Java_Jsf_Arraylist - Fatal编程技术网

Java Arraylist最后一个元素覆盖以前的元素

Java Arraylist最后一个元素覆盖以前的元素,java,jsf,arraylist,Java,Jsf,Arraylist,我有一个代码,允许老师添加学生并查看他们,但每次我添加一个学生,前一个学生也会被覆盖 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/j

我有一个代码,允许老师添加学生并查看他们,但每次我添加一个学生,前一个学生也会被覆盖

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">

<h:body>
<h:form>
    <h1><label>Student Grades</label></h1>
    <hr />
    <h:dataTable value="#{course.studentList}" var="st" border="1" rendered="#{course.render}">
        <f:facet name="caption">#{course.courseCode} #{course.courseName}</f:facet>
        <h:column>
            <f:facet name="header">Student Name</f:facet>
            <h:outputText value="#{st.studentName}" />
        </h:column>
        <h:column>
            <f:facet name="header">Score</f:facet>
            <h:outputText value="#{st.studentScore}" />
        </h:column>
    </h:dataTable><br />
    <label>Student Name</label>
    <h:inputText id="studentName" label="Student Name" value="#{student.studentName}" required="true" requiredMessage="Please enter a student name">
    </h:inputText>
    <h:message for="studentName" /><br />
    <label>Student Score</label>
    <h:inputText id="studentScore" label="Student Score" value="#{student.studentScore}" required="true" converterMessage="You must enter a number">
    <f:validateDoubleRange minimum="0" maximum="100" />
    </h:inputText>
    <h:message for="studentScore" /><br />
    <h:commandButton value="Add Grade" action="#{course.add(student)}"/>
    <h:commandButton value="Submit" action="summary"/>
</h:form>
</h:body>
</html>
下面是Course.java,它有一个学生列表

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import java.util.ArrayList;

@ManagedBean(name = "course")
@SessionScoped
public class Course {
private String courseName;
private String courseCode;
private ArrayList<Student> studentList = new ArrayList<Student>();
private double courseAverage;
private boolean render;

public String getCourseName() {
    return courseName;
}

public void setCourseName(String courseName) {
    this.courseName = courseName;
}

public String getCourseCode() {
    return courseCode;
}

public void setCourseCode(String courseCode) {
    this.courseCode = courseCode;
}

public ArrayList<Student> getStudentList() {
    return studentList;
}

public void setStudentList(ArrayList<Student> studentList) {
    this.studentList = studentList;
}

public double getCourseAverage() {
    int i = 0;
    for (Student st : studentList) {
        courseAverage += st.getStudentScore();
        i++;
    }
    return courseAverage/i;
}

public void setCourseAverage(double average) {
    this.courseAverage = average;
}

public boolean isRender() {
    return render;
}

public void setRender(boolean render) {
    this.render = render;
}

public String add(Student student) {
    studentList.add(student);
    render = true;
    return null;
}

public String reset() {
    studentList = new ArrayList<Student>();
    courseName = "";
    courseCode= "";
    courseAverage = 0.0;
    render = false;
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    return "home";
}

public boolean renderable() {
    boolean render = false;
    for (Student st : studentList) {
        render = true;
    }
    return render;
}
}
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.SessionScoped;
导入javax.faces.context.FacesContext;
导入java.util.ArrayList;
@ManagedBean(name=“课程”)
@会议范围
公共课{
私有字符串courseName;
私有字符串代码;
private ArrayList studentList=new ArrayList();
私人双修课;
私有布尔渲染;
公共字符串getCourseName(){
返回courseName;
}
公共void setCourseName(字符串courseName){
this.courseName=courseName;
}
公共字符串getCourseCode(){
返回课程代码;
}
公共无效设置courseCode(字符串courseCode){
this.courseCode=courseCode;
}
公共阵列列表getStudentList(){
返回学生名单;
}
公共无效集合学生列表(ArrayList学生列表){
this.studentList=studentList;
}
公共双getCourseAverage(){
int i=0;
学生名单(学生名单){
courseAverage+=st.getStudentScore();
i++;
}
返回课程/我;
}
公共空隙率(双倍平均值){
这个.courseAverage=平均值;
}
公共布尔值isRender(){
返回渲染;
}
公共void setRender(布尔渲染){
this.render=render;
}
公共字符串添加(学生){
学生列表。添加(学生);
render=true;
返回null;
}
公共字符串重置(){
studentList=newarraylist();
courseName=“”;
courseCode=“”;
courseAverage=0.0;
render=false;
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
返回“家”;
}
公共布尔可渲染(){
布尔渲染=假;
学生名单(学生名单){
render=true;
}
返回渲染;
}
}

当您的
学生
类被注释为
@SessionScoped
@ManagedBean
时,它将在整个用户的HTTP会话中创建和存储,即除非无效或过期。因此,当你向列表中添加一个值时,你基本上在所有地方都添加了一个非常相同的引用,你所做的就是修改一个
Student
对象的字段,该对象曾经创建,后来其字段被不断替换,因此,每个包含对同一
Student
对象引用的列表元素,也进行了修改

您需要做的是创建一个全新的
Student
对象,将其添加到列表中,并为此从列表中删除任何bean注释


作为旁注,在继续之前,请确保了解托管bean和模型/占位符之间的区别和用例。

课程中。添加
方法添加参数
学生的副本


原因:即使是请求范围的bean也可能被容器重复/重用。在每种情况下,它都有一点防御性。

在arrayList中的值放在哪里?确保不会以某种方式调用Course.reset方法…@MuneebNasir如果查看xhtml文件,其中一个命令按钮会调用函数Course.add(student)将该学生附加到学生列表array@karakuricoder在另一个xhtml文件中调用了course.reset方法。对不起,我忽略了course类的滚动条
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import java.util.ArrayList;

@ManagedBean(name = "course")
@SessionScoped
public class Course {
private String courseName;
private String courseCode;
private ArrayList<Student> studentList = new ArrayList<Student>();
private double courseAverage;
private boolean render;

public String getCourseName() {
    return courseName;
}

public void setCourseName(String courseName) {
    this.courseName = courseName;
}

public String getCourseCode() {
    return courseCode;
}

public void setCourseCode(String courseCode) {
    this.courseCode = courseCode;
}

public ArrayList<Student> getStudentList() {
    return studentList;
}

public void setStudentList(ArrayList<Student> studentList) {
    this.studentList = studentList;
}

public double getCourseAverage() {
    int i = 0;
    for (Student st : studentList) {
        courseAverage += st.getStudentScore();
        i++;
    }
    return courseAverage/i;
}

public void setCourseAverage(double average) {
    this.courseAverage = average;
}

public boolean isRender() {
    return render;
}

public void setRender(boolean render) {
    this.render = render;
}

public String add(Student student) {
    studentList.add(student);
    render = true;
    return null;
}

public String reset() {
    studentList = new ArrayList<Student>();
    courseName = "";
    courseCode= "";
    courseAverage = 0.0;
    render = false;
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    return "home";
}

public boolean renderable() {
    boolean render = false;
    for (Student st : studentList) {
        render = true;
    }
    return render;
}
}