1、 软 件 学 院 课程设计报告书 课程名称 JavaEE 课程设计 设计题目 试卷分析报告产生系统 专业班级 软件工程10-3班 学 号 1020010303 姓 名 韩飞 指导教师 刘佳旭 2013年01月
2、目录 1 设计时间 2013年1月21日-2013年1月23日 2 设计目的 JavaEE课程设计是对所学JavaEE与中间件课程的小结,是提高学生对所学知识综合应用能力的一种方式,是集中实践性环节之一。要求同学们对课程中所学习到的知识综合运用,开发有一定规模的Java Web程序。 3 设计任务 (1)功能描述:用户以合法身份登录系统后,才能进行所有操作;用户可以添加、查看和删除学生成绩;用户添加完所有学生的成绩后
3、统计出<60分、60<=成绩<75、75<=成绩<90、90<=成绩<=100这四个分数段的学生人数。 (2)添加学生成绩:学生添加成绩信息(包括学号、姓名、成绩); (3)查看学生成绩 (4)删除学生成绩 (5)统计各分数段人数:统计出每个分数段的学生人数 4 设计内容 4.1需求分析 功能要求为:用户可以添加、删除、查看学生成绩,学生成绩中包括学号、姓名、成绩三项信息。 总体目标、 具体目标 系统数据建模 数据功能建模 图4-1为系统的数据流图,4-2为进一步分解后的数据流图。 图 4-1 数据流图 删除操作 统计操作 查看操作 返回 添加操作
4、返回数据 返回数据 要求统计 要求删除 用户信息 登陆 登陆 用户 添加 查看 删除 统计 用户信息 用户信息 登录 信息 要求添加 要求查看 图 4-2 详细数据流图 5 概要设计 5.1 数据库设计 图5-1为成绩的E-R图。 成绩表 学号 姓名 成绩 图5-1 E-R图 本程序使用的数据库系统为SQL Server 2000,数据库名称为“mydb”,数据表名称为“score”,表结构如表5-1所示。 成绩表(学号,姓名,成绩),主码为学号。 列名 数据类型 长度 允许空 备注 number
5、Varchar 50 Y 学号 name varchar 50 Y 姓名 score int 4 Y 成绩 表4-1 成绩表详细设计 5.2 层次结构图 图 5-2 层次结构图 6 详细设计 6.1 程序流程图 图6-1为整个系统的程序流程图。 开始 输入用户名和密码 判断正误 显示成绩 添加成绩 删除成绩 成绩分类 显示成绩 成绩分类 添加成绩 删除成绩 结束 Y Y Y Y Y N N N N N 图 6-1 程序流程图 6.2 模块程序流程图 (1)图6-2为登陆流
6、程图。 图 6-2 登陆程序流程图 开始 输入用户名和密码 LoginServlet UserService 判断正误 Index.jsp 结束 Y N 开始 ListAllScoresServlet ScoreDAO.getAllScores() 访问数据库 ResuleSet 结束 ResuleSet showAllScores.jsp (2)图6-3为查看所有成绩流程图。 图 6-3 查看所有成绩流程图 (3)图6-4为查看添加成绩流程图。 图 6-4 添加成绩流程图 开始 addSc
7、ore.jsp AddScoreServlet ScoreDAO.addScore() 访问数据库 结束 showAllScores.jsp (4)图6-5为查看删除成绩流程图。 图 6-5 删除成绩流程图 (5)图6-6为查看成绩分类流程图。 图 6-6 查看成绩分类流程图 7 编码与实现 7.1 数据库的实现 图7-1为数据库创建截图,其中t_chengji表为所创建的成绩表。 图7-1 数据库创建 图7-2为成绩表的设计。 图7-2 成绩表实现 7.2 创建Java Web工程 图7-4 Java Web
8、工程目录结构图 图7-4为Java Web工程student_score的截图。 “ScoreDAO.java”为和数据库交互,进行增、删、改、查操作。 “Score.java”代表成绩信息的实体类。 “Segment.java”代表成绩段信息的实体类。 “User.java”代表用户信息的实体类。 “UserService.java”判断用户登陆信息是否正确的业务层。 “AddScoreServlet.java”为接收页面表单数据并增加成绩信息的Servlet类,继承“HttpServlet”。 “ClassifyAllScoresServlet.java”为将数据库中成绩信
9、息分类的Servlet类,继承“HttpServlet”。 “DeleteScoreServlet.java”为接收页面表单数据并删除相应成绩信息的Servlet类,继承“HttpServlet”。 “ListAllScoresServlet.java”为列出数据库中所有成绩信息的Servlet类,继承“HttpServlet”。 “LoginServlet.java”为接收页面表单登陆信息并验证用户信息的Servlet类,继承“HttpServlet”。 “DBConnection.java”为获得数据库连接的工具类。 “SQL Server JDBC Driver”为与数据库SQ
10、L Server 2005连接的驱动包。
“Web.xml”为配置Servlet中
11、为“DBConnection”,该类用于获得数据库的连接,它的实现代码如下: public class DBConnection { public static Connection getConnection(){ final String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver"; final String url="jdbc:sqlserver://localhost:1433;databasename=mydb"; try{ Class.forName(driverName);
12、 }catch(ClassNotFoundException e){ e.printStackTrace(); } try{ Connection con=DriverManager.getConnection(url, "sa", "sa"); con.setAutoCommit(false); return con; }catch(SQLException e){ e.printStackTrace(); } return null; } } 7.4 实体类的实现 实体类有三类。 (1)第一类的类名为“Sc
13、ore”,该类拥有代表成绩信息的私有属性以及各个属性的set、get方法,它的实现代码如下: public class Score { private int id; private String name; private int score; public int getId() { return id; } public void setId(int id) { this.id = id; } //省略其他的get、set方法 } (2)第二类的类名为“Segment”, 该类拥有代表成绩分类信息的私有属性以及各个属性的set、get方法,
14、它的实现代码如下: public class Segment { private String segment; private int num; public String getSegment() { return segment; } public void setSegment(String segment) { this.segment = segment; } //省略其他的get、set方法 } (3)第三类的类名为“User”,该类拥有代表用户信息的私有属性以及各个属性的set、get方法,它的实现代码如下: public clas
15、s User { private String username; private String userpsw; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } //省略其他的get、set方法 } 7.5 DAO类的实现 DAO类的类名为“ScoreDao”,该类使用JDBC技术实现,用于和数据库交互,进行相关的增、删、查、统计操作,它的实现代码如下:
16、public class ScoreDAO { //查询所有成绩信息 public List getAllScores() { Connection con = DBConnection.getConnection(); String listSQL = "select * from scores"; List list = new ArrayList(); try { PreparedStatement psmt = con.prepareStatement(listSQL); ResultSet rs = psmt.executeQuer
17、y(); while (rs.next()) { Score score = new Score(); score.setId(rs.getInt("id")); score.setName(rs.getString("name")); score.setScore(rs.getInt("score")); list.add(score); } mit(); return list; } catch (SQLException e) { e.printStackTrace(); } final
18、ly { if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } return null; } //添加成绩信息 public boolean addScore(Score score) throws Exception { Connection con = DBConnection.getConnection(); String listSQL = "ins
19、ert into scores values(?,?,?)"; PreparedStatement pstmt = con.prepareStatement(listSQL); try { pstmt.setInt(1, score.getId()); pstmt.setString(2, score.getName()); pstmt.setInt(3, score.getScore()); pstmt.executeUpdate(); mit(); return true; } catch (SQLException e)
20、{ con.rollback(); e.printStackTrace(); } finally { con.close(); } return false; } //删除成绩信息 public boolean deleteScore(Score score) throws Exception { Connection con = DBConnection.getConnection(); String listSQL = "delete from scores where id=?"; PreparedStateme
21、nt pstmt = con.prepareStatement(listSQL); try { pstmt.setInt(1, score.getId()); pstmt.executeUpdate(); mit(); return true; } catch (SQLException e) { con.rollback(); e.printStackTrace(); } finally { con.close(); } return false; } //成绩分类查询 public Lis
22、t classifyAllScores(){ Connection con = DBConnection.getConnection(); List list = new ArrayList(); try{ PreparedStatement psmt1 = con.prepareStatement("select * from scores where 0<=score and score<60"); PreparedStatement psmt2 = con.prepareStatement("select * from scores where 60<=
23、score and score<75"); PreparedStatement psmt3 = con.prepareStatement("select * from scores where 75<=score and score<90"); PreparedStatement psmt4 = con.prepareStatement("select * from scores where 90<=score and score<=100"); Segment segment1=new Segment(); Segment segment2=new Seg
24、ment(); Segment segment3=new Segment(); Segment segment4=new Segment(); //第一段计数 ResultSet rs = psmt1.executeQuery(); int count=0; while(rs.next()){ count++; } segment1.setSegment("0<=score<60"); segment1.setNum(count); //第二段计数 rs = psmt2.executeQuery(
25、); count=0; while(rs.next()){ count++; } segment2.setSegment("60<=score<75"); segment2.setNum(count); //第三段计数 rs = psmt3.executeQuery(); count=0; while(rs.next()){ count++; } segment3.setSegment("75<=score<90"); segment3.setNum(count); //
26、第四段计数 rs = psmt4.executeQuery(); count=0; while(rs.next()){ count++; } segment4.setSegment("90<=score<=100"); segment4.setNum(count); list.add(segment1); list.add(segment2); list.add(segment3); list.add(segment4); mit(); return list; }catch(SQL
27、Exception e){ e.printStackTrace(); }finally { if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } return null; } } 7.6 Servlet类的实现 Servlet类共有5个类。 (1)第一个Servlet类的类名为“AddScoreServlet”,该类继承了“HttpServlet”,该类用于接
28、收页面表单中的数据并将数据传递到DAO类进行添加成绩操作,它的实现代码如下: public class AddScoreServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpSe
29、rvletResponse response) throws ServletException, IOException { request.setCharacterEncoding("GBK"); int id=0; if(!request.getParameter("id").equals("")&&request.getParameter("id")!=null) id=Integer.parseInt(request.getParameter("id")); String name=(String)request.getParameter("na
30、me"); int score=0; if(!request.getParameter("score").equals("")&&request.getParameter("score")!=null) score=Integer.parseInt(request.getParameter("score")); Score score1=new Score(); score1.setId(id); score1.setName(name); score1.setScore(score); ScoreDAO scoreDAO=new ScoreDA
31、O(); try{ scoreDAO.addScore(score1); }catch(Exception e){ e.printStackTrace(); } List list=scoreDAO.getAllScores(); request.setAttribute("allScores", list); request.getRequestDispatcher("/showAllScores.jsp").forward(request, response); } } (2)第二个Servlet类的类名为“ClassifyAll
32、ScoresServlet”,该类继承了“HttpServlet”,用于DAO将成绩分类信息传递给“classifyAllScores.jsp”页面。实现代码如下: public class ClassifyAllScoresServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ScoreDAO scoreDAO=new ScoreDAO()
33、 List list=scoreDAO.classifyAllScores(); request.setAttribute("classifyAllScores", list); request.getRequestDispatcher("/classifyAllScores.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOExc
34、eption { this.doGet(request, response); } } (3)第三个Servlet类的类名为“DeleteScoreServlet”,该类继承了“HttpServlet”,用于将JSP页面所要删除的成绩信息传递给DAO进行删除操作。实现代码如下: public class DeleteScoreServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletEx
35、ception, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("GBK"); int id = 0; if(!request.getParameter("id").equals("")&&request.getParameter(
36、"id")!=null) id=Integer.parseInt(request.getParameter("id")); Score score=new Score(); score.setId(id); ScoreDAO scoreDAO=new ScoreDAO(); try{ scoreDAO.deleteScore(score); }catch(Exception e){ e.printStackTrace(); } List list=scoreDAO.getAllScores(); request.setAt
37、tribute("allScores", list); request.getRequestDispatcher("/showAllScores.jsp").forward(request, response); } } (4)第四个Servlet类的类名为“ListAllScoresServlet”,该类继承了“HttpServlet”,用于将DAO中所查询出的所有成绩信息传递给“showAllScores.jsp”页面。该类实现代码如下: public class ListAllScoresServlet extends HttpServlet { public voi
38、d doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ScoreDAO scoreDAO=new ScoreDAO(); List list=scoreDAO.getAllScores(); request.setAttribute("allScores", list); request.getRequestDispatcher("/showAllScores.jsp").forward(request, r
39、esponse); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } } (5)第五个Servlet类的类名为“LoginServelt”,该类继承了“HttpServlet”,用于将“login.jsp”页面内的表单信息传递给“UserService”进行判定。如果正确验证则将转到“index.jsp”页面,否则将
40、转到“loginError.jsp”页面。该类实现代码如下: public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username=request.getParameter("username"); String userpsw=request.getParameter("userps
41、w"); User user =new User(); user.setUsername(username); user.setUserpsw(userpsw); UserService userService=new UserService(); if(userService.CheckLogin(user)){ HttpSession session =request.getSession(); session.setAttribute("name", username); request.getRequestDispatcher("/
42、index.jsp").forward(request, response); }else{ request.getRequestDispatcher("/loginError.jsp").forward(request, response); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request,response); } }
43、 7.7 页面的实现 本程序有6个主要的页面。 (1)“login.jsp”页面包含一个由用户名文本框、密码框、提交按钮和重置按钮组成的表单。它的实现代码如下: <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
(2)“index.jsp”页面包含“显示所有成绩”、“统计所有成绩”超链接,用于控制页面跳转。它的实现代码如下: <%@ page language="java" import="java.util.*"45、 pageEncoding="GBK"%>
显示所有成绩46、rt="java.util.*,domain.Score" pageEncoding="GBK"%>
学号 | 姓名 | 成绩 |
---|---|---|
<%=score.getId() %> | <%=score.getName() %> | <%=score.getScore() %> |
48、 返回 (4)“addScore.jsp”页面包含学号文本框、姓名文本框、成绩文本框、提交按钮、返回超链接,用于数据添加到数据库。它的实现代码如下: <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
(5)“deleteScore.jsp”页面包含一个学号文本框、一个删除按钮、一个返回超链接。用于对所填学号的删除。它的实现代码如下: <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>