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包
(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