需要来自 txt 文件的数据,以逗号分隔,以使用现有类中的对象填充数组列表
Posted
技术标签:
【中文标题】需要来自 txt 文件的数据,以逗号分隔,以使用现有类中的对象填充数组列表【英文标题】:Need data from txt file, comma delimited, to populate an arraylist with objects from existing class 【发布时间】:2014-03-17 15:22:06 【问题描述】:我需要:
从文本文件中获取输入并逐行读取, 获取每一行并将其拆分为学生对象并将这些值发送到数组列表, 将来自 Student 类的对象数组列表发送到我的 servlet, 将数组列表从 servlet 发送到我的 jsp 页面 在 html 表格中显示值。这是我针对此特定功能的页面。我在这个项目中有许多不同的 java 页面、servlet 和 jsp 页面,所以如果您需要这些页面中的任何内容,请直接询问。
文本文件包含Student
信息,顺序如下:
学生 ID、姓氏、名字、测验分数 1-5、化妆测验分数、 期中成绩、问题成绩和期末考试成绩。
文本文件格式示例如下:
1234,Some,Person,98.0,94.0,97.0,96.0,99.0,0.0,92.0,95.0,99.0 1235,另一个,人,89.0,99.0,87.0,85.0,88.0,0.0,89.0,98.0,99.0 1236,Onemore,Person,89.0,98.0,89.0,98.0,97.0,0.0,79.0,89.0,99.0
我在表格中得到的输出只是第一行,全部在第一个单元格中。
如果你能指出我正确的方向,我完全迷失了。
这是我的Student
课堂页面:
public class Student
private String sid,fnm,lnm,lgrade;
private double q1,q2,q3,q4,q5,qmkup,midt,probs,finex,qavg,cavg;
public Student ()
//empty constructor
sid="";
lnm="";
fnm="";
lgrade="";
q1= 0;
q2= 0;
q3= 0;
q4= 0;
q5= 0;
qmkup= 0;
midt= 0;
probs= 0;
finex= 0;
qavg= 0;
cavg= 0;
public String getSid()
return sid;
public void setSid(String sid)
this.sid = sid;
public String getFnm()
return fnm;
public void setFnm(String fnm)
this.fnm = fnm;
public String getLnm()
return lnm;
public void setLnm(String lnm)
this.lnm = lnm;
public String getLgrade()
return lgrade;
public double getQ1()
return q1;
public void setQ1(double q1)
this.q1 = q1;
public double getQ2()
return q2;
public void setQ2(double q2)
this.q2 = q2;
public double getQ3()
return q3;
public void setQ3(double q3)
this.q3 = q3;
public double getQ4()
return q4;
public void setQ4(double q4)
this.q4 = q4;
public double getQ5()
return q5;
public void setQ5(double q5)
this.q5 = q5;
public double getQmkup()
return qmkup;
public void setQmkup(double qmkup)
this.qmkup = qmkup;
public double getMidt()
return midt;
public void setMidt(double midt)
this.midt = midt;
public double getProbs()
return probs;
public void setProbs(double probs)
this.probs = probs;
public double getFinex()
return finex;
public void setFinex(double finex)
this.finex = finex;
public double getQavg()
calcStudent();
return qavg;
public double getCavg()
return cavg;
private void calcStudent()
double[] qs = q1, q2, q3, q4, q5, qmkup;
Arrays.sort(qs);
qavg = (qs[2] + qs[3] + qs [4] + qs[5]) / 4.0;
if (qavg >= 89.5 && midt >= 89.5 && probs >= 89.5)
cavg = (qavg+midt+probs) / 3.0;
lgrade = "A";
else
cavg = (qavg * .5) + (midt * .15) + (probs * .1) + (finex * .25);
if (cavg >= 89.5)
lgrade = "A";
else if (cavg >= 79.5)
lgrade = "B";
else if (cavg >= 69.5)
lgrade = "C";
else if (cavg >= 59.5)
lgrade = "D";
else
lgrade = "F";
@Override
public String toString()
String s = sid + "," + lnm + "," + fnm + "," +
q1 + "," + q2 + "," + q3 + "," + q4 + "," + q5 + "," +
qmkup + "," + midt + "," + probs + "," + finex;
return s;
这是我的 java 页面:
public class StudentIO
public static void addStudent(Student s, String path)
throws IOException
File f = new File(path);
PrintWriter out = new PrintWriter(new FileWriter(f,true));
out.println(s.toString());
out.close();
public static ArrayList<Student> getStudentList(String path)
throws IOException
BufferedReader in = new BufferedReader
(new FileReader(path));
ArrayList<Student> sList = new ArrayList<Student>();
String line = in.readLine();
String data[];
while (line != null)
data = line.split(",");
Student s = new Student();
s.setSid(data[0]);
s.setLnm(data[1]);
s.setFnm(data[2]);
s.setQ1(Double.parseDouble(data[3]));
s.setQ2(Double.parseDouble(data[4]));
s.setQ3(Double.parseDouble(data[5]));
s.setQ4(Double.parseDouble(data[6]));
s.setQ5(Double.parseDouble(data[7]));
s.setQmkup(Double.parseDouble(data[8]));
s.setMidt(Double.parseDouble(data[9]));
s.setProbs(Double.parseDouble(data[10]));
s.setFinex(Double.parseDouble(data[11]));
s.getSid();
s.getLnm();
s.getFnm();
s.getQ1();
s.getQ2();
s.getQ3();
s.getQ4();
s.getQ5();
s.getQmkup();
s.getMidt();
s.getProbs();
s.getFinex();
sList.addAll(Arrays.asList(s));
line = in.readLine();
in.close();
return sList;
这是我的 servlet:
public class ClassListServlet extends HttpServlet
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
response.setContentType("text/html;charset=UTF-8");
String emsg = "";
String path;
String URL = "/ClassList.jsp";
ArrayList<Student> stulist;
try
path = getServletContext().getRealPath("/WEB-INF/classlist.txt");
stulist = StudentIO.getStudentList(path);
request.setAttribute("stulist", stulist);
catch (Exception e)
emsg = "Process error: " +e.getMessage();
URL = "/students.jsp";
RequestDispatcher disp = getServletContext().getRequestDispatcher(URL);
disp.forward(request, response);
这里是 JSP 页面:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Class List</title>
</head>
<body>
<h1>Students on file:</h1>
<table>
<tr>
<th colspan="12"><br>Class List</th>
</tr>
<tr>
<th colspan="1">Student ID</th>
<th colspan="1">Last Name</th>
<th colspan="1">First Name</th>
<th colspan="1">Quiz 1</th>
<th colspan="1">Quiz 2</th>
<th colspan="1">Quiz 3</th>
<th colspan="1">Quiz 4</th>
<th colspan="1">Quiz 5</th>
<th colspan="1">Make-Up Quiz</th>
<th colspan="1">Midterm</th>
<th colspan="1">Problems</th>
<th colspan="1">Final</th>
</tr>
<%
ArrayList<Student> studt = (ArrayList<Student>)
request.getAttribute("stulist");
for (int i = 0; i < studt.size(); i++)
%>
<tr>
<td><%= studt.get(i) %></td>
</tr>
<% %>
</table>
<%
//cells and titles for each output field
//every time through loop will process each individual
//student object instead of string objects
%>
</body>
【问题讨论】:
好的,所以多余的实例消失了。我仍然只在每一行上输出每个学生对象数组的整个字符串。我不知道如何用每个单元格中的单个对象填充表格 而且输出仍然包含逗号分隔符。 【参考方案1】:当您在 StudentIO.java 中填充 sList 时,sList 是否包含文件中的所有行?尝试将 while 循环更改为:
while ( ( line = in.readLine( ) ) != null )
此外,您正在将 Student 对象转换为字符串,然后将其发送到您的 JSP。请传递完整的 List 对象,然后打印它。另外,您需要 colspan 属性:
<tr>
<td><%= studt.get(i) %></td>
</tr>
【讨论】:
是的,它返回文件的所有行,但不是将它们放在每个单元格中,而是将其作为字符串返回,就像从文本文件中读取的那样。我不确定我是否了解如何从 java 页面中跨 servlet 和 jsp 页面保留我的对象,以便我可以返回单元格中的每个对象而不是整个字符串。 正如上面 Sanjeev 和 Luis 的回答,您的 sList 对象不包含所有 Student 对象。 如何让它包含所有学生对象? 我已经删除了多余的 sList = new ArrayList您正在 getStudentList()
上创建 ArrayList
的实例
只需从该方法中删除此行sList = new ArrayList<Student>();
【讨论】:
【参考方案3】:问题出在getStudentList()
方法,不需要每次都新建一个ArrayList
。
sList = new ArrayList<Student>();
必须移出while循环
【讨论】:
以上是关于需要来自 txt 文件的数据,以逗号分隔,以使用现有类中的对象填充数组列表的主要内容,如果未能解决你的问题,请参考以下文章