Javaweb教学系统项目实战之学生管理模块


任务目标

  • 业务目标
    实现学生管理模块中学员信息的增删改查

  • 技能目标
    通过项目巩固和实战 JAVAWEB,MYSQL,HTML,JAVASE 的知识体系


涉及知识点

1、sql语言及基本操作

2、JDBC(Java数据库连接)

3、自定义工具类以及properties配置文件的使用

4、JDBC连接池

5、枚举类定义

6、Servlet处理请求( Servlet工作原理Servlet请求与响应

7、JSTL标签库+EL表达式

8、JSP

9、AJAX学习

10、HTMLCSS


任务过程

  1. 熟悉项目需求和项目结构
  2. 根据需求创建数据库
  3. 实现用户的登录与退出
    tips:用户权限判断,非登录情况下不允许访问用户操作
  4. 实现学生信息的增删改查
    tips:学号的非重复性验证

思路及代码实现

☆前端页面创建

根据需求新建html页面
在这里插入图片描述

登录界面login.jsp

在这里插入图片描述

登录后的系统主界面index.jsp

在这里插入图片描述

学生管理模块

在这里插入图片描述


☆数据库创建

创建数据库,并创建年级信息表grage学生信息表student登录用户信息表users
在这里插入图片描述

grade

在这里插入图片描述

student

在这里插入图片描述

users

在这里插入图片描述


☆后端

一、工具包utils

创建一个utils包,新建类DBUtils,新建配置文件db.properties

properties配置文件

使用ResourceBundle访问本地资源,从里面读取我们需要的值

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
username=root
password=123456

DBUtils

JDBC工具类,封装了操作sql的方法,因此方法都推荐静态static

  • 变量定义
	//定义需要的工具类对象(变量定义)
    protected static Connection connection = null;
    protected static PreparedStatement pps = null;//后续都是用预状态通道来实现
    protected static ResultSet rs = null;//结果集
    protected static int count = 0;//受影响的行数
    //登录的用户名和密码
    private static String username;
    private static String password;
    private static String url;
    private static String driverName;
    //Druid连接池
    private static DruidDataSource druidDataSource = new DruidDataSource();
  • 加载驱动
	//加载驱动
    static {
        //Druid
        ResourceBundle bundle = ResourceBundle.getBundle("db");//参数只写属性文件名,不需要写后缀
        //加载属性文件
        driverName = bundle.getString("driver");
        url = bundle.getString("url");
        username = bundle.getString("username");
        password = bundle.getString("password");

        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        druidDataSource.setUrl(url);
        druidDataSource.setDriverClassName(driverName);
    }
  • 获得链接
    protected static Connection getConnection() {
        try {
            connection = druidDataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
  • 得到预状态通道并绑定参数
	//得到预状态通道
    protected static PreparedStatement getPps(String sql) {
        try {
            getConnection();
            pps = connection.prepareStatement(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return pps;
    }
    
    //绑定参数,给占位符赋值,list中保存的是给占位符所赋的值
    private static void setParams(List list) {
        try {
            if (list != null && list.size() > 0) {//集合中有内容
                for (int i = 0; i < list.size(); i++) {
                    pps.setObject(i + 1, list.get(i));//赋值,位置从1开始所以为i+1
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
  • 增删改
    protected static int update(String sql, List list) {
        try {
            getPps(sql);//得到预状态通道
            setParams(list);//绑定参数
            count = pps.executeUpdate();//pps.executeUpdate()执行sql语句,返回受影响的行数
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return count;//返回受影响的行数
    }
  • 数据查询
	protected static ResultSet query(String sql, List list) {
        try {
            getPps(sql);//得到预状态通道
            setParams(list);//绑定参数
            rs = pps.executeQuery();//pps.executeUpdate()执行sql语句,返回结果集
            return rs;//返回结果集
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
  • 关闭资源
    protected static void closeAll() {
        try {
            if (rs != null) {
                rs.close();
            }
            if (pps != null) {
                pps.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

二、 实体类的定义,创建bean包

根据所创建的sql创建对应的类
类名=表名,属性名=列名

Grade

  • 定义属性
	private Integer gradeId;
    private String gradeName;
    //一对多关系
    private List<Student> studentList;
  • 用setter和getter设置和获取值
    public Integer getGradeId() {
        return gradeId;
    }

    public void setGradeId(Integer gradeId) {
        this.gradeId = gradeId;
    }

    public String getGradeName() {
        return gradeName;
    }

    public void setGradeName(String gradeName) {
        this.gradeName = gradeName;
    }

    public List<Student> getStudentList() {
        return studentList;
    }

    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }

Student

  • 定义属性
	private Integer stuId;
    private String stuName;
    private String stuNo;
    private Integer sex;
    private String phone;
    private String email;
    private String registered;
    private String address;
    private String profession;
    private String idNumber;
    private String politics;
    private Date regDate;
    private Integer state;
    private String introduction;
    private Integer gId;

    //多对一
    private Grade grade;
  • 用setter和getter设置和获取值
	public Integer getStuId() {
        return stuId;
    }

    public void setStuId(Integer stuId) {
        this.stuId = stuId;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getStuNo() {
        return stuNo;
    }

    public void setStuNo(String stuNo) {
        this.stuNo = stuNo;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getRegistered() {
        return registered;
    }

    public void setRegistered(String registered) {
        this.registered = registered;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getProfession() {
        return profession;
    }

    public void setProfession(String profession) {
        this.profession = profession;
    }

    public String getIdNumber() {
        return idNumber;
    }

    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
    }

    public String getPolitics() {
        return politics;
    }

    public void setPolitics(String politics) {
        this.politics = politics;
    }

    public Date getRegDate() {
        return regDate;
    }

    public void setRegDate(Date regDate) {
        this.regDate = regDate;
    }

    public Integer getState() {
        return state;
    }

    public void setState(Integer state) {
        this.state = state;
    }

    public String getIntroduction() {
        return introduction;
    }

    public void setIntroduction(String introduction) {
        this.introduction = introduction;
    }

    public Integer getgId() {
        return gId;
    }

    public void setgId(Integer gId) {
        this.gId = gId;
    }

    public Grade getGrade() {
        return grade;
    }

    public void setGrade(Grade grade) {
        this.grade = grade;
    }

Users

  • 定义属性
    private Integer userId;
    private String loginName;
    private String password;
    private String realName;
  • 用setter和getter设置和获取值
    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }

三、模块功能实现

service包中定义学生管理的各种操作
在这里插入图片描述

dao层定义service层操作的具体实现
在这里插入图片描述
we包中定义servlet
在这里插入图片描述


※ 用户

实现用户登录退出

service

UsersService接口

public interface UsersService {
    /**
     * 登录方法
     */
    public Users login(String username,String password);
}

UsersService接口实现类UsersServiceImpl

public class UsersServiceImpl implements UsersService {
    /**
     * 创建dao层对象
     */
    private UsersDao usersDao = new UsersDaoImpl();

    /**
     * 登录方法
     */
    @Override
    public Users login(String username, String password) {
        return usersDao.login(username, password);
    }
}
dao

UsersDao接口

public interface UsersDao {
    /**
     * 登录方法
     */
    public Users login(String username, String password);
}

UsersDao接口实现类UsersDaoImpl

由于需要连接数据库进行操作,因此需要继承DBUtils方法

public class UsersDaoImpl extends DBUtils implements UsersDao {
    /**
     * 登录方法
     */
    @Override
    public Users login(String username, String password) {
        Users users = null;
        try {
            String sql = "select * from users where loginname = ? and password = ?";
            ArrayList arrayList = new ArrayList();
            arrayList.add(username);
            arrayList.add(password);
            resultSet = query(sql, arrayList);//查询之后返回结果集
            //包装结果集数据
            users = null;
            if(resultSet == null){
                return null;
            }
            while (resultSet.next()){
                users = new Users();
                users.setLoginName(username);
                users.setRealName(resultSet.getString("realname"));
                users.setUserId(resultSet.getInt("userid"));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return users;
    }
}

servlet

LoginServlet类
login.jsp页面输入username、password后点击登录按钮提交表单, action=“login” method=“post”

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.接收参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //2.调取service
        UsersService usersService = new UsersServiceImpl();
        Users users = usersService.login(username, password);
        //3.跳转页面
        if(users == null){
            //以弹窗方式提示用户,登录失败
            resp.setContentType("text/html;charset=utf-8");//防止返回数据乱码
            PrintWriter writer = resp.getWriter();
            writer.println("<script>location.href='login.jsp';alert('用户名或密码不正确');</script>");
        }else{
            //保存用户信息,重定向跳转到主页面
            //session,整个会话期间
            req.getSession().setAttribute("u1",users);
            resp.sendRedirect("index.jsp");
        }
    }
}

※ 年级

在对学员进行数据操作时需要获取年级列表

service
public interface GradeService {
    /**
     * 查询年级列表
     */
    public List<Grade> getList();
}
public class GradeServiceImpl implements GradeService {
    private GradeDao dao = new GradeDaoImpl();

    @Override
    public List<Grade> getList() {
        return dao.getList();
    }
}
dao
public interface GradeDao{
    /**
     * 查询年级列表
     */
    public List<Grade> getList();
}
public class GradeDaoImpl extends DBUtils implements GradeDao {
    @Override
    public List<Grade> getList() {
        List gs = new ArrayList();
        try {
            String sql = "select * from grade";
            resultSet = query(sql, null);
            while (resultSet.next()){
                Grade grade = new Grade();
                grade.setGradeId(resultSet.getInt("gradeid"));
                grade.setGradeName(resultSet.getString("gradename"));
                gs.add(grade);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return gs;
    }
}
servlet
@WebServlet(urlPatterns = "/Educational/student/getGradeList")
public class GradeListServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1接收参数
        //2调取service方法
        //3跳转页面
        //查询年级列表的方法
        GradeService service = new GradeServiceImpl();
        List<Grade> list = service.getList();
        req.setAttribute("glist",list);
        req.getRequestDispatcher("add.jsp").forward(req,resp);
    }
}

※ 学员

使用同一个service、dao、servlet,在其中编写不同的方法进行增删改查

StudentServlet类

页面对于增删改查发送不同的method请求,在servlet中定义不同的方法分别进行处理

@WebServlet(urlPatterns = "/Educational/student/studentServlet")
public class StudentServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getParameter("method");
        if("insert".equals(method)){
            insert(req, resp);
        }else if("update".equals(method)){
            update(req, resp);
        }else if("findbyid".equals(method)){
            findbyid(req, resp);
        }else if("delete".equals(method)){
            deleteStu(req, resp);
        }else {
            findlist(req, resp);
        }
    }
}    

列表展示(分页展示)

/Educational/student/studentServlet

service
    /**
     * 获取所有学生信息列表
     * pageIndex  页码值
     * pageSize  每页显示的条数
     */
    public List<Student> getStudents(String name,String stuno,int sex,int pageIndex,int pageSize);
    @Override
    public List<Student> getStudents(String name,String stuno,int sex,int pageIndex,int pageSize) {
        return dao.getStudents(name, stuno, sex,pageIndex,pageSize);
    }
dao
    /**
     * 获取所有学生信息列表
     */
    public List<Student> getStudents(String name,String stuno,int sex,int pageIndex,int pageSize);
    @Override
    public List<Student> getStudents(String name,String stuno,int sex,int pageIndex,int pageSize) {
        List list = new ArrayList<Student>();
        List params = new ArrayList();
        try {
            StringBuffer sqlbuf = new StringBuffer("select * from student where 1=1 and state!=4 ");//单表查询
            if(name != null && name.length()>0){
                sqlbuf.append(" and stuname like ? ");
                params.add("%"+name+"%");//模糊查找
            }
            if(stuno != null && stuno.length()>0){
                sqlbuf.append(" and stuno=? ");
                params.add(stuno);
            }
            if(sex != -1){
                sqlbuf.append(" and sex=? ");
                params.add(sex);
            }
            /**
             * 分页条件
             * 第一个问号,开始位置( 第一页,每一页五条,则limit 0,5 )
             * limit (pageIndex-1)*pageSize,pageSize
             */
            sqlbuf.append(" limit ?,? ");
            params.add((pageIndex-1)*pageSize);
            params.add(pageSize);


            resultSet = query(sqlbuf.toString(),params);
            //resultSet = query(sql, null);//无参数,null
            while (resultSet.next()){
                Student student = new Student();
                student.setStuId(resultSet.getInt("stuid"));
                student.setStuNo(resultSet.getString("stuno"));
                student.setStuName(resultSet.getString("stuname"));
                student.setSex(resultSet.getInt("sex"));
                student.setPhone(resultSet.getString("phone"));
                student.setProfession(resultSet.getString("profession"));
                student.setRegDate(resultSet.getDate("regdate"));
                //建议补全所有的列
                list.add(student);//添加数据
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return list;
    }
servlet
	/**
     * 查询列表
     */
    protected void findlist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1获取参数(两部分,第一部分:模糊从查找的条件  第二部分:分页数据)

        //1.1模糊查找条件
        String stuname = req.getParameter("stuname");
        String stuno = req.getParameter("stuno");
        String sex = req.getParameter("sex");

        //1.2分页数据(limit 开始位置,显示条数)
        //页码值
        String pageIndex = req.getParameter("pageIndex");//当前页码值
        //如果页面没有传入pageIndex的值,则默认查询第一页
        int index = pageIndex==null?1:Integer.parseInt(pageIndex);

        //2调取service方法
        PageUtil pageUtil = new PageUtil();
        StudentService service = new StudentServiceImpl();
        int usex = (sex==null||sex.length()==0?-1:Integer.parseInt(sex));
        List<Student> students =
                service.getStudents(stuname,stuno,usex,index,pageUtil.getPageSize());//得到学生集合,需要跳转到前台
        /**
         * 获取总页数
         * 总页数=总条数%每页显示的条数>0?总条数/每页显示的条数+1:总条数/每页显示的条数
         */
        int total = service.total(stuname, stuno, usex);//总条数
        pageUtil.setTotal(total);

        //3跳转页面
        //如果后台想给前台传数据,一定要在后台存值
        //req.setAttribute("stulist",students);
        pageUtil.setDataList(students);
        pageUtil.setPageIndex(index);


        //点击查询之后,在列出查询信息使保留上面的搜索内容(存储模糊查找的条件)
        req.setAttribute("stuname",stuname);
        req.setAttribute("stuno",stuno);
        req.setAttribute("sex",sex);

        //存储页码值
        req.setAttribute("p1",pageUtil);
//        req.setAttribute("index",index);
//        //存储分页数据
//        req.setAttribute("size",5);
//        req.setAttribute("total",total);//总条数
//        req.setAttribute("totalpages",totalPages);//总页数

        //list前面如果加/表示从根目录下进行寻找
        req.getRequestDispatcher("list.jsp").forward(req,resp);//转发的方式,跳转到list.jsp
    }

模糊查询实现(基于学学员列表展示)
service
    /**
     * 获得总条数
     * 基于模糊查询
     */
    public int total(String name,String stuno,int sex);
    @Override
    public int total(String name, String stuno, int sex) {
        return dao.total(name, stuno, sex);
    }
dao
    /**
     * 获得总条数
     * 基于模糊查询
     */
    public int total(String name,String stuno,int sex);
    @Override
    public int total(String name, String stuno, int sex) {
        int total = 0;
        try {
            List params = new ArrayList();
            StringBuffer sqlbuf = new StringBuffer("select count(*) from student where 1=1 and state!=4 ");//单表查询
            if(name != null && name.length()>0){
                sqlbuf.append(" and stuname like ? ");
                params.add("%"+name+"%");//模糊查找
            }
            if(stuno != null && stuno.length()>0){
                sqlbuf.append(" and stuno=? ");
                params.add(stuno);
            }
            if(sex != -1){
                sqlbuf.append(" and sex=? ");
                params.add(sex);
            }
            resultSet = query(sqlbuf.toString(), params);
            while (resultSet.next()){
                total=resultSet.getInt(1);//取出结果集第一列的值,即count
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return total;
    }
servlet

模糊查询实质为学员列表展示的特殊情况,即一定条件下的学员列表展示


新增学员

href="/Educational/student/getGradeList"

首先获取学员的年级列表信息,然后跳转至add.jsp,进行信息输入

service
    /**
     * 新增学生
     */
    public int insertStu(Student student);
    @Override
    public int insertStu(Student student) {
        return dao.insertStu(student);
    }
dao
    /**
     * 新增学生
     */
    public int insertStu(Student student);
    @Override
    public int insertStu(Student student) {
        int i = 0; 
        if(existId(student.getStuNo(),student.getStuName()) == 1){
            System.out.println("该学号已经存在!");
            return -1;
        }
        try {
            String sql = "insert into student values(null,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
            List params = new ArrayList();
            params.add(student.getStuName());
            params.add(student.getStuNo());
            params.add(student.getSex());
            params.add(student.getPhone());
            params.add(student.getEmail());
            params.add(student.getRegistered());
            params.add(student.getAddress());
            params.add(student.getProfession());
            params.add(student.getIdNumber());
            params.add(student.getPolitics());
            params.add(new Date());
            params.add(StudentEnum.READING.type);//1表示在读 2表示休学 3表示退学 4表示删除
            params.add(student.getIntroduction());
            params.add(student.getgId());
            i = update(sql, params);//i表示受影响的行数
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return i;
    }



    /**
     *根据学号判断该学生是否存在
     */
    public int existId(String stuno,String stuName){ 
        int f = -1;
        System.out.println("判断学号是否存在");
        Student student = findByName(stuName); 
        if(stuno.equals(student.getStuNo())){//虽然学号已存在,但是是自己原来的学号
            return -1;
        }
        try {
            String sql = "select * from student where stuno = ?";
            List params = new ArrayList();
            params.add(stuno);
            resultSet = query(sql, params);
            if(resultSet.next()) {
                f = 1;
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return f;
    }


    /**
     * 通过姓名查找学生是否存在
     */
    public Student findByName(String stuname) {
        Student student = new Student();
        try {
            String sql = "select * from student where stuname = ?";
            List params = new ArrayList();
            params.add(stuname);
            resultSet = query(sql, params);
            while (resultSet.next()){
                student.setStuId(resultSet.getInt("stuid"));
                student.setStuNo(resultSet.getString("stuno"));
                student.setStuName(resultSet.getString("stuname"));
                student.setSex(resultSet.getInt("sex"));
                student.setPhone(resultSet.getString("phone"));
                student.setProfession(resultSet.getString("profession"));
                student.setRegDate(resultSet.getDate("regdate"));
                student.setEmail(resultSet.getString("email"));
                student.setIntroduction(resultSet.getString("introduction"));
                student.setgId(resultSet.getInt("gid"));
                student.setRegistered(resultSet.getString("registered"));
                student.setIdNumber(resultSet.getString("idnumber"));
                student.setPolitics(resultSet.getString("politics"));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return student;
    }
servlet

action="/Educational/student/studentServlet?method=insert" method=“post”

    /**
     * 新增学员
     */
    protected void insert(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理乱码
        //req.setCharacterEncoding("utf-8");
        //接收参数
        String stuNo = req.getParameter("stuNo");
        String stuName = req.getParameter("stuName");
        String gid = req.getParameter("gid");
        String sex = req.getParameter("sex");
        String email = req.getParameter("email");
        String phone = req.getParameter("phone");
        String registered = req.getParameter("registered");
        String address = req.getParameter("address");
        String politics = req.getParameter("politics");
        String idNumber = req.getParameter("idNumber");
        String profession = req.getParameter("profession");
        String introduction = req.getParameter("introduction");
        //调取service方法
        StudentService service = new StudentServiceImpl();

        //将参数封装到学生对象中
        Student student = new Student();
        student.setStuNo(stuNo);
        student.setStuName(stuName);
        student.setgId(Integer.parseInt(gid));//接收的类型为字符串,但是后台数据为int类型
        student.setSex(Integer.parseInt(sex));
        student.setEmail(email);
        student.setPhone(phone);
        student.setRegistered(registered);
        student.setAddress(address);
        student.setPolitics(politics);
        student.setIdNumber(idNumber);
        student.setProfession(profession);
        student.setIntroduction(introduction);


        int i = service.insertStu(student);//受影响的行数
        System.out.println("insertStu受影响的行数"+i);
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();

        if(i>0){//新增成功
            writer.println("<script>alert('新增成功');location.href='/Educational/student/studentServlet'</script>");
        }else if(i == -1){
            writer.println("<script>alert('该学号已存在,新增失败');location.href='/Educational/student/getGradeList'</script>");
        }else{//新增失败
            writer.println("<script>alert('新增失败,请检查输入信息');location.href='/Educational/student/getGradeList'</script>");
        }
    }


主键查询
service
    /**
     * 主键查询(返回一个对象)
     * 处理查询
     */
    public Student findById(int sid);
    @Override
    public Student findById(int sid) {
        return dao.findById(sid);
    }
dao
    /**
     * 主键查询(返回一个对象)
     * 处理查询
     */
    public Student findById(int sid);
    @Override
    public Student findById(int sid) {
        Student student = new Student();
        try {
            String sql = "select * from student where stuid = ?";
            List params = new ArrayList();
            params.add(sid);

            resultSet = query(sql, params);
            while (resultSet.next()){
                student.setStuId(resultSet.getInt("stuid"));
                student.setStuNo(resultSet.getString("stuno"));
                student.setStuName(resultSet.getString("stuname"));
                student.setSex(resultSet.getInt("sex"));
                student.setPhone(resultSet.getString("phone"));
                student.setProfession(resultSet.getString("profession"));
                student.setRegDate(resultSet.getDate("regdate"));
                student.setEmail(resultSet.getString("email"));
                student.setIntroduction(resultSet.getString("introduction"));
                student.setgId(resultSet.getInt("gid"));
                student.setRegistered(resultSet.getString("registered"));
                student.setIdNumber(resultSet.getString("idnumber"));
                student.setPolitics(resultSet.getString("politics"));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return student;
    }
servlet
    /**
     * 主键查询
     */
    protected void findbyid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1接收参数
        String sid = req.getParameter("sid");
        //2处理查询方法,根据主键查询学生信息
        StudentService service = new StudentServiceImpl();
        Student student = service.findById(Integer.parseInt(sid));

        //查询年级列表
        GradeService gradeService = new GradeServiceImpl();
        List<Grade> list = gradeService.getList();

        req.setAttribute("glist",list);
        req.setAttribute("stu",student);
        req.getRequestDispatcher("edit.jsp").forward(req,resp);
    }

更新学员信息
service
    /**
     * 修改学生
     */
    public int updateStu(Student student);
    @Override
    public int updateStu(Student student) {
        return dao.updateStu(student);
    }
dao
    /**
     * 修改学生
     */
    public int updateStu(Student student);
    @Override
    public int updateStu(Student student) {
        int update = 0;
        System.out.println("执行updateStu");
        if(existId(student.getStuNo(),student.getStuName()) == 1){//已存在
            return -1;
        }
        try {
            String sql = "update student set stuname=?,stuno=?,sex=?,phone=?,email=?,registered=?,address=?,profession=?,idnumber=?,politics=?,introduction=?,gid=? where stuid = ?";
            List params = new ArrayList();

            params.add(student.getStuName());
            params.add(student.getStuNo());
            params.add(student.getSex());
            params.add(student.getPhone());
            params.add(student.getEmail());
            params.add(student.getRegistered());
            params.add(student.getAddress());
            params.add(student.getProfession());
            params.add(student.getIdNumber());
            params.add(student.getPolitics());
            params.add(student.getIntroduction());
            params.add(student.getgId());
            params.add(student.getStuId());
            update = update(sql, params);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return update;
    }
servlet

href="/Educational/student/studentServlet?method=findbyid&sid=${stu.stuId}"

    /**
     * 修改学员
     */
    protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理乱码
        //req.setCharacterEncoding("utf-8");


        //接收id
        String sid = req.getParameter("sid");
        //接收其它参数
        String stuNo = req.getParameter("stuNo");
        String stuName = req.getParameter("stuName");
        String gid = req.getParameter("gid");
        String sex = req.getParameter("sex");
        String email = req.getParameter("email");
        String phone = req.getParameter("phone");
        String registered = req.getParameter("registered");
        String address = req.getParameter("address");
        String politics = req.getParameter("politics");
        String idNumber = req.getParameter("idNumber");
        String profession = req.getParameter("profession");
        String introduction = req.getParameter("introduction");

        //
        Student stu = new Student();

        stu.setStuId(Integer.parseInt(sid));

        stu.setStuNo(stuNo);
        stu.setStuName(stuName);
        stu.setgId(Integer.parseInt(gid));
        stu.setSex(Integer.parseInt(sex));
        stu.setEmail(email);
        stu.setPhone(phone);
        stu.setRegistered(registered);
        stu.setAddress(address);
        stu.setPolitics(politics);
        stu.setIdNumber(idNumber);
        stu.setProfession(profession);
        stu.setIntroduction(introduction);


        StudentService service = new StudentServiceImpl();
        int i = service.updateStu(stu);
        System.out.println("i的值为:"+i);

        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();

        if(i>0){//更新成功
            writer.println("<script>alert('更新成功');location.href='/Educational/student/studentServlet'</script>");
        }else if(i == -1){
            writer.println("<script>alert('该学号已存在,更新失败!');location.href='/Educational/student/studentServlet?method=findbyid&sid="+sid+"'</script>");
        }else{//更新失败
            writer.println("<script>alert('更新失败');location.href='/Educational/student/studentServlet?method=findbyid&sid="+sid+"'</script>");
        }
    }

删除学员
service
    /**
     * 删除学生
     */
    public int delStu(String sid);
    @Override
    public int delStu(String sid) {
        return dao.delStu(sid);
    }
dao
    /**
     * 删除学生
     */
    public int delStu(String sid);

这里的删除指的是查询列表时不显示,因此更改状态码即可

    @Override
    public int delStu(String sid) {
        int update = 0;
        try {
            String sql = "update student set state = ? where stuid = ?";
            List params = new ArrayList();
            params.add(StudentEnum.DELETE.type);
            params.add(sid);
            update = update(sql, params);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return update;
    }
servlet

href="/Educational/student/studentServlet?method=delete&sid=${stu.stuId}

    /**
     * 删除学员
     */
    protected void deleteStu(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1接收参数
        String sid = req.getParameter("sid");
        //2处理查询方法,根据主键查询学生信息
        StudentService service = new StudentServiceImpl();
        int i = service.delStu(sid);//返回受影响行数

        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();

        if(i>0){//删除成功
            writer.println("<script>alert('删除成功');location.href='/Educational/student/studentServlet'</script>");
        }else{//删除失败
            writer.println("<script>alert('删除失败');location.href='/Educational/student/studentServlet'</script>");
        }
    }

※ 优化

增加过滤器,实现优化
在这里插入图片描述

处理乱码

EncodingFilter类

public class EncodingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //强制类型转换
        HttpServletRequest request =(HttpServletRequest)servletRequest;
        request.setCharacterEncoding("utf-8");

        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

XML配置

    <filter>
        <filter-name>aa</filter-name>
        <filter-class>
            com.company.filter.EncodingFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>aa</filter-name>
        <url-pattern>/*</url-pattern><!--当前所有信息都应该进行乱码处理-->
    </filter-mapping>

权限判断

只有用户登录了才能进入到主页面进行增删改查操作

CheckLoginFilter类

public class CheckLoginFilter implements Filter {
    private List<String> unUrlList = new ArrayList<>();

    //登录不成功返回的路径
    private String loginUrl = "login.jsp";

    //用户存放在session中的名称
    private String LoginSessionName;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //拿到在web.xml配置好的需要放行的路径字符串login.jsp login
        String unUrl = filterConfig.getInitParameter("unUrl");
        String[] unUrlArr =  unUrl.split(",");//将字符串通过分号,分割成一个数组
        //把数组转换成一个集合
        unUrlList = Arrays.asList(unUrlArr);

        //拿到登录页面路径
        loginUrl = filterConfig.getInitParameter("loginUrl");

        //拿到用户存放在session中的名称
        LoginSessionName = filterConfig.getInitParameter("loginSessionName");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        //从session中拿到登录用,如果当前用户不存在,跳转回登录页面  如果存在,直接放行
        HttpServletRequest req = (HttpServletRequest)servletRequest;
        HttpServletResponse resp = (HttpServletResponse)servletResponse;

        //拿到访问的路径    req.getRequestURI() 拿到的结果是:/login.jsp
        String uri = req.getRequestURI().substring(1);//结果是:login.jsp

        //如果这个List中没有包含uri中的路径才进行权限判断
        if(!unUrlList.contains(uri)){
            Object user = req.getSession().getAttribute(LoginSessionName);
            if(user==null){//判断用户是否为空
                resp.sendRedirect(loginUrl);
                return;
            }
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

XML配置

    <!--   为做权限判断而配置的过滤器 -->
    <filter>
        <filter-name>checkLogin</filter-name>
        <filter-class>
            com.company.filter.CheckLoginFilter
        </filter-class>
        <!--  配置不要进行权限判断的路径(不过滤的路径) -->
        <init-param>
            <param-name>unUrl</param-name>
            <param-value>login.jsp,login</param-value>
        </init-param>
        <!--  配置登录页面路径 -->
        <init-param>
            <param-name>loginSessionName</param-name>
            <param-value>u1</param-value>
        </init-param>
        <!--  用户存在session中的名称 -->
        <init-param>
            <param-name>loginUrl</param-name>
            <param-value>/login.jsp</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>checkLogin</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

源码已上传至资源


  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
学生成绩信息管理系统涉及到学生、教师、系统管理员、班级学生成绩、课程。设置一个系统管理员对系统进行管理。所有用户需输入账号、密码登录进入系统;管理员进入系统后可对学生、老师、班级、课程进行增删改查操作;学生进入系统,查看成绩、查看和修改自己的信息;老师进入系统后,对自己这门课程的学生设置课程成绩、查看和修改自己的信息,查看学生的信息和成绩、以及统计分析学生的成绩; 管理员为班级设置年级,为年级设置课程,为班级的每门课程设置老师,为学生设置班级一个年级有多门课程(语文、数学、外语等等),班级的每门课程只能有一名老师,一个老师可以有多门课程;老师选择自己这门课程为该课程的学生登记成绩。老师可以查看其他老师的信息(可以当成是老师的通讯录),查看本课程学生的信息和成绩;学生可以查看班级其他同学的信息(可以看成是班级的同学录)。 考试分为两种,一种是年级统考,一种是平时考试。年级统考需要管理员事先添加一次年级统考,考试成绩出来后,老师进入系统选择该次考试为学生登记成绩。平时考试则是班级平时的考试,老师添加考试信息,登记成绩。成绩统计分析则是针对年级统考进行分析,主要涉及各学科分数名次,总分名次。 技术实现 系统环境:Windows开发工具:IDEAJava版本:JDK 1.8服务器:Tomcat 1.8数据库:MySQL 5.X系统采用技术:Servlet+Jsp+Jdbc+H-ui+EasyUI+jQuery+Html+Css+Ajax 系统功能系统主要分为三种用户角色,分别是管理员、老师以及学生,其具体功能如下: - 管理员   学生信息管理、教师信息管理、年级信息管理班级信息管理、课程信息管理、考试信息管理,系统参数设置 - 老师   教学管理、教师个人信息维护、教师通讯录管理 - 学生考试成绩查询、学生通讯录、学生个人信息维护 运行图 登录界面: 管理员界面: 考试列表:  成绩统计: 学生信息管理: 教师信息管理: 年级、班级信息管理:  系统设置: 教师界面:  成绩登记:  教师通讯录: 个人信息:  学生界面: 学生成绩查询: 班级通讯录: 学生个人信息:              

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Selcouther

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值