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

  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页面,接下来需要循环显示数据,使用:

<%@ 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,就完成了。

  • 28
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值