【JavaWeb开发-Servlet】day04-学生成绩管理系统-环境搭建与展示页面

news2024/11/17 13:34:13

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化测试平台(一):前期准备和后端服务搭建

一、前言 本专栏会基于djangoreact&#xff0c;并结合这些年自己构建多个自动化测试平台的经验&#xff0c;从0开始&#xff0c;一步一步教会你实现一个完备的商用级自动化测试平台&#xff0c;真正意义上能够降本增效创造价值的平台。 二、前期准备 安装mysql&#xff0c;版…

用Virtuoso和Abstract完成gds2lef

需要用到的工具有virtuoso和abstract。 数模混合的项目通常需要模拟完成模块设计&#xff0c;把接去数字的pin打上label&#xff08;text&#xff09;&#xff0c;数字的floorplan才能正式开始。 如果只需要简单的数字PR boundary和pin点位置&#xff0c;那么只使用virtuoso就…

MySQL分区详解

目录 一、定义 1.1 概述 1.2 分区的优势 二、分区的类型 2.1 检查MySQL是否支持分区 2.2 类型 2.3 分区的其他操作 一、定义 1.1 概述 数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果&#xff0c;但其主要目的是为了在特定的SQL操作中减少数据读写…

基于jsp+java+ssm考研指导平台-计算机毕业设计

项目介绍 本考研学习类的网站&#xff0c;采用了ssm框架技术和mysql数据库进行网站设计研发&#xff0c;系统具有前台展示&#xff0c;后台管理的设计模式&#xff0c;是一款典型的计算机毕业设计学习资料。前台主要展示了考研相关的资讯&#xff0c;方便用户在线注册并且留言…

【Windows逆向】【Qt】资源解析

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 分析思路思路获取资源路径的方法2️⃣ c正向编码编码使用流程不使用Qt方式获取思路3️⃣ frida方式获取Origin平台资源win32 - 定位目标资源win32 - 查找API含义win32 - 查找《符号》构造frida本地函数win32 - 全部代码win64 - …

【ESP32+freeRTOS学习笔记-(一)freeRTOS介绍】

目录FreeRTOS基本情况FreeRTOS的特色发行版的目录结构与文件说明原生程序的下载与目录结构FreeRTOS的主要文件说明头文件说明关于FreeRTOSConfig.h的说明主要的数据类型说明重要数据类型 -- TickType_t重要数据类型 -- BaseType_t一些默认的规则变量名的规则函数的命名规则宏的…

你在网络上发布的内容真的归你所有吗?有Web3.0和元宇宙的未来是什么样的?

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;9分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 你认为你在微博、抖音等社交媒体上发布的内容是属于你的吗&#xff1f;事实并非…

Dashed lines generator for 3dMax 虚线生成器插件使用教程

Dashed lines generator虚线生成器是一个3DMAX建模工具&#xff0c;可以通过简单的步骤自动生成所有类型的虚线&#xff1a;它可以用于模拟交通标志标准&#xff1b;使用“蒙皮修改器SKIN MODIFIER”选项&#xff0c;可以非常容易地操纵创建的虚线&#xff0c;更改其位置和方向…

关于Pytorch模型检查点大小和参数量的一些观察

目录 背景和需求 一、模型的参数量统计 二、模型检查点大小查看 三、检查点大小和模型参数量之间的关系 总结 背景和需求 一个Pytorch模型的大小可以从两个方面来衡量&#xff1a;检查点大小和模型的参数量。现在我从两个方面都拿到了具体数值&#xff0c;想要验证它们两个是否…

数据开源 | Magic Data开源DMS驾驶员行为数据集

由于近几年人工智能、芯片技术的发展&#xff0c;自动驾驶被资本市场越炒越热。目前大部分车企正在朝着完全自动驾驶努力&#xff0c;大部分已经落地的无人驾驶技术仍然是L2与L3级。同时&#xff0c;汽车行业也逐渐在汽车上集成了辅助自动驾驶和智能助手等功能&#xff0c;让驾…

C语言结构体详解

