0001-01-01  0001-01-01    2812 字   6 分钟

学生管理系统

一、回顾

1. Servlet 使用 注意事项 生命周期方法 进化史  注解的形式创建Servlet
    
2. request和response
    
    request 获取请求信息 请求行 请求头 请求正文  转发
    
    response 响应信息 响应行 响应头 响应正文(文本字节) 重定向
    
3. 共享域ServletContext  session  request
    
4. JSP(三大指令六大动作九大内置对象ELJSTL标签库)
    
5. 会话(Cookie/session)

二、MVC和三层结构

MVC设计模式
    M  Model  模型(数据模型 业务模型 数据访问模型...)
    V  View   视图(展示数据 JSP HTML)
    C  Controller 控制器(控制哪些数据  哪些页面 响应)
    
三层结构(项目的三层包)
    web层与客户端交互  ---- Servlet
    service 业务层  ----  处理业务的类
    dao数据库访问层  ---- 处理数据库数据操作的
    
    1. 上一层可以调用下一层但是下一层不能调用上一层
    2. 不能隔层调用
    
    一个表对应一个dao 对应一个业务类  对应一个实体类 对应一个Servlet

三、学生管理系统

1. 功能

1. 学生信息添加  
2. 学生信息修改
3. 学生信息删除(单删多删)
4. 学生展示(分页展示)

2.思路

1. 分析技术分析库和表
2. 准备jar  工具类 配置文件等
3. 库表 创建
4. 搭建环境
     搭建项目结构 
     引入jar 工具类 配置文件等
    
5. 编码

3. 优化Servlet

目的实现一个表对应一个Servlet  防止Servlet创建过多
具体封装
package com.ujiuye.web.servlet;

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 java.io.IOException;
import java.lang.reflect.Method;

@WebServlet(name = "BaseServlet")
public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 要么 new   要么 反射
        // 1. 获取类对象   获取方法名
        // 1.1 获取方法名
        String method = req.getParameter("method");
        if(method==null){
            method = "home";
        }

        // 1.2 获取类对象
        Class<? extends BaseServlet> clazz = this.getClass();
        
        // 2. 调用方法
        try {
            Method m = clazz.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);

            m.invoke(this, req, resp);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

使用自定义类 继承BaseServlet即可

4. 入口的处理

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>入口页</title>
  </head>
  <body>
    <%--跳转首页之前 从后台获取数据--%>
    <jsp:forward page="stu">
        <jsp:param name="method" value="home"/>
    </jsp:forward>
  </body>
</html>

5. 首页展示

index.jsp  ----> StudentServlet中home方法 获取学生信息  保存到共享域中 ----> 跳转到home.jsp中展示

6. 添加学生

	index.jsp 点击添加按钮  ----> StudentServlet 中的addStuUI方法  ----> 跳转addStu.jsp中 ----> StudentServlet中的addStu方法 (----> StudentServiceImpl  ----> StudentDaoImpl ---->) 跳转到首页 ----> StudentServlet中home方法 获取学生信息  保存到共享域中 ----> 跳转到home.jsp中展示
        
 文件上传要求
    页面要求
    需要指定enctype=multipart/form-data  提交方式必须是 post type=file
        <form action="stu?method=addStu" method="post" enctype="multipart/form-data">
        
    Servlet要求添加@MultipartConfig 在类上
       
jsp中加载本地路径下的图片需要挂载服务器路径

7. 修改学生

	home.jsp中点击修改按钮  -----> StudentServlet的updateStuUI方法 获取修改的学生信息 ----> updateStu.jsp 回显老数据 修改 ----> StudentServlet的updateStu方法 ----> (StudentServiceImpl  ----> StudentDaoImpl) 跳转到首页获取新的数据

8. 删除学生

单删	
	home.jsp中点击删除按钮 ----> StudentServlet的delStu方法 ----> (StudentServiceImpl  ----> StudentDaoImpl)跳转到首页获取新的数据
    
批量删除
    home.jsp中选中删除的数据

学生管理之分页

