0


【Java Web】学生成绩管理系统

项目放到资源里面,感兴趣的可以直接去下载,这里主要写出详细步骤,有问题或者建议欢迎交流讨论哦٩(๑•̀ω•́๑)۶

一、新建项目

  1. 复制项目shop

(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****intid;

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(intid) {

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(intid) {

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盘文件根目录下,然后输入代码:

  1. 打开mysql5.0,输入密码:“123456”
  2. “create database student(数据库名); ” //建立数据库,因为之前已经建立了,可以跳过
  3. “use student ”//打开使用数据库
  4. “source C:/student.cql”//导入student.sql
  5. “show tables;”//查看表

“desc student;”//查看表的结构

6. Servlet 和 Student的jsp

  • list()

前面已经编写好了list(),把数据放在了“students”里面,跳转到了list.jsp页面,现在打开Student的list页面,接下来需要循环显示数据,使用:

<%@tagliburi=*"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是弹出一个确认对话框:

<scripttype=*"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 {

intid = 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 {

intid = 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 {

intid = 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,就完成了。


本文转载自: https://blog.csdn.net/qq_64077978/article/details/140477292
版权归原作者 pitytheriver 所有, 如有侵权,请联系我们删除。

“【Java Web】学生成绩管理系统”的评论:

还没有评论