资源描述
。
软 件 学 院
课程设计报告书
课程名称 JavaEE 课程设计
设计题目 试卷分析报告产生系统
专业班级 软件工程10-3班
学 号 1020010303
姓 名 韩飞
指导教师 刘佳旭
2013年01月
目录
1 设计时间
2013年1月21日-2013年1月23日
2 设计目的
JavaEE课程设计是对所学JavaEE与中间件课程的小结,是提高学生对所学知识综合应用能力的一种方式,是集中实践性环节之一。要求同学们对课程中所学习到的知识综合运用,开发有一定规模的Java Web程序。
3 设计任务
(1)功能描述:用户以合法身份登录系统后,才能进行所有操作;用户可以添加、查看和删除学生成绩;用户添加完所有学生的成绩后,统计出<60分、60<=成绩<75、75<=成绩<90、90<=成绩<=100这四个分数段的学生人数。
(2)添加学生成绩:学生添加成绩信息(包括学号、姓名、成绩);
(3)查看学生成绩
(4)删除学生成绩
(5)统计各分数段人数:统计出每个分数段的学生人数
4 设计内容
4.1需求分析
功能要求为:用户可以添加、删除、查看学生成绩,学生成绩中包括学号、姓名、成绩三项信息。
总体目标、
具体目标
系统数据建模
数据功能建模
图4-1为系统的数据流图,4-2为进一步分解后的数据流图。
图 4-1 数据流图
删除操作
统计操作
查看操作
返回
添加操作
返回数据
返回数据
要求统计
要求删除
用户信息
登陆
登陆
用户
添加
查看
删除
统计
用户信息
用户信息
登录
信息
要求添加
要求查看
图 4-2 详细数据流图
5 概要设计
5.1 数据库设计
图5-1为成绩的E-R图。
成绩表
学号
姓名
成绩
图5-1 E-R图
本程序使用的数据库系统为SQL Server 2000,数据库名称为“mydb”,数据表名称为“score”,表结构如表5-1所示。
成绩表(学号,姓名,成绩),主码为学号。
列名
数据类型
长度
允许空
备注
number
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-2 登陆程序流程图
开始
输入用户名和密码
LoginServlet
UserService
判断正误
Index.jsp
结束
Y
N
开始
ListAllScoresServlet
ScoreDAO.getAllScores()
访问数据库
ResuleSet
结束
ResuleSet
showAllScores.jsp
(2)图6-3为查看所有成绩流程图。
图 6-3 查看所有成绩流程图
(3)图6-4为查看添加成绩流程图。
图 6-4 添加成绩流程图
开始
addScore.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工程目录结构图
图7-4为Java Web工程student_score的截图。
“ScoreDAO.java”为和数据库交互,进行增、删、改、查操作。
“Score.java”代表成绩信息的实体类。
“Segment.java”代表成绩段信息的实体类。
“User.java”代表用户信息的实体类。
“UserService.java”判断用户登陆信息是否正确的业务层。
“AddScoreServlet.java”为接收页面表单数据并增加成绩信息的Servlet类,继承“HttpServlet”。
“ClassifyAllScoresServlet.java”为将数据库中成绩信息分类的Servlet类,继承“HttpServlet”。
“DeleteScoreServlet.java”为接收页面表单数据并删除相应成绩信息的Servlet类,继承“HttpServlet”。
“ListAllScoresServlet.java”为列出数据库中所有成绩信息的Servlet类,继承“HttpServlet”。
“LoginServlet.java”为接收页面表单登陆信息并验证用户信息的Servlet类,继承“HttpServlet”。
“DBConnection.java”为获得数据库连接的工具类。
“SQL Server JDBC Driver”为与数据库SQL Server 2005连接的驱动包。
“Web.xml”为配置Servlet中<servlet>元素和<servlet-mapping>元素的XML文件。
“addScore.jsp”为增加学生成绩的JSP页面。
“classifyAllScores.jsp”为分类学生成绩的JSP页面。
“deleteScore.jsp”为删除学生成绩的JSP页面。
“index.jsp”为主页面。
“login.jsp”为登陆页面。
“loginError.jsp”为登陆失败页面。
“showAllScores.jsp”为显示所有学生成绩的JSP页面。
7.3 工具类的实现
工具类名为“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);
}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)第一类的类名为“Score”,该类拥有代表成绩信息的私有属性以及各个属性的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方法,它的实现代码如下:
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 class 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技术实现,用于和数据库交互,进行相关的增、删、查、统计操作,它的实现代码如下:
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.executeQuery();
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();
} finally {
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 = "insert 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) {
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=?";
PreparedStatement 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 List 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<=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 Segment();
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();
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);
//第四段计数
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(SQLException 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”,该类用于接收页面表单中的数据并将数据传递到DAO类进行添加成绩操作,它的实现代码如下:
public class AddScoreServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, 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("id")!=null)
id=Integer.parseInt(request.getParameter("id"));
String name=(String)request.getParameter("name");
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 ScoreDAO();
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类的类名为“ClassifyAllScoresServlet”,该类继承了“HttpServlet”,用于DAO将成绩分类信息传递给“classifyAllScores.jsp”页面。实现代码如下:
public class ClassifyAllScoresServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ScoreDAO scoreDAO=new ScoreDAO();
List list=scoreDAO.classifyAllScores();
request.setAttribute("classifyAllScores", list);
request.getRequestDispatcher("/classifyAllScores.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
(3)第三个Servlet类的类名为“DeleteScoreServlet”,该类继承了“HttpServlet”,用于将JSP页面所要删除的成绩信息传递给DAO进行删除操作。实现代码如下:
public class DeleteScoreServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, 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("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.setAttribute("allScores", list);
request.getRequestDispatcher("/showAllScores.jsp").forward(request, response);
}
}
(4)第四个Servlet类的类名为“ListAllScoresServlet”,该类继承了“HttpServlet”,用于将DAO中所查询出的所有成绩信息传递给“showAllScores.jsp”页面。该类实现代码如下:
public class ListAllScoresServlet extends HttpServlet {
public void 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, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
(5)第五个Servlet类的类名为“LoginServelt”,该类继承了“HttpServlet”,用于将“login.jsp”页面内的表单信息传递给“UserService”进行判定。如果正确验证则将转到“index.jsp”页面,否则将转到“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("userpsw");
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("/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);
}
}
7.7 页面的实现
本程序有6个主要的页面。
(1)“login.jsp”页面包含一个由用户名文本框、密码框、提交按钮和重置按钮组成的表单。它的实现代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<body>
<form action="servlet/LoginServlet" method="get">
用户名称:<input type="text" name="username" value="" /><br/>
用户密码:<input type="password" name="userpsw" value="" /><br/>
<input type="submit" name="submit" value="登录" />
<input type="reset" name="reset" value="重写" />
</form>
</body>
</html>
(2)“index.jsp”页面包含“显示所有成绩”、“统计所有成绩”超链接,用于控制页面跳转。它的实现代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<body>
<a href="servlet/ListAllScoresServlet">显示所有成绩</a><br>
<a href="servlet/ClassifyAllScoresServlet">统计所有成绩</a><br>
</body>
</html>
(3)“showAllScores.jsp”页面包含成绩信息列表和添加、删除、返回三个超链接,用于实现“添加成绩”、“删除成绩”、“返回”三个功能。它的实现代码如下:
<%@ page language="java" import="java.util.*,domain.Score" pageEncoding="GBK"%>
<html>
<body>
<table border="1">
<tr>
<th>学号</th>
<th>姓名</th>
<th>成绩</th>
</tr>
<%
List list=(List)request.getAttribute("allScores");
for(Iterator it=list.iterator();it.hasNext();){
Score score=(Score)it.next();
%>
<tr>
<td><%=score.getId() %></td>
<td><%=score.getName() %></td>
<td><%=score.getScore() %></td>
</tr>
<%
}
%>
</table>
<a href="addScore.jsp">添加</a>
<a href="deleteScore.jsp">删除</a>
<a href="/student_score/index.jsp">返回</a>
</body>
</html>
(4)“addScore.jsp”页面包含学号文本框、姓名文本框、成绩文本框、提交按钮、返回超链接,用于数据添加到数据库。它的实现代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<body>
<form action="servlet/AddScoreServlet" method="post">
<table>
<tr><td>学号:</td><td><input type="text" name="id" /></td></tr>
<tr><td>姓名:</td><td><input type="text" name="name" /></td></tr>
<tr><td>成绩:</td><td><input type="text" name="score" /></td></tr>
<tr><td><input type="submit" name="submit" value="提交" /> <a href="/student_score/index.jsp">返回</a></td></tr>
</table>
</form>
</body>
</html>
(5)“deleteScore.jsp”页面包含一个学号文本框、一个删除按钮、一个返回超链接。用于对所填学号的删除。它的实现代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<body>
<form action="servlet/DeleteScoreServlet" method="post
展开阅读全文