1. 分析

 页面需要什么数据
    · 当前页的数据 数据库查询
    · 当前页的页码  页面
    · 共多少页 
    · 一页显示多少条数据  自己定义
    · 共多少条数据  数据库查询
    
 这些数据都需要保存到共享域中 将以上这些数据封装到一个类中
    public class PageBean<T> {
    	private int currentPage; // 当前页 页码
    	private int totalCount;  //  数据总数
    	private int pageSize = 6;  // 一页显示多少条数据
    	private int totalPage; // 一共多少页
    	private List<T> list;  // 当前页显示的数据

2. 编码

StudentServlet中
    // 分页显示首页数据
    public String home(HttpServletRequest request, HttpServletResponse response){
        // 1. 获取请求携带参数
        String currentPage = request.getParameter("currentPage");
        if(currentPage==null){
            currentPage = "1";
        }
        // 2. 调用业务 获取结果
        PageBean<Student> pageBean = service.findByPage(currentPage);

        // 3. 保存共享域
        request.setAttribute("pageBean", pageBean);
        // 4. 转发
        return "home_page.jsp";
    }
StudentServiceImpl中
    @Override
    public PageBean<Student> findByPage(String currentPage) {
        // 1. 处理分页业务
        PageBean<Student> pageBean = new PageBean<>();

        // 2. 将需要的数据封装到PageBean中
        // 2.1 当前页的页码封装到PageBean中
        int cp = Integer.parseInt(currentPage);
        pageBean.setCurrentPage(cp);

        // 2.2 将数据总数封装到PageBean中
        int totalCount = dao.findCount();
        pageBean.setTotalCount(totalCount);

        // 2.3 共多少页  总个数/一页的数据个数    6   36  37
        int pageSize = pageBean.getPageSize();
        int totalPage = (int) Math.ceil(totalCount*1.0/pageSize);
        pageBean.setTotalPage(totalPage);

        // 2.4 当前页的数据  s   limit (n-1)*
        List<Student> list = dao.findStuByPage(cp, pageSize);
        pageBean.setList(list);

        // 2.5 起始页码和 结束页面封装到PageBean
        if(totalPage <= 10){
            pageBean.setStartPage(1);
            pageBean.setEndPage(totalPage);
        }else{
            if(cp <= 6 ){
                pageBean.setStartPage(1);
                pageBean.setEndPage(10);
            }else if(totalPage - cp < 4){
                pageBean.setStartPage(totalPage - 9);
                pageBean.setEndPage(totalPage);
            }else{
                pageBean.setStartPage(cp - 5);
                pageBean.setEndPage(cp + 4);
            }
        }

        return pageBean;
    }
home_page.jsp
    <%--
  Created by IntelliJ IDEA.
  User: junguang
  Date: 2021/12/10
  Time: 11:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>首页</title>
</head>
<body>
    <c:if test="${pageBean.list.size() <= 0 }">
        <h2>没有学生信息赶紧<a href="stu?method=addStuUI">添加</a></h2>
    </c:if>
    <c:if test="${pageBean.list.size() > 0 }">
        <table border="1" cellspacing="0" width="800" align="center">
            <caption><a href="stu?method=addStuUI">添加学生</a></caption>
            <tr>
                <th style="width: 10%;"><a href="javascript:void(0);" onclick="delMore()">批量删除</a></th>
                <th style="width: 10%;">学号</th>
                <th style="width: 10%;">姓名</th>
                <th style="width: 10%;">性别</th>
                <th style="width: 10%;">年龄</th>
                <th style="width: 20%;">身份证号</th>
                <th style="width: 10%;">入校日期</th>
                <th style="width: 10%;">头像</th>
                <th style="width: 10%;">操作</th>
            </tr>
            <c:forEach items="${pageBean.list }" var="stu">
                <tr align="center">
                    <td><input type="checkbox" value="${stu.sid }"> </td>
                    <td>${stu.sid }</td>
                    <td>${stu.sname }</td>
                    <td>${stu.gender==1?'男':'女' }</td>
                    <td>${stu.age }</td>
                    <td>${stu.cardno }</td>
                    <td>${stu.hiredate }</td>
                    <td><img src="/stuimg/${stu.pic }" width="50" height="50"></td>
                    <td>
                        <a href="stu?method=updateStuUI&sid=${stu.sid }">修改</a>
                        <a href="javascript:void(0);" onclick="del('${stu.sid }')">删除</a>
                    </td>
                </tr>
            </c:forEach>
        </table>
        <%--页码展示--%>
        <center>
            <%--首页--%>
            <a href="stu?method=home">首页</a>
            <%--上一页--%>
            <c:if test="${pageBean.currentPage > 1 }">
                <a href="stu?method=home&currentPage=${pageBean.currentPage-1 }">上一页</a>
            </c:if>

             <%--每一页页码--%>
                <c:forEach begin="${pageBean.startPage }" end="${pageBean.endPage }" step="1" var="i">
                    <c:if test="${pageBean.currentPage==i }">
                        <a href="stu?method=home&currentPage=${i }"
                           style="display: inline-block; text-decoration: none; width: 20px; height: 20px; background-color: green; border-radius: 5px; color: white">${i }</a>
                    </c:if>
                    <c:if test="${pageBean.currentPage != i }">
                        <a href="stu?method=home&currentPage=${i }"
                           style="display: inline-block; text-decoration: none; width: 20px; height: 20px; background-color: #c3c3c3; border-radius: 5px; color: white">${i }</a>
                    </c:if>
                </c:forEach>

            <%--下一页--%>
            <c:if test="${pageBean.currentPage < pageBean.totalPage }">
                <a href="stu?method=home&currentPage=${pageBean.currentPage+1 }">下一页</a>
            </c:if>
            <%--尾页--%>
            <a href="stu?method=home&currentPage=${pageBean.totalPage }">尾页</a>
        </center>
    </c:if>
    <script src="jquery/jquery-1.4.2.js"></script>
    <script>
        // 单删
        function del(sid){
            // 弹提示框
            if(confirm("确定删除吗?")){
                window.location.href = "stu?method=delStu&sid="+sid;
            }
        }

        // 多删
        function delMore(){
            // 1. 获取选中的复选框
            var sids = "";
            $.each($("input:checked"), function(index, eml){
                sids += ","+eml.value
            })
            sidss = sids.substring(1);
            // 2. sids是否有值
            if(sidss==null || ""==sidss){
                alert("请选择要删除的数据");
            }else{
                if(confirm("确定删除吗?")){
                    window.location.href = "stu?method=delMore&sids="+sidss;
                }
            }
        }
    </script>
</body>
</html>

Filter—–Listener

20220430215387


avatar
青山
悟已往之不谏 知来者之可追
一言
今日诗词
站点信息
本站访客数 :
本站总访问量 :