首页 > 基础资料 博客日记
【Java Web】学生成绩管理系统
2024-11-06 07:00:07基础资料围观86次
项目放到资源里面,感兴趣的可以直接去下载,这里主要写出详细步骤,有问题或者建议欢迎交流讨论哦٩(๑•̀ω•́๑)۶
一、新建项目
(1)复制
在左边点击要复制的项目shop - ctrl+c - ctrl+v -修改复制的项目的名称student
(2)修改上下文
修改上下文:在复制的项目点击右键-点击属性-Deployment展开-Deployment Assembly-看到Web Context Root这个上下文的根-修改成项目名称student-点击应用-点击确定
(3)部署
点击部署按钮-下拉选择要部署的项目-点击添加(Add)-选择部署的服务器(这里使用Tomcat v8.5 Server at localhost)-直接点击完成-验证是否部署成功:在控制台点击部署的服务器,选择下拉可以看到项目名称(或者去tomcat的webapps文件夹下面查看是否有部署项目的名称)
二、结构
1. 框架结构
WebRoot下面的admin是后台管理的,admin下面的index.jsp就是框架,分为上、中、下左右结构,主要工作区在中间;menu.jsp中是目录菜单,跳转链接都是一个servlet,增删改查列表都是写在一个里面的,所以通过传IP的方式来控制列表的增删改查,target=“main”所以点击目录都是进入main里面;student和score是学生和成绩,有增加、列表、修改的jsp,主要通过list.jsp进行总控,点击超链接就跳转到列表,到列表里面做增删改查。
除去遮挡:右键服务器里面的tomcat选中倒数第二个“CodeLive”刷新,除去遮挡
2. 代码结构
视图使用jsp,访问servlet作为控制器,service(服务层),dao层(数据访问层),dao层和service层的区别在于dao里面就是数据的增删改查,service里面就是业务(业务方法reg、login等),service可以省略,直接用servlet到dao层,service是用来做事务管理等的可能访问多个dao层,事务处理会放在service里,可以省略,直接写dao层。使用数据库访问需要用到DBUtil工具类,面向接口编程,先写接口再写实现。通过先写实体,再写dao层,再写servlet层,最后jsp层。
三、学生信息管理
1. 实体
新建一个class,包名:“student.bean”,类名:“Student”,点击“完成”。-编写对应的六个属性:学生编号(id)、学生名字、性别、手机号码、年级、家庭地址,实际开发中还需要考虑子类别:
private int id;
private String name;
private String sex;
private String phone;
private String year;
private String address;
-然后新建get()和set()和3个构造方法,右键“Source”,“Generate Getters and Setters…”在选中所有,生成get()和set()方法;右键“Source”,“Generate Constructor using Firlds…”分别生成全部选中(修改时传对象必须把ID传过去,根据ID来传)、没有ID的(添加时ID自动产生,不需要ID)、全部不选的构造方法(为了后面编写方便,防止再新建设置属性)- Student类完成
2. Dao层
新建Interface接口,包名:“student.dao”(数据访问层的接口),类名:“StudentDao” ,点击“完成”。-定义方法,并导包:
package student.dao;
import java.util.List;
import student.bean.Student;
public interface StudentDao {
void save(Student student);
void delete(Student student);
void delete(int id);
void update(Student student);
Student findById(int id);
List<Student> findAll();
}
学生信息管理暂时不写分页,接口里面的权限全是省略了public的
3. DaoImpl实现类
接口写好后,继续编写实现类,在dao上面点击右键,新建一个class,包名:“student.dao.impl”,类名:“StudentDaoImpl”,然后点击“Add…”,输入StudentDao,点击“student.dao. StudentDao”实现这个接口,点击“完成”。-编写实现方法:
-
添加:
public void save(Student student) {
String sql = "insert into student(name,sex,phone,year,
address)value(?,?,?,?,?)";
DBUtil.executeUpdate(sql, new String[]{student.getName(),
student.getSex(),student.getPhone(),student.getYear(),student.getAddress()});
}
编写sql语句,使用DBUtil工具类,通过传参数完成添加,因为五个对象都是设置的String所以使用String数组
-
删除:
public void delete(Student student) {
delete(student.getId());
}
public void delete(int id) {
String sql = "delete from student where id="+ id;
DBUtil.executeUpdate(sql);
}
第一个传对象的通过id来调用传id的方法,编写sql语句后,使用DBUtil工具类,通过id的参数完成删除
-
修改:
public void update(Student student) {
String sql = "update student set name=?,sex=?,phone=?,
year=?,address=? where id=?";
DBUtil.executeUpdate(sql, new Object[]{student.getName(),
student.getSex(),student.getPhone(),student.getYear(),student.getAddress(),student.getId()});
}
编写sql语句,使用DBUtil工具类,因为有六个对象所以使用object,通过传参数完成修改
-
查询:
public Student findById(int id) {
String sql = "select * from student where id=" + id;
ResultSet rs = DBUtil.executeQuery(sql);
try {
if(rs.next()){
String name= rs.getString("name");
String sex = rs.getString("sex");
String phone = rs.getString("phone");
String year = rs.getString("year");
String address = rs.getString("address");
return new Student(id,name,sex,phone,year,address);
}else{
return null;
}
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
public List<Student> findAll() {
List<Student> students = new ArrayList<Student>();
String sql = "select * from student";
ResultSet rs = DBUtil.executeQuery(sql);
try {
while(rs.next()){
int id = rs.getInt("id");
String name= rs.getString("name");
String sex = rs.getString("sex");
String phone = rs.getString("phone");
String year = rs.getString("year");
String address = rs.getString("address");
students.add(new Student(id,name,sex,phone
,year,address));
}
return students;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
第一个根据id查询,返回一个对象,编写sql语句后,使用ResultSet查询取出rs值找到对象,取出两个属性并生成一个student对象;第二个先新建一个列表,修改sql语句,通过while获取多条记录的信息,获取三个属性,然后将student对象作为参数添加到students列表中,最后返回students列表
4. Servlet控制器
新建一个Servlet,包名:“student.servlet”,类名:“StudentServlet”,点击“Next”再点击“Next”,取消选中“Construcors from superclass”取消构造方法,最后点击“完成”。-修改访问:@WebServlet("/admin/student")-访问是通过action参数来传递过来的list来判断访问,通过链接访问所以list在doGet()里面编写,修改、删除都使用get。-编写doGet():
protected void doGet(HttpServletRequest request, HttpServlet
Response response) throws ServletException, IOException {
String action = request.getParameter("action");
if("list".equals(action)){
list(request,response);
}else if("delete".equals(action)){
//delete(request,response);
}else if("updateView".equals(action)){
//updateView(request,response);
}
}
获取action,判断做什么操作,每一个操作编写一个方法。
-
list()
-复制doPost()方法,修改为list方法,修改权限为private,list需要查询所有的Student,再保存。需要使用:private StudentDao studentDao = new StudentDaoImpl();获取,再编写list():
private void list(HttpServletRequest request, HttpServlet
Response response) throws ServletException, IOException {
request.setAttribute("students", studentDao.findAll()); request.getRequestDispatcher("/admin/student/list.jsp").forward(request, response);
}
把查询所有使用属性保存起来,保存在“students”,在跳转页面。因为保存在request里面所以使用服务器端跳转到显示页面。显示页面不能直接去访问,直接访问没有数据,应该在后台查询后再跳转。
5. 数据库
-
修改编码
先修改mysql的编码,再mysql 5.0的安装目录下面,找到my.ini文件使用记事本打开,修改以下为“utf8”:
然后右键“我的电脑”-“管理”-“服务和应用程序”-“服务”-找到mysql-“重启动此服务”
-
新建库和表
将student.sql复制到C盘文件根目录下,然后输入代码:
- 打开mysql5.0,输入密码:“123456”
- “create database student(数据库名); ” //建立数据库,因为之前已经建立了,可以跳过
- “use student ”//打开使用数据库
- “source C:/student.cql”//导入student.sql
- “show tables;”//查看表
“desc student;”//查看表的结构
6. Servlet 和 Student的jsp
-
list()
前面已经编写好了list(),把数据放在了“students”里面,跳转到了list.jsp页面,现在打开Student的list页面,接下来需要循环显示数据,使用:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
来循环,-编写代码:
这里的items="${students}"一定和request.setAttribute(
"students", StudentDao.findAll());保存的“students”要相同,不然看不到数据。添加按钮使用绝对路径跳转,点击后添加就到添加页面去;add.jsp页面这里注意将action中的“method=add”改成“action=add”
-编写servlet页面的add():
-
add()
因为之前是get,现在提交过来表单提交过来应该是doPost():
protected void doPost(HttpServletRequest request, HttpServlet
Response response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");//这里必须要设置编码,获取中文,并且需要加在接受参数之前
String action = request.getParameter("action"); if("add".equals(action)){
add(request,response);
}else if("update".equals(action)) {
//update(request,response); }
}
-复制list(),粘贴改为add(),
private void add(HttpServletRequest request, HttpServlet
Response response) throws ServletException, IOException {
String name = request.getParameter("name");
String sex = request.getParameter("sex");
String phone = request.getParameter("phone");
String year = request.getParameter("year");
String address = request.getParameter("address");
Student s = new Student(name,sex,phone,year,address);
studentDao.save(s);
list(request,response);
}
添加就是把参数获取过来,创建Student对象,然后调用保存方法,调用list方法查询后,就可以看到添加的数据。这里不能直接跳list列表页面,会没有数据。-重启服务器,测试代码,这里注意add.jsp页面表单的action中的“method=add”改成“action=add”,接收的是action分支,不修改接收的就是空,数据也为空。
添加效果:
-
delete()
打开Student的list页面,这里的td注意不要写成th,如果想将这一行的th替换成td,可以选中这一行后,“ctrl+F”替换这一行选中的(“Selected Enes”),操作的单元行编写以下两个按钮,删除根据id来删除:
删除最好添加一个用于确认的弹窗,Cofirm是弹出一个确认对话框:
<script type="text/javascript">
function deleteStudent(id){
if(window.confirm('确认删除吗?')){
window.location='<%=path%>/admin/student?action=delete&id=' + id;
}} </script></head>
会弹出两个按钮,确认后跳转到删除页面,取消就直接关闭。通过action确认是删除,根据id判断删除哪一条记录,注意“id=”。
-编写后台删除,使用doGet()访问,在doGet()里面添加分支
-复制add(),粘贴改为delete(),
private void delete(HttpServletRequest request, HttpServlet Response response) throws ServletException, IOException {
int id = Integer.parseInt(request.getParameter("id"));
studentDao.delete(id);
list(request,response);
}
根据id进行删除,删除完跳转到list页面,获取id后,调用delete(id)删除, 再调用list方法重新查询后,就可以看到删除后的页面。-重启服务器,查看效果。
删除效果:
-
updateView()
点击修改应该先查询出需要修改的数据,然后在跳转到修改界面,修改界面也需要有原来的信息:
根据id判断修改哪一条记录,然后跳转updateView,跳转到修改视图,查询到修改记录,然后真正需要修改时才跳转到修改界面,真正修改时action再加update:
function updateStudent(id){
window.location='<%=path%>/admin/student?action=updateView&id=' + id;
}</script>
-跳转过去还是doGet方法里面,
-updateView需要根据id把数据信息查询到,然后传到前台,前台把数据展示出来,如果要修改就跳转修改界面,不修改就直接点击提交,信息不改变,复制delete(),修改方法名为updateView():
private void updateView(HttpServletRequest request,HttpServlet
Response response) throws ServletException, IOException {
int id = Integer.parseInt(request.getParameter("id"));
Student s = studentDao.findById(id);
request.setAttribute("student", s);
request.getRequestDispatcher("/admin/student/update.jsp").forward(request, response);
}
根据id把对象查询到,查询到后需要把信息存起来到前台去显示出来,存到“student”里面,存在对象是“s”。然后跳转到update()页面,不能用客户端跳转,因为放在了request里面,所以使用服务器端跳转,这里必须使用绝对路径,“/admin/student/update.jsp”“/”对于服务器端跳转就是自己的根。-完成后编写update()页面:
-
update()
update()需要把存到“student”里面的值取出来,显示给用户,打开update.jsp:
先将“method”改为“action”,修改是根据id来修改的,所以id值是不能修改的,所以使用hidden传给用户去,但是用户是不能修改的,value="${student.id}"来获得,“student”是刚刚后台存储的,使用ER表达式直接访问某一范围里面的id值,名称和描述也同样获取,点击修改就会显示该页面,把原来的值显示出来。不修改点击提交还是保持原来值。
进入列表页面,点击修改,跳转到修改页面,并且显示到该页面,然后继续编写修改的action,方法与add()类似,使用doPost()访问:
-复制add(),修改为update(),编写代码:
private void update(HttpServletRequest request, HttpServlet Response response) throws ServletException, IOException {
int id = Integer.parseInt(request.getParameter("id"));
String name = request.getParameter("name");
String sex = request.getParameter("sex");
String phone = request.getParameter("phone");
String year = request.getParameter("year");
String address = request.getParameter("address");
Student s = new Student(id,name,sex,phone,year,address);
studentDao.update(s);
list(request,response);
}
修改需要id,获取属性后,新建Student对象,这里使用有id的构造方法,使用修改update(),list()查询并显示-重启服务器,测试代码。
修改效果:
四、课程成绩管理
数据库设计:
设计同理,这里不在赘述,直接检验效果:
实验问题
1 复制的项目student直接部署然后访问,访问不到?
(1) 复制项目
在左边点击要复制的项目shop- ctrl+c - ctrl+v -修改复制的项目的名称student即可
student因为是新建的项目,如果要访问需要部署,所以访问不了现在的项目:点击部署-下拉选中student-添加(Add)-这时控制台的服务器里面至少有两个项目(shop、student),部署成功-验证访问“http://localhost:8080/ student”-访问不到:
(2) 问题
访问复制(student)的项目访问不到:原来(shop)的项目访问的到,修改复制(student)的项目,访问原来(shop)的内容发生了改变:其实是因为工具栏里面虽然有两个(shop、student),但是Tomcat部署里面只有一个(shop),所以改了student但实际还是部署到了shop里面,项目名称与部署的项目名称不一定对应(默认的项目名称与tomcat是一样的,但是也可以不一样),以上可以看出我的shop、student他们的都是关联到同一个上下文(tomcat访问的叫做 “上下文”),是shop。复制的时候只是修改了项目名称,但是上下文还是同一个,没有修改到;虽然tomcat里面有两个项目,但是student后面还有个(shop):
(3)修改上下文
修改上下文:在复制的项目点击右键-点击属性-Deployment展开-Deployment Assembly-看到Web Context Root这个上下文的根-修改成项目名称或者其他都可以-点击应用-点击确定
(4)重新部署
完成以后要重新部署,因为刚才是用原来的部署的,要重新部署,刚才的可以删除掉,看到tomcat里面就多了student,就完成了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
上一篇:C++——string的模拟实现(上)
下一篇:Java之包,抽象类,接口