【JavaWeb开发-Servlet】day05-学生成绩管理系统-实现添加、删除、修改、查询功能
前端stuList.jsp上的添加按钮跳转到的页面是addStu.jsp,其表单提交页面是addStu.do,也就是说在addStu.jsp写好学生信息后点击确认,表单会传递给addStu.do页面,此时addStu.do在Servlet层接收处理,通过实体类接收前端传递来的信息,在调用业务层方法将封装好的信息传递给dao层再存入数据库。在前端通过url传递参数,在servlet中从request
目录
①在stuDao.class中添加findByStuId函数
一、前端页面
1、对列表页面进行改进
stuList.jsp
<%@page import="sams.ck.entity.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.List,sams.ck.entity.*"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Student List</title>
</head>
<body>
<table width='500px' border='5px' >
<form action="stuList.do" method="post">
<input name="stuId" ><input type="submit" value="搜索">
</form>
 
<input type="button" class="button" value="添加" onclick="location='addStu.jsp'"/>
               
<input type="button" class="button" value="成绩查询" onclick="location='inquiryStu.jsp'"/>
<tr>
<td>学号</td>
<td>姓名</td>
<td>班级</td>
<td>语文</td>
<td>数学</td>
<td>英语</td>
<td>总分</td>
<td>操作</td>
</tr>
<%
//java代码
//到request中取出 绑定的数据
List<Student>stus=(List<Student>)request.getAttribute("stus");
//循环迭代 数据并显示
for(Student stu:stus){
%>
<tr>
<td>
<%=stu.getStuId() %>
</td>
<td>
<%=stu.getStuName() %>
</td>
<td>
<%=stu.getStuClass() %>
</td>
<td>
<%=stu.getChineseScore() %>
</td>
<td>
<%=stu.getMathScore() %>
</td>
<td>
<%=stu.getEnglisScore() %>
</td>
<td>
<%=stu.getEnglisScore()+stu.getMathScore()+stu.getChineseScore() %>
</td>
<td>
<input type="button" class="button" value="删除" onclick="location='delStu.do?stuId=<%=stu.getStuId() %>'"/>
<input type="button" class="button" value="修改" onclick="location='toUpdateStu.do?stuId=<%=stu.getStuId() %>'"/>
</td>
</tr>
<%} %>
</table>
</body>
</html>
启动服务查看页面效果:
二、项目开发
1、添加功能
①stuDao.class新建添加函数
//添加学生成绩信息
public void addStudent(Student stu) {
try {
//获取数据库连接
Connection conn = DBUtil.getConnection();
//定义SQL语句
String sql = "insert into students(number,name,class,chinese,math,english)values(?,?,?,?,?,?)";
//获取PreparedStatement对象
PreparedStatement prep = conn.prepareStatement(sql);
//添加占位符参数
prep.setString(1, stu.getStuId());
prep.setString(2, stu.getStuName());
prep.setString(3, stu.getStuClass());
prep.setDouble(4, stu.getChineseScore());
prep.setDouble(5, stu.getMathScore());
prep.setDouble(6, stu.getEnglisScore());
//执行SQL
prep.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
②在DaoTest.class中写个测试
package sams.ck.test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import sams.ck.dao.stuDao;
import sams.ck.entity.Student;
import sams.ck.service.stuService;
import sams.ck.util.DBUtil;
public class DaoTest {
public static void main(String[] args) {
stuDao dao = new stuDao();
Student stu = new Student();
stu.setStuId("20222002");
stu.setStuClass("2");
stu.setStuName("小红");
stu.setChineseScore(100.0);
stu.setMathScore(100.0);
stu.setEnglisScore(99.0);
dao.addStudent(stu);
System.out.println("添加成功");
List<Student> stus= dao.findAllStudents();
for(Student s:stus){
System.out.println(s);
}
}
}
查看测试结果:
③在业务层stuService.class新建添加函数
//添加学生成绩信息
public void stuAdd(Student stu) {
dao.addStudent(stu);
}
④写一个前端添加页面
addStu.jsp
<%@page import="sams.ck.entity.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.List,sams.ck.entity.*"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Add Student</title>
</head>
<body>
<div>
<div>
<div>
<h1>
添加学生信息:
</h1>
<form action="addStu.do" method="post">
<table cellpadding="0" cellspacing="0" border="0"
class="form_table">
<tr>
<td valign="middle" align="right">
学号:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="stuId" />
</td>
</tr>
<tr>
<td valign="middle" align="right">
姓名:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="stuName" />
</td>
</tr>
<tr>
<td valign="middle" align="right">
班级:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="stuClass" />
</td>
</tr>
<tr>
<td valign="middle" align="right">
语文:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="ChineseScore" />
</td>
</tr>
<tr>
<td valign="middle" align="right">
数学:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="MathScore" />
</td>
</tr>
<tr>
<td valign="middle" align="right">
英语:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="EnglishScore" />
</td>
</tr>
</table>
<p>
<input type="submit" class="button" value="确认" />
</p>
</form>
</div>
</div>
</div>
</body>
</html>
⑤编辑stuServlet.class
else if(path.equals("/addStu")) {
// 获取前端浏览器传递过来的员工信息
String stuId = request.getParameter("stuId");//学号
String stuName = request.getParameter("stuName");//姓名
String stuClass = request.getParameter("stuClass");//班级
double ChineseScore = Double.parseDouble(request.getParameter("ChineseScore"));//语文
double MathScore = Double.parseDouble(request.getParameter("MathScore"));//数学
double EnglishScore = Double.parseDouble(request.getParameter("EnglishScore"));//英语
// 将获取的前端传递的参数封装到Stu对象当中
Student Stu = new Student();
Stu.setStuId(stuId);
Stu.setStuName(stuName);
Stu.setStuClass(stuClass);
Stu.setChineseScore(ChineseScore);
Stu.setMathScore(MathScore);
Stu.setEnglisScore(EnglishScore);
//调用业务层代码提交给数据库
service.stuAdd(Stu);
// 添加成功后将页面重定向会 信息展示页
response.sendRedirect("stuList.do");
}
⑥测试
启动服务,搜索网址:http://127.0.0.1:8080/StudentAchievementManagementSystem/stuList.do
点击添加按钮到达addStu.jsp页面,添加学生信息:
点击确认按钮,将信息传递到addStu.do中,addStu.do会通过Servlet默认处理,处理完在返回给stuList.jsp显示在列表页面上:
**需要注意的是,开发过程中一定要理清逻辑。
在stuList.do页面,Servlet执行的功能是将数据库里的信息全部展示在当前页面。重点是前后端绑定同一个学生信息的数组。然后调用业务层代码取出数据库中的所有信息,通过实体类数组将学生成绩信息转发给前端页面。
前端stuList.jsp上的添加按钮跳转到的页面是addStu.jsp,其表单提交页面是addStu.do,也就是说在addStu.jsp写好学生信息后点击确认,表单会传递给addStu.do页面,此时addStu.do在Servlet层接收处理,通过实体类接收前端传递来的信息,在调用业务层方法将封装好的信息传递给dao层再存入数据库。此时再进行页面跳转,回到stuList.do页面,也就是从数据库中显示全部学生信息,若看到新添加的学生信息,添加成功。
2、删除功能
①新建DAO层删除方法
stuDao.class
//删除学生成绩信息
public void deleteStudent(String stuId) {
try {
//获取数据库连接
Connection conn = DBUtil.getConnection();
//定义SQL语句
String sql = "delete from students where number=?";
//获取PreparedStatement对象
PreparedStatement prep = conn.prepareStatement(sql);
//将传递的参数 注入到占位符中
prep.setString(1,stuId);
//执行SQL
prep.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
②在test层进行测试
daoTest.class
package sams.ck.test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import sams.ck.dao.stuDao;
import sams.ck.entity.Student;
import sams.ck.service.stuService;
import sams.ck.util.DBUtil;
public class DaoTest {
public static void main(String[] args) {
stuDao dao = new stuDao();
String stuId = "20222003";
dao.deleteStudent(stuId);
System.out.println("删除成功");
List<Student> stus= dao.findAllStudents();
for(Student s:stus){
System.out.println(s);
}
}
}
输出显示, 学号为20222003的小明已经被删除了
③在service层写一个删除业务
//删除学生成绩信息
public void stuDel(String stuId) {
dao.deleteStudent(stuId);
}
④修改stuList.jsp删除按钮
<td>
<input type="button" class="button" value="删除" onclick="location='delStu.do?stuId=<%=stu.getStuId() %>'"/>
<input type="button" class="button" value="修改" onclick="location='toUpdateStu.do?stuId=<%=stu.getStuId() %>'"/>
</td>
⑤在Servlet层写delStu.do逻辑
else if(path.equals("/delStu")) {
// 服务端获取浏览器端传递的参数
String stuId = request.getParameter("stuId");
//调用业务层删除函数
service.stuDel(stuId);
// 使用重定向技术 完成页面的跳转
response.sendRedirect("stuList.do");
}
⑥测试与思路
测试:
启动服务访问页面:http://127.0.0.1:8080/StudentAchievementManagementSystem/stuList.do
点击删除小红:
删除后:
思路:
首先在dao层写一个操作数据库的删除逻辑,删除的条件是学生的学号,因为学号是唯一的,以此为条件,可以防止误删其他信息。
然后在业务层写一个删除函数,实际上就是调用dao层的功能,函数的参数依旧是学生学号。
接下来我们修改前端学生信息列表页面,将删除按钮绑定跳转页面和学生学号。这里默认的是使用get方法,也就是跳转的路径和stuId参数都会在url中显示,但是不用担心,我们在Servlet层处理delStu.do时使用重定向技术返回到了stuList.do页面,用户是无法看到delStu.do页面的,也更看不到url参数。当然也可以选用post的请求方式传递参数。
处理好前端后,我们来到Servlet层,当前端请求到delStu.do时,Servlet在此页面中实现了删除功能(调用业务层函数,学生学号参数通过request从前端获取),然后立刻重定向回到学生信息列表页面。
3、修改功能
(1)根据学生ID获取学生信息
①在stuDao.class中添加findByStuId函数
修改学生信息前提是通过要修改的学生学号获取学生信息
//修改学生信息前提是通过要修改的学生学号获取学生信息
public Student findByStuId(String stuId) {
Student stu = null;
try {
//获取数据库连接
Connection conn = DBUtil.getConnection();
//定义SQL语句
String sql = "select * from students where number=?";
//获取PreparedStatement对象
PreparedStatement prep = conn.prepareStatement(sql);
//将传递的参数 注入到占位符中
prep.setString(1,stuId);
//执行SQL获取结果集对象
ResultSet rs = prep.executeQuery();
while (rs.next()) {
stu = new Student();
stu.setStuId(rs.getString("number"));
stu.setStuName(rs.getString("name"));
stu.setStuClass(rs.getString("class"));
stu.setChineseScore(rs.getDouble("chinese"));
stu.setEnglisScore(rs.getDouble("english"));
stu.setMathScore(rs.getDouble("math"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return stu;
}
②在DaoTest.class中进行测试
package sams.ck.test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import sams.ck.dao.stuDao;
import sams.ck.entity.Student;
import sams.ck.service.stuService;
import sams.ck.util.DBUtil;
public class DaoTest {
public static void main(String[] args) {
stuDao dao = new stuDao();
String stuId = "20221001";
Student stu = new Student();
stu = dao.findByStuId(stuId);
System.out.println(stu+"查询成功");
}
}
输出的20221001学号的学生信息,测试成功。
③在stuService.class新建查询函数
//查询某个学生信息
public Student findByStuId(String stuId){
Student stu=dao.findByStuId(stuId);
return stu;
}
④在stuServlet.class中新建分支
else if (path.equals("/toUpdateStu")) {
// 获取前端产地过来的stuId值
String stuId = request.getParameter("stuId");//学号
Student stu = service.findByStuId(stuId);
// 将查询出的数据绑定到request对象中
request.setAttribute("stu", stu);
// 转发到updateStu.jsp页面
request.getRequestDispatcher("updateStu.jsp").forward(request, response);
}
⑤编写updateStu.jsp
<%@page import="sams.ck.entity.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.List,sams.ck.entity.*"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Update Student</title>
</head>
<body>
<div>
<div>
<div>
<h1>
修改学生信息:
</h1>
<form action="updateStu.do" method="post">
<%
Student stu=(Student)request.getAttribute("stu");
%>
<table cellpadding="0" cellspacing="0" border="0"
class="form_table">
<tr>
<td valign="middle" align="right">
学号:
</td>
<td valign="middle" align="left">
<%=stu.getStuId() %>
<input type="hidden" name="stuId" value="<%=stu.getStuId() %>"/>
</td>
</tr>
<tr>
<td valign="middle" align="right">
姓名:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="stuName" value="<%=stu.getStuName() %>"/>
</td>
</tr>
<tr>
<td valign="middle" align="right">
班级:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="stuClass" value="<%=stu.getStuClass() %>"/>
</td>
</tr>
<tr>
<td valign="middle" align="right">
语文:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="ChineseScore" value="<%=stu.getChineseScore() %>"/>
</td>
</tr>
<tr>
<td valign="middle" align="right">
数学:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="MathScore" value="<%=stu.getMathScore() %>"/>
</td>
</tr>
<tr>
<td valign="middle" align="right">
英语:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="EnglishScore" value="<%=stu.getEnglisScore() %>"/>
</td>
</tr>
</table>
<p>
<input type="submit" class="button" value="确认" />
</p>
</form>
</div>
</div>
</div>
</body>
</html>
此处的stu与Servlet中的stu是相互绑定的
测试:
在成绩列表点击修改按钮
可以看到修改页面显示学生信息
(如果不想在url看到参数请将按钮提交方式改为post)
测试成功。
(2)提交已修改的学生信息
①在stuDao.class写修改方法
//修改学生信息
public void updateStudent(Student stu) {
try {
//获取数据库连接
Connection conn = DBUtil.getConnection();
//定义SQL语句
String sql = "update students set name=?,class=?,chinese=?,math=?,english=? where number=?";
//获取PreparedStatement对象
PreparedStatement prep = conn.prepareStatement(sql);
//将传递的参数 注入到占位符中
prep.setString(1,stu.getStuName());
prep.setString(2,stu.getStuClass());
prep.setDouble(3,stu.getChineseScore());
prep.setDouble(4,stu.getMathScore());
prep.setDouble(5,stu.getEnglisScore());
prep.setString(6,stu.getStuId());
//执行SQL获取结果集对象
prep.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
②在DaoTest,class中进行测试
package sams.ck.test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import sams.ck.dao.stuDao;
import sams.ck.entity.Student;
import sams.ck.service.stuService;
import sams.ck.util.DBUtil;
public class DaoTest {
public static void main(String[] args) {
stuDao dao = new stuDao();
String stuId = "20221001";
Student stu = new Student();
stu = dao.findByStuId(stuId);
System.out.println("修改前:"+stu);
stu.setChineseScore(0.0);
stu.setEnglisScore(0.0);
stu.setMathScore(0.0);
dao.updateStudent(stu);
System.out.println("修改后:"+stu);
}
}
测试结果显示,修改成功:
③在service实现修改业务
//修改学生信息
public void updateStu(Student stu){
dao.updateStudent(stu);
}
④在Servlet新建处理修改请求的分支
else if (path.equals("/updateStu")) {
// 获取请求参数
String stuId = request.getParameter("stuId");//学号
String stuName = request.getParameter("stuName");//姓名
String stuClass = request.getParameter("stuClass");//班级
double ChineseScore = Double.parseDouble(request.getParameter("ChineseScore"));//语文
double MathScore = Double.parseDouble(request.getParameter("MathScore"));//数学
double EnglishScore = Double.parseDouble(request.getParameter("EnglishScore"));//英语
// 封装数据
Student Stu = new Student();
Stu.setStuId(stuId);
Stu.setStuName(stuName);
Stu.setStuClass(stuClass);
Stu.setChineseScore(ChineseScore);
Stu.setMathScore(MathScore);
Stu.setEnglisScore(EnglishScore);
//实现修改业务
service.updateStu(Stu);
// 重定向回列表显示页面
response.sendRedirect("stuList.do");
}
⑤测试与思路
测试:
思路:
修改学生信息,首先要通过修改学生的id获取全部需要修改的学生信息。在dao层实现通过学生id对学生信息的查找。在前端通过url传递参数,在servlet中从request中获取前端传递来的参数,再通过业务层对象调取dao层方法,将此id全部学生信息显示在修改页面。总而言之,就是从前端获取学生id,通过后端查询id并显示在页面上。
数据正常显示后,再将前端修改后的信息传递给Servlet层,Servlet层通过调用后端的更新方法来提交给数据库,并重定向会前端列表界面。
4、成绩查询
新的页面:输入学号、显示姓名、语文、数学、英语、总分。
①在stuDao.class中新建查询函数
//查询学生成绩
public Student seleStudent(String stuId) {
Student stu = null;
try {
//获取数据库连接
Connection conn = DBUtil.getConnection();
//定义SQL语句
String sql = "select name,Chinese,Math,English FROM students WHERE number=?";
//获取PreparedStatement对象
PreparedStatement prep = conn.prepareStatement(sql);
//将传递的参数 注入到占位符中
prep.setString(1,stuId);
//执行SQL获取结果集对象
ResultSet rs = prep.executeQuery();
while (rs.next()) {
stu = new Student();
stu.setStuName(rs.getString("name"));
stu.setChineseScore(rs.getDouble("chinese"));
stu.setEnglisScore(rs.getDouble("english"));
stu.setMathScore(rs.getDouble("math"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return stu;
}
②在DaoTest.class中进行测试
package sams.ck.test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import sams.ck.dao.stuDao;
import sams.ck.entity.Student;
import sams.ck.service.stuService;
import sams.ck.util.DBUtil;
public class DaoTest {
public static void main(String[] args) {
stuDao dao = new stuDao();
String stuId = "20221001";
Student stu = new Student();
stu = dao.seleStudent(stuId);
System.out.println(stu);
}
}
测试结果,查询成功:
③修改stuList.jsq的搜索框
<form action="toInquiryStu.do" method="post">
<input placeholder="请输入您的学号" name="stuId" ><input type="submit" value="查询">
</form>
④创建一个查询页面
InquiryStu.jsp
<%@page import="sams.ck.service.stuService"%>
<%@page import="sams.ck.entity.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.List,sams.ck.entity.*"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Update Student</title>
</head>
<body>
<div>
<div>
<div>
<h1>
查询学生成绩:
</h1>
<form action="stuList.do" method="post">
<%
Student stu=(Student)request.getAttribute("stu");
%>
<table cellpadding="0" cellspacing="0" border="0"
class="form_table">
<tr>
<td valign="middle" align="right">
学生姓名:
</td>
<td valign="middle" align="left">
<input type="text" name="stUName" value="<%=stu.getStuName() %>" readonly="readonly"/>
</td>
</tr>
<tr>
<td valign="middle" align="right">
语文分数:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="ChineseScore" value="<%=stu.getChineseScore() %>" readonly="readonly"/>
</td>
</tr>
<tr>
<td valign="middle" align="right">
数学分数:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="MathScore" value="<%=stu.getMathScore() %>" readonly="readonly"/>
</td>
</tr>
<tr>
<td valign="middle" align="right">
英语分数:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="EnglishScore" value="<%=stu.getEnglisScore() %>" readonly="readonly"/>
</td>
</tr>
<tr>
<td valign="middle" align="right">
总分数:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="totalScore" value="<%=stu.getChineseScore()+stu.getMathScore()+stu.getEnglisScore() %>" readonly="readonly"/>
</td>
</tr>
</table>
<p>
<input type="submit" class="button" value="返回" />
</p>
</form>
</div>
</div>
</div>
</body>
</html>
⑤实现Servlet层功能
else if (path.equals("/toInquiryStu")) {
// 服务端获取浏览器端传递的参数
String stuId = request.getParameter("stuId");
//调用业务层的查询方法
Student stu = service.selecStudent(stuId);
//将查询结果传给前端
// 将查询出的数据绑定到request对象中
request.setAttribute("stu", stu);
// 转发到inquiryStu.jsp页面
request.getRequestDispatcher("inquiryStu.jsp").forward(request, response);
}
⑥测试与思路
测试:
输入学号
查询页面
思路:
- dao层根据学号查询学生成绩信息:语文、数学、英语、总分的分数。
- service层调用dao层。
- 前端 jsp 页面把输入的学号传递给Servlet,Servlet拿着学号去业务层调方法取得数据库中的分数信息,再通过转发技术将参数返回给前端查询页面。
更多推荐
所有评论(0)