邀请加入嵌入式社区&#xff0c;您可以在上面发布问题&#xff0c;博客链接&#xff0c;公众号分享&#xff0c;行业消息&#xff0c;招聘信息等。 目录 结构体有什么用&#xff1f; 结构体声明 正常的结构体声明 匿名结构体 匿名结构体只有在创建的时候可以建立变量 两个…

vuex通过Mutations来修改状态的原理及devtools插件的下载

状态修改&#xff1a; 通过Mutations来修改状态&#xff0c;并配合devtools调试工具会记录这个状态何时被修改过&#xff1b; 好处是因为所有组件都可以访问和修改状态&#xff0c;通过Mutations配合调试工具能知道状态被哪个组件什么时候被修改过&#xff0c;方便追溯&#…

如何让 ChatGPT 写短篇小说?

故事一 请根据下面内容续写故事&#xff0c;要求800字。 在一个晴朗的秋日下午&#xff0c;男主人 Jack 抱着他的妻子 Rose&#xff0c;两人坐在沙发上看着电视。 这是&#xff0c;Jack对Rose说&#xff1a;”亲爱的&#xff0c;我们来玩一个游戏吧。” ChatGPT回答&#xff1a…

华为机试 - 端口合并

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 有M(1<M<10)个端口组&#xff0c; 每个端口组是长度为N(1<N<100)的整数数组&#xff0c; 如果端口组间存在2个及以上不同端口相同&#xff0c;则认为这2个端口组互相关联&#xff0c;可以…

CentOS部署主从DNS服务器

几个概念&#xff1a; 域名解析为IP地址&#xff1a;正向解析 IP地址解析为域名&#xff1a;反向解析 主DNS服务器&#xff1a;在特定区域内具有唯一性&#xff0c;负责维护该区域内的域名和IP地址之间的对应关系。 从DNS服务器&#xff1a;从服务器中获得域名和IP地址对应关系…

PCIE2PCI104载板转接卡

功能型号 PCIE2PCI104 此无源扩展卡允许开发人员将PCI104或PC/104plus卡安装到通用PCI总线系统中。适配器配备了一个堆栈式连接器。 功能描述 规格 适用于标准&#xff1a;Universal.3.3V或5V PCI插槽 工业温度工作范围&#xff1a;-40至85 C 连接器/接口&#xff1a;包括一个带…

干货 | 肖特基二极管4大特性

前言 肖特基二极管是重要的电子元器件&#xff0c;因为其承载着保护电路的重要作用&#xff0c;所以显得格外的不可或缺&#xff0c;我们都知道在选择肖特基二极管时&#xff0c;主要看它的正向导通压降、反向耐压、反向漏电流等。 但我们却很少知道其在不同电流、不同反向电压…

固定支撑约束在ANSYS有限元计算中的三大注意事项

固定支撑是在结构有限元中&#xff0c;大家最常用的一种约束条件了。如图1所示给出了设置固定支撑操作的方法。 图1 设置固定支撑操作方法 固定支撑约束&#xff0c;可以应用在点&#xff0c;线和面特征上。固定支撑表示被约束为位置为刚性&#xff0c;但是在现实工程结构中&a…

解决“Vector Hardware Manager无法连接This Computer”(能够独立解决问题,体现一个人的综合能力)

1. 引子 Vector Hardware Manager是先前配置工具Vector Hardware Config的继承者,是Vector Hardware Config工具的升级版或替代产品 什么是Vector Hardware Config? CANoe里打开: 界面: 而Vector Hardware Manager其实就是把Vector Hardware Config里的功能搬到了这里实…

UE5 + VS2022和UE4 + VS2019 编译踩坑

1&#xff0c;卡住且没有cl.exe进程 &#xff08;1&#xff09;&#xff0c;卸载Incredibuild&#xff0c;Incredibuild也是利用进程虚拟化技术&#xff0c;加速包括编译的方法&#xff0c;和firstbuild是一样的&#xff0c;所以优先选择了Incredibuild的方式&#xff0c;但是2…