1、项目名称:学生成绩管理系统
2、技术要求:Java、Servlet、JSP、HTML5、JavaScript、Css
3、编译环境:JDK1.8、eclipse2022、TomCat9.0
4、基本功能:增、删、改、查、分页、登录、注册
目录
一、创建项目
(1)首先关联TomCat服务器
(2)创建一个NewDynamicWebProject
(3)导入Servlet-api.jar包
(4)修改jdk版本(这里只是提供一个切换版本的方法不必跟做)
(5)导入数据库驱动jar包
二、构建项目文件层结构
(1)思想模型
(2)包结构
3、动手开发项目
(1)连接数据库
① 在util包中创建DBUtil类
②在test包里写一个测试类测试数据库是否连接成功
(2)创建一个学生实体类
(3)创建一个DAO类
(4)创建一个服务类编辑
(5)创建一个Servlet类
(6)创建一个stuList.jsp类
(7)编辑部署文件
(8)运行servers进行测试
一、创建项目
(1)首先关联TomCat服务器
【JavaWeb开发-Servlet】day02-使用eclipse实现Servlet开发_代码骑士的博客-CSDN博客免安装版本:安装版(下载时务必选择Java Web Project): 点击菜单栏window->选择Preferences->在·搜索框中输入Server->选择Runtime Environments-> 点击Add按钮-> 找到对应的服务器版本(下面的复选框先不用选)->点击Next ->填好服务器和JDK的环境路径->点击finish 状态栏显示服务后,点击OK,Tomcat服务器就添加进来了。 ->点击菜单栏window->选择Show VIew->在other中找到serverhttps://blog.csdn.net/qq_51701007/article/details/128204403?spm=1001.2014.3001.5501
(2)创建一个NewDynamicWebProject

 (3)导入Servlet-api.jar包
 (3)导入Servlet-api.jar包
 

 (4)修改jdk版本(这里只是提供一个切换版本的方法不必跟做)
 (4)修改jdk版本(这里只是提供一个切换版本的方法不必跟做)
 
双击

选择jdk1.8

点击Install JRE,选择本地jdk,如果没有就添加一个。

然后点击Aplay,就更换完成了。

(5)导入数据库驱动jar包
拖拽(copied)

显示,完成

二、构建项目文件层结构
(1)思想模型
在编程当中 我们使用MVC思想来指导对于项目的分共
M:model模型
数据模型:与数据库访问相关的代码
一般称为DAO层
业务模型:与业务逻辑相关的代码
一般称为service层C: controller控制器
与请求调度相关的逻辑
现阶端Servlet充当控制器V: view视图
数据显示逻辑 JSP
(2)包结构

详细说明各层功能:
DAO层是一个用于与数据库交互的层,用于检索和存储数据。
实体层代表被存储的数据,如用户信息或产品详情。
服务层提供应用程序的业务逻辑,如执行计算或处理请求。
Servlet层是一种Java基础的Web技术,用于处理客户端请求和生成动态Web内容。
工具层通常包含提供整个应用程序使用的常用功能的工具类。
3、动手开发项目
(1)连接数据库
        数据库和表的建立参考之前写过的博客:【JavaWeb开发-Servlet】day03-URL参数传递与MySQL数据库连接_代码骑士的博客-CSDN博客(4)编写loginServlet.class(5)编写web.xml(6)输入带有参数的网址,进行测试http://127.0.0.1:8080/firsttest/login?name=zs&pwd=1234 http://127.0.0.1:8080/firsttest/login?name=zs&pwd=123 首先在电脑上安装5.0版本的MySQL数据库 在安装一个数据库可视化管理工具:将下载好的驱动包(此处的驱动必须和mysql版本相对应)拖入https://codeknight.blog.csdn.net/article/details/128216416?spm=1001.2014.3001.5502        在test数据库中我们设计了一张学生表 

并在表中插入了样例数据
 
下面我们就来通过代码,建立数据库的连接。
① 在util包中创建DBUtil类

DBUtil.class
因为我的数据库驱动是mysql5.0版本,所以连接代码如下:
package sams.ck.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.catalina.mbeans.ClassNameMBean;
public class DBUtil {
	//定义一个静态方法,获取数据库连接对象。
	//静态方法的好处是可以根据类名.方法名直接调用,不需要new一个对象
	//注意这里Connection导的包是:java.sql.Connection;
	public static Connection getConnection() throws SQLException {
		Connection conn = null; 
		try {
			//反射原理加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			//获取数据库的链接
			String url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8";
			String name="root";
			String pwd="123456";
			//调用驱动连接数据库
			conn=DriverManager.getConnection(url,name,pwd);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return conn;
	}
}
说明:
使用反射获取驱动类映像:
Class.forName("com.mysql.jdbc.Driver");类的位置如下:

8.0版本的mysql连接代码如下:
package sams.ck.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.catalina.mbeans.ClassNameMBean;
public class DBUtil {
	//定义一个静态方法,获取数据库连接对象。
	//静态方法的好处是可以根据类名.方法名直接调用,不需要new一个对象
	//注意这里Connection导的包是:java.sql.Connection;
	public static Connection getConnection2(){
		Connection con=null;
		try {
			//加载驱动
			Class.forName("com.mysql.cj.jdbc.Driver");
			//获取数据库的链接
			String url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&serverTimezone=UTC";
			String name="root";
			String pwd="123456";
			con=DriverManager.getConnection(url,name,pwd);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return con;
	}
}
②在test包里写一个测试类测试数据库是否连接成功

DBUtilTest.class
package sams.ck.test;
import java.sql.SQLException;
import sams.ck.util.DBUtil;
public class DBUtilTest {
	public static void main(String[] args) throws SQLException {
		System.out.println(DBUtil.getConnection());
	}
}
测试显示,连接成功:

(2)创建一个学生实体类

Student.class
package sams.ck.entity;
import java.util.Objects;
public class Student {
	//定义属性,要学生数据表一致
	private String stuId;//学生学号
	private String stuClass;//学生班级
	private String stuName;//学生姓名
	private Double EnglisScore;//英语分数
	private Double ChineseScore;//语文分数
	private Double MathScore;//数学分数
	
	//为学生实体类型添加无参构造方法
	public Student() {}
	//添加属性的get和set方法
	public String getStuId() {
		return stuId;
	}
	public void setStuId(String stuId) {
		this.stuId = stuId;
	}
	public String getStuClass() {
		return stuClass;
	}
	public void setStuClass(String stuClass) {
		this.stuClass = stuClass;
	}
	public String getStuName() {
		return stuName;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
	public Double getEnglisScore() {
		return EnglisScore;
	}
	public void setEnglisScore(Double englisScore) {
		EnglisScore = englisScore;
	}
	public Double getChineseScore() {
		return ChineseScore;
	}
	public void setChineseScore(Double chineseScore) {
		ChineseScore = chineseScore;
	}
	public Double getMathScore() {
		return MathScore;
	}
	public void setMathScore(Double mathScore) {
		MathScore = mathScore;
	}
	//添加hashCode 和equals方法
	
	@Override
	public int hashCode() {
		return Objects.hash(stuId);
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		return Objects.equals(stuId, other.stuId);
	}
	//添加一个 toString 方法 便于测试用
	@Override
	public String toString() {
		return "Student [stuId=" + stuId + ", stuClass=" + stuClass + ", stuName=" + stuName + ", EnglisScore="
				+ EnglisScore + ", ChineseScore=" + ChineseScore + ", MathScore=" + MathScore + "]";
	}
}
说明:
添加属性的get和set方法时使用快捷方式,鼠标右键

全选
 
添加hashCode和equal时也采用快捷方式

 选择主键即可

toStirng方法同样快速生成。
(3)创建一个DAO类

stuDao.class
package sams.ck.dao;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import sams.ck.entity.Student;
import sams.ck.util.DBUtil;
public class stuDao {
	//查询学生数据表中所有数据
	public List<Student>findAllStudents(){
		//定义一个学生实体类数组
		List<Student>stus=new ArrayList<Student>();
		try {
			//获取数据库连接对象
			Connection conn = DBUtil.getConnection();
			//定义SQL语句
			String sql = "select * from students";
			//获取PreparedStatment对象  负责操作数据库sql语句
			PreparedStatement prep = conn.prepareStatement(sql);
			//执行sql语句  获取查询数据后的结果集对象
			ResultSet rs=prep.executeQuery();
			//迭代结果集对象 将查询输出的数据封装到Stus对象当中
			while(rs.next()) {
				Student 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"));
				//将封装好的stu对象 添加到list集合中
				stus.add(stu);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return stus;
	}
}
在test包中写一个daotest类测试一下:

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.util.DBUtil;
public class DaoTest {
	public static void main(String[] args) {
		stuDao stus = new stuDao();
		System.out.println(stus.findAllStudents());
	}
}
输出学生信息,测试成功:

 (4)创建一个服务类
 
stuService.class
package sams.ck.service;
import java.util.List;
import sams.ck.dao.stuDao;
//学生成绩管理系统的业务层代码
import sams.ck.entity.Student;
public class stuService {
	private stuDao dao = new stuDao();
	//展示学生成绩信息
	public List<Student> stuList(){
		return dao.findAllStudents();
	}
}
(5)创建一个Servlet类

 
清理一下代码:
package sams.ck.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class stuServlet extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}
}
stuServlet.class:
实现学生页面展示功能。
package sams.ck.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sams.ck.entity.Student;
import sams.ck.service.stuService;
public class stuServlet extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置编码格式
		request.setCharacterEncoding("utf-8");
		//获取浏览器端的请求路径
		String uri=request.getRequestURI();
		//将获取的请求资源路径uri进行字符串切割处理
		String path=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
		//创建业务类型实例对象
		stuService service = new stuService();
		//根据处理后的字符串来判断用户的请求
		if(path.equals("/list")){
			//调用业务层的代码  获取所有的员工信息
			List<Student>stus=service.stuList();
			//将查询到的数据 传递给视图页面  由视图页面将数据返回给浏览器 展示在用户面前
			//step1  先将数据绑定到request对象上
			request.setAttribute("stus", stus);
			//step2 获取转发器
			RequestDispatcher dis=request.getRequestDispatcher("stuList.jsp");
			//step3 转发
			dis.forward(request, response);
		}
	}
}
(6)创建一个stuList.jsp类
右键webapp

命名 stuList.jsp

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>Insert title here</title>
</head>
<body>
	<table width='500px' border='5px' >
		<tr>
			<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>
		</tr>
		<%} %>
	</table>
</body>
</html>(7)编辑部署文件
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <servlet>
    <servlet-name>student</servlet-name>
    <servlet-class>sams.ck.servlet.stuServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>student</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>(8)运行servers进行测试

搜索网址:http://127.0.0.1:8080/StudentAchievementManagementSystem/stuList.do




















