栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JavaWeb项目实战

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaWeb项目实战

没有任何优化的代码

数据库 1创建数据库school,并且使用该数据库

2创建登陆用户的表格

 3创建年级的表格

4创建学员表格

填写测试数据 

1给用户表添加数据

2给年级表填写数据

3学生表添加数据

insert into student values(1,'张三','stu1001',1,'13719201111','11111111@qq.com','北京','XX区XX镇','物理','2209121102911111','党员','2020-01-01',1,'优秀学员1',1)(2,'李四','stu1002',1,'13719203830','3432312@qq.com','上海','XX区XX镇','化学','22091211029121212','党员','2020-05-03',1,'优秀学员2',1),(3,'王五','stu1003',1,'13719201111','3333333@qq.com','杭州','XX区XX镇','生物','32091211029121212','党员','2020-06-03',1,'优秀学员3',2),(4,'赵六','stu1004',1,'13719204444','4444444@qq.com','四川','XX区XX镇','英语','44444411029121212','群众','2020-04-04',1,'优秀学员4',2),(5,'李雷','stu1005',1,'13719205555','55555555@qq.com','湖南','XX区XX镇','医学','220912110295555555','群众','2020-05-05',1,'优秀学员5',3),(6,'韩梅梅','stu1006',0,'1371920666','6666666@qq.com','武汉','XX区XX镇','政治','220912110291666666','群众','2020-06-06',1,'优秀学员6',3),(7,'翠花','stu1007',0,'13719207777','7777777@qq.com','天津','XX区XX镇','计算机','22091211029177777','党员','2020-07-07',0,'优秀学员7',3);

把html页面修改为jsp页面 1在html中添加page指令

2将html的后缀修改为jsp

修改之前的 

修改之后的

实体类 bean包

bean包:属性,封装方法,无参构造,全参构造;表名=类名,列名=属性名

1多表之间关系分析

        ①用户表和年级表、学生表之间没有关系

        ②年级表和学生表之间是一对多的关系,一个年级对应多个学生

2创建年级(班级)列表的实体
package com.yhp.bean;
import java.util.List;


public class Grade {
    private Integer gradeId;//年级编号
    private String gradeName;//年级名称
    //年级和学生之间是一对多的关系:一个年级包含多个学生
    private List studentList;

    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 getStudentList() {
        return studentList;
    }
    public void setStudentList(List studentList) {
        this.studentList = studentList;
    }
}
3创建学生信息实体类
package com.yhp.bean;
import java.util.Date;


public class Student {
    private Integer stuId;//学生id,主键自增
    private String stuName;//学生姓名
    private String stuNo;//学号
    private Integer sex;//性别0女1男
    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;//状态0在校1删除
    private String introduction;//简介
    private Integer gid;//班级编号
    //年级和学生之间是一对多的关系:一个学生对应一个年级
    private Grade grade;
//以上所有成员对象的get和set方法
    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;
    }
}
4 创建登陆用户的实体类
package com.yhp.bean;
//用户信息实体类
//多表关系分析:用户表和其他表没有关系
public class Users {
    private Integer userId;//用户id
    private String loginName;//登陆账号
    private String passWord;//密码
    private String realName;//真实姓名

    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;
    }
}

 dao包:主要是操作数据库的

①定义操作方法的接口,命名:实体类名+Dao

②Dbutils(属性文件,*.properties):连接数据库的工具类

1德鲁伊

注意:这里的DBUtils使用的是Druid技术,需要导入相关的jar包和数据文件

package com.yhp.dao;

import com.alibaba.druid.pool.DruidDataSource;
import java.sql.*;
import java.util.List;
import java.util.ResourceBundle;

public class DBUtils {
    //1.定义变量
    private Connection connection;
    private PreparedStatement pps;
    protected ResultSet resultSet;
    private int count;//存储收影响的行数

    private static String userName;
    private static String userPass;
    private static String url;
    private static String dirverName;
    //德鲁伊
    private static DruidDataSource dataSource=new DruidDataSource();
    //2.加载驱动
    static {
        //德鲁伊
        ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
        dirverName = bundle.getString("driverClassName");
        url = bundle.getString("url");
        userName = bundle.getString("username");
        userPass = bundle.getString("password");

        dataSource.setUsername(userName);
        dataSource.setPassword(userPass);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(dirverName);
       // dataSource.setInitialSize(20);

    }


    //3.获得链接
    protected  Connection getConnection(){
        try {
            connection=dataSource.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return connection;
    }
    //4.得到预状态通道
    protected  PreparedStatement getPps(String sql){
        try {
            pps= getConnection().prepareStatement(sql);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return pps;
    }
    //5.绑定参数  List保存的是给占位符所赋的值
    protected  void param(List list){
             if(list!=null&&list.size()>0){
                 for (int i=0;i 

2德鲁伊的配置文件

数据文件放到src目录下,注意jdbc.properties中的路径数据要修改

url=jdbc:mysql://localhost:3306/school?serverTimezone=UTC
username=root
password=XXXXXX
driverClassName=com.mysql.cj.jdbc.Driver
initialSize=5
maxActive=10
minIdle=5
maxWait=3000

3 jar包放到WEB-INF目录下的lib目录

impl包:实现接口,继承Dbutils类

命名:接口名+Impl

service.impl:主要是调取dao包的

service定义的是接口,接口中的方法和dao层接口中的方法一致

impl:这层的实现类主要负责调取dao层方法

service层的意义:service层是一个业务层,如果你的功能点的业务比较复杂,那么我们可以把业务逻辑都封装到这里进行包装,相当于进行一个准备工作

servlet:需要结合具体的功能点和需求去定义

在servlet中需要做的三件事

①接收参数

②调取service层的方法,service又在调取dao层的方法

③根据结果跳转页面

核心:jsp页面负责发送请求和展示数据

客户端:可以是浏览器、服务器、微信小程序

比如我想在淘宝上查找商品,那就是客户端发送请求,servlet调取service,service调取DAO,DAO,调取数据库,数据库将对应的消息依次返回,最后servlet获取到了数据,然后展示给客户端

代码的步骤:

1 先看jsp->2 jsp中指定Servlet地址->3 写对应的Servlet代码->4 Servelt主要做三件事:①接收参数、②调取service中对应的方法、③跳转到指定的页面(可以是前端页面,可以是有指定功能的Servlet页面,然后由该Servlet类跳转到前端页面)->5 因为Servlet中需要调用service中的方法,所以需要写对应的service接口中的抽象方法->6 写对应的Dao层的抽象方法->7Dao层的实现类实现Dao层的接口->8service层的实现类,实现service的接口(其中抽象方法的实现,是调取Dao层的实现类)

1. 登陆功能

(1)先看login.jsp页面的内容

①login.jsp的数据怎么发送过来

用户名的name是TxtUserName,密码的name是TxtPassword

②设置form的地址和method

(2)创建LoginServlet

servlet中主要做三件事1接收参数2调取service3跳转页面

1接收参数

用到了login.jsp的数据发送

2调取service

①需要在之前创建的UsersService接口中创建登陆的方法

②在UsersServiceImpl实现类中实现UsersService中的登陆方法,调取Dao层的UsersDao。 

③UsersDao接口中定义登陆方法 

④UsersDaoImpl中,需要进行调取数据库的操作

继承DBUtils(德鲁伊),实现UsersDao

⑤将2调取service和3跳转页面的代码内容补全 

 

注意:代码运行时,浏览器页面出现问题,IDEA控制台中没有报错,可以按F12,点击Network,点击Response,查看

 2退出功能

将session值清空掉即可

(1)书写head.jsp中的内容

(2)新建OutServlet

 

(3)如何验证是否退出成功

直接访问index.jsp,当前页面没有显示用户信息,就说明退出成功了

3学员列表展示

(1)首先修改left.jsp(学员信息展示的页面)当中的代码

把请求的地址修改为servlet的地址

(2)创建GetStudentServlet,它的地址就是上图中的Educational/student/getStudentList 

①service

②serviceImpl

③dao

④daoImpl:进行数据库操作,调取数据库中存的数据

(3)修改之前的list.html为list.jsp,并且将其中展示的固定数据修改为真实数据展示

①引入JSPL标签库

②将需要循环展示的真实数据,用包裹 

(4)结果:

4 模糊查询实现 (1)首先看list.jsp

①需要把button(普通按钮)改为submit(提交按钮)

②需要把学生名称、学生学号和性别加上name属性,方便后续获取值

③在性别的请选择、男和女选项中加上value属性

④添加表单数据提交的请求名form的action属性

(2)修改之前的GetStudentServlet类

①类中之前是没有获取参数的,现在就需要把刚刚的参数添加上

②类之前调取service方法,是不需要穿参数的,现在则需要把获取到的参数进行传递,这就需要修改StudentService,StudentServiceImpl,StudentDao,StudentDaoImpl

③第2条修改的目的就是为了StudentDaoImpl类,进行数据库查询

④其中涉及到了,

        1String类型强制转换为Integer(Integer.parseInt(sex))

        2如果String为null,强制转换为Integer报错的处理(使用三目运算符如果String为null那String就等于-1: String == null? -1:Integer.parseInt(sex))

        3String 和StringBuffer(两者区别String是固定长度StringBuffer可以进行动态的内存更新)

        4StringBuffer转换为String类型(StringBuffer.toString)

        5关于查询一次后,查询的内容自动删除的问题(这是因为每次查询后,会自动刷新一次页面,想要不丢失查询内容,需要对查询内容进行保存,并且需要在list.jsp页面中对保存的内容进行调取)

(3) 代码

①list.jsp

②GetStudentServlet

③StudentService这里比之前多了三个需要传入的参数

④StudentServiceImpl,实现StudentService,调取Dao层的StudentDao 

⑤Dao层的StudentDao

⑥StudentDaoImpl,实现了StudentDao,里面跟之前不同的是查找sql的语句不同,这里使用的是:StringBuffer(String长度是固定的生成了就不能变,但是StringBuffer是可以不断添加的)

 5分页功能

当用户点击首页、尾页、上一页、下一页以及中间的页码的时候,可以看到对应的信息

(1)修改相关的jsp页面(list.jsp)

给相关的按钮添加上要提交的页面连接(GetStudentServlet的地址)

(2)点击首页的功能实现

①修改GetStudentServlet中,将获取每页页码值和显示条数添加进去

 

②当获取了页码值和显示条数之后,就需要将他们传递给service层 

③对应的GetStudentServlet和Student ServiceImpl、Dao层的接口和实现类也要进行响应的修改

④StudentDaoImpl的修改:sql语句添加分页条件

⑤GetStudentServlet的修改,需要把之前的调用StudentService进行页码值和每页条数的添加

(3)点击上一页,在jsp页面设置

①前台的页码值在后台获取

变量名为pageIndex

index是当前页面的值,用三目运算符进行值的判断

注意:这里的pageIndex只是一个变量的名字,他需要和后台接收数据的一样即可

②后台的页码值在前台获取

变量名为index

③ 前台使用el表达式对index进行获取 

上一页,当前页码值-1,然后判断值是否小于等于1,如果小于1则页码值为1,如果页码值大于1,则正常的页码值-1

(4)下一页

①需要求出总页数(这里总页数命名为totalPages)

②GetStudentServlet中求出总页数

总页数=总条数/每页显示的条数(每页显示的条数是固定的5条)

③那么就需要求出总条数

需要在StudentService接口中定义一个获取总条数的方法

这个方法再复制到Dao层

然后StudentDaoImpl实现StudentDao的这个方法

 然后StudentServletImpl实现StudentService接口

由GetStudentServlet调用

④GetStudentServlet中就可以存储分页数据(当前页数、每页显示条数、总条数、总页数) ⑤求出总页数(这里总页数命名为totalPages) (5)尾页按钮

直接获取总页数即可

(6)目前的分页查询就做好了,但是还有一个模糊查询的功能,在跳转页码后,模糊查询的数据就丢失了 

这是因为,上面的jsp代码中,只拼接了页码值,没有拼接模糊查询的条件,当点击上一页后,只会向后台传一个页码的数据,但是模糊查询的数据就被丢掉了

注意拼接第一个数据加?,后面的数据用&连接

6新增 

当用户点击“新增学生”按钮,会跳转到新增页面 

 

填写完信息后,点击添加后,页面会跳回到学生管理页面

并且数据也会在学生管理页面展示

6-1新增-1:动态获取班级列表 (1)打开list.jsp页面,找到新增学生按钮

本来点击新增学生按钮之后,页面直接跳转到add.jsp,现在我们需要点击新增学生之后,跳转到GradeListServlet

①GradeListServlet目前还没有参数需要接收,需要一个查询所有年级列表的方法

(2)修改add.jsp页面的关于班级信息的静态数据换成动态数据

原本的静态数据

(3)修改为动态数据的步骤

①首先加上JSPL标签库

②在GradeService和GradeDao,这两个接口中定义查询年级列表的方法,并返回List集合  ③GradeServiceImpl实现GradeService接口

④GradeDaoImpl实现GradeDao接口

⑤GradeListServlet

⑥add.jsp获取servlet层的结果 

g.gradeId是年级的id,之后后台获取前台列表中数据

g.gradeName是显示年级的名字的:前台获取后台中存储的年级信息

6-2新增2:表单提交

(1)修改表单提交的地址

将其修改为处理其逻辑的servlet的地址

(2)创建Servlet

当数据成功存储到数据库后,页面会跳转到查询班级的Servlet(GradeListServlet),由Servlet查询到结果后转发到list.jsp页面 

(3)StudentDaoImpl中的代码,用来将数据存储到sql中

7修改学生信息:主键查询 

当用户点击修改按钮的时候,会展示学生的信息,班级信息应该动态获取,并且默认选中之前设置的

(1)找到list.jsp中的修改按钮,修改请求地址

修改后:后面拼接的sid=${stu.stuId}可以让后台的代码获取id主键 

(2)点击修改之后,就会跳转到/Educational/student/findbyid

(3)FindByIdServlet中处理查询的方法,是由StudentServiceImpl调取StudentDao的代码获取的

(4)StudentDao中定义了根据主键查询所有信息的方法

(5)StudentDaoImpl中实现了“根据主键查询所有信息的方法”,这里主要注意columnLabel(列标签)中的值需要和数据库中的列名相同。

(6)当FindByIdServlet获取到了数据库学生和年级的信息,就会跳转到edit.jsp页面中

普通的值主要是在input中去调取

(7)年级列表需要:1动态展示,2需要将学生原本填写信息的年级作为默认值

①这里就需要引入JSPL,进行forEach循环

②性别这种则是sex的值为男或者女,则男或者女为默认值 

③简介这种本身用文本域包裹的,则依旧用文本域包裹

edit.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>



	学生信息管理平台

	
    
    
    
    
    
    




		
            
                当前位置是:教务中心-》学生管理-》更新
                
            
        


    
学号:*:
姓名*:
班级*:
性别*:
EMAIL:
联系电话:
户口所在地:
住址:
政治面貌:
身份证号:
专业:
简介*:
info.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>



	学生信息管理平台

	
    
    
    
    
    
    




		
            
                当前位置是:教务中心-》学生管理-》新增
                
            
        


    
学号:*:
姓名*:
学院*:
专业*:
班级*:
性别*:
EMAIL:
联系电话:
户口所在地:
住址:
政治面貌:
身份证号:
专业:
简介*:
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>



    
    学生信息管理平台
    
    
    
    
    
    

    






		
                当前位置是:教务中心-》学生管理
                
                    【新增学生】    
                
            



    
        
学生名称: 学生学号: 性别:
<%--items是被遍历的数据集合;var是数据取出来后叫什么名字--%> <%--学生的学号--%> <%--学生姓名--%> <%--性别--%> <%--手机号--%> <%--专业--%> <%--登记时间--%>
学号 姓名 性别 联系电话 专业 登记时间 操作
${stu.stuNo}${stu.stuName}${stu.sex==1?'男':'女'}${stu.phone}${stu.profession}${stu.regdate} 修改 删除
首页 <%--这里${stuname}&stuno=${stuno}&sex=${sex}是为了在模糊查询时,进行翻页操作,避免点击跳转页面出现模糊查询条件失效的情况--%> 上一页 <%--上一页:当本页页数-1小于1,则为第1页,否则就当前页数-1--%> =totalPages?totalPages:index+1}&stuname=${stuname}&stuno=${stuno}&sex=${sex}">下一页 尾页 共${total}条 每页显示 ${index}/${totalPages}
4
Servlet:/src/web LoginServlet
package com.yhp.web;

import com.yhp.bean.Users;
import com.yhp.service.UsersService;
import com.yhp.service.impl.UsersServiceImpl;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1接收参数
        String username = req.getParameter("TxtUserName");
        String password = req.getParameter("TxtPassword");
        //2调取service
        UsersService usersService = new UsersServiceImpl();//用接口声明,new接口的实现类
        Users users = usersService.login(username, password);
        //3跳转页面
        if (users == null){
            //以弹窗方式提示用户,登陆失败
            resp.setContentType("text/html;charset=utf-8");//避免乱码
            PrintWriter writer = resp.getWriter();
            writer.println("");
        }else {
            //重定向跳转到主页面
            //保存用户信息
            req.getSession().setAttribute("u1",users);
            resp.sendRedirect("index.jsp");
        }
    }
}

OutServlet

package com.yhp.web;

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;
@WebServlet(urlPatterns = "/loginout")
public class OutServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //清除session
        req.getSession().invalidate();//这个方法可以让session中的所有数据都失效
        //重定向页面
        //resp.sendRedirect("/login.jsp");因为页面使用框架的原因不能使用重定向
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().println("");
    }
}
GetStudentServlet
package com.yhp.web;

import com.yhp.bean.Student;
import com.yhp.service.StudentService;
import com.yhp.service.impl.StudentServiceImpl;

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.util.List;

@WebServlet(urlPatterns = "/Educational/student/getStudentList")
public class GetStudentServlet extends HttpServlet {
    @Override
    protected void service(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方法
        StudentService service = new StudentServiceImpl();

        //在jsp页面中sex默认为undefined(没有值),这样到后台中就会报错,这里就是一出异常,就给sex赋null值
        int s ;
        try {
            if (sex == null){
                s =-1;
            }else {
                s = Integer.parseInt(sex);
            }
        } catch (NumberFormatException e) {
            sex = null;//这里的问题是sex.length==0
        }
        //List students = service.getStudent(stuname,stuno,sex==null ? -1: Integer.parseInt(sex),index,5);
        //sex==null ? -1: Integer.parseInt(sex)防止第一次进入,sex没有传入任何值,而导致的转换错误

        //sex的三目运算符
        //int usex = sex==null || sex.length()==0 ? -1 : Integer.parseInt(sex);
        int usex = sex == null ?-1:Integer.parseInt(sex);
        List students = service.getStudent(stuname,stuno,usex,index,5);
        //获取总页数=总页数%每页显示的条数>0?总条数/每页显示条数+1:总条数/每页显示条数
        int total = service.total(stuname, stuno, usex);//总条数
        int totalPages = total%5>0 ? total/5+1 : total/5;//总页数

        //如果后台想给前台传数据,是一定要在后台存值的
        req.setAttribute("stulist",students);
        //因为这里的数据只在展示页面使用,在其他页面不是用,所以只用request存值即可
        System.out.println(sex);

        //3跳转页面(转发)
        //存储模糊差条件
        req.setAttribute("stuname",stuname);
        req.setAttribute("stuno",stuno);
        req.setAttribute("sex",sex);
        //存储分页数据
        req.setAttribute("index",index);//当前的页数
        req.setAttribute("size",5);//每页显示条数
        req.setAttribute("total",total);//总条数
        req.setAttribute("totalPages",totalPages);//总页数

        req.getRequestDispatcher("list.jsp").forward(req,resp);
    }
}
GradeListServlet
package com.yhp.web;

import com.yhp.bean.Grade;
import com.yhp.service.GradeService;
import com.yhp.service.impl.GradeServiceImpl;

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.util.List;

@WebServlet(urlPatterns = "/Educational/student/getGradeList")
public class GradeListServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //1接收参数
        //2调取方法
        //查询所有年级列表的方法
        GradeService service = new GradeServiceImpl();
        List list = service.getList();
        //存储数据
        req.setAttribute("glist",list);
        //这里的glist,是前端获取后端内容的变量名
        //3跳转页面
        req.getRequestDispatcher("add.jsp").forward(req,resp);
    }
}
UpdateStuServlet
package com.yhp.web;

import com.yhp.bean.Student;
import com.yhp.service.StudentService;
import com.yhp.service.impl.StudentServiceImpl;

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.io.PrintWriter;

@WebServlet("/Educational/student/updateStu")
public class UpdateStuServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        //1接收参数
        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");
        //2调取方法
        Student student = new Student();
        student.setStuId(Integer.parseInt(sid));
        student.setStuNo(stuNo);
        student.setStuName(stuName);
        student.setGid(Integer.parseInt(gid));
        student.setSex(Integer.parseInt(sex));
        student.setEmail(email);
        student.setPhone(phone);
        student.setRegistered(registered);
        student.setAddress(address);
        student.setPolitics(politics);
        student.setProfession(profession);
        student.setIdNumber(idNumber);
        student.setIntroduction(introduction);

        StudentService service = new StudentServiceImpl();
        int i = service.updateStu(student);

        //3判断是否更新成功,弹窗显示,跳转页面
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        if (i>0){
            //修改成功
            writer.println("");
        }else {
            //修改失败
            
            writer.println("");
        }
    }
}
AddStuServlet
package com.yhp.web;

import com.yhp.bean.Student;
import com.yhp.service.StudentService;
import com.yhp.service.impl.StudentServiceImpl;

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.io.PrintWriter;

@WebServlet("/Educational/student/addStu")
public class AddStuServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");//因为这里是需要接收中文,所以需要处理乱码
        //1接收参数
        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 student = new Student();
        student.setStuNo(stuNo);
        student.setStuName(stuName);
        student.setGid(Integer.parseInt(gid));//班级编号
        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);//简介
        //2调取Service
        StudentService service = new StudentServiceImpl();
        int i = service.insertStu(student);
        //用弹窗的方式给用户提示,是否新增成功
        resp.setContentType("text/html;charset=utf-8 ");
        PrintWriter writer = resp.getWriter();
        //3跳转页面
        if (i>0){
            //新增成功
            //writer.println("");
            //弹窗显示新增成功,然后跳转到list.jsp页面
            
            writer.println("");
        }else {
            //新增失败
            //writer.println("");
            //弹窗显示新增失败,然后跳转到add.jsp页面
            
            writer.println("");
        }
    }
}
FindByIdServlet
package com.yhp.web;

import com.yhp.bean.Grade;
import com.yhp.bean.Student;
import com.yhp.service.GradeService;
import com.yhp.service.StudentService;
import com.yhp.service.impl.GradeServiceImpl;
import com.yhp.service.impl.StudentServiceImpl;

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.io.PrintWriter;
import java.util.List;

@WebServlet("/Educational/student/deletebyid")
public class DeleteByIdServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1接收参数:获取主键学生的ID
        String sid = req.getParameter("sid");
        //2调用方法:删除的方法
        StudentService service = new StudentServiceImpl();
        int i = service.deleteStu(sid);
        System.out.println("i="+i);

        //3判断是否更新成功,弹窗显示,跳转页面
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        if (i>0){
            //修改成功
            //弹出"删除成功"的弹窗,并且跳转到GetStudentServlet查询显示数据,然后跳转到list.jsp页面显示所有的数据
            writer.println("");
        }else {
            //修改失败
            //弹出"删除失败"的弹窗,并且跳转到GetStudentServlet查询显示数据,然后跳转到list.jsp页面显示所有的数据
            writer.println("");
        }
    }
}
DeleteByIdServlet
package com.yhp.web;

import com.yhp.bean.Grade;
import com.yhp.bean.Student;
import com.yhp.service.GradeService;
import com.yhp.service.StudentService;
import com.yhp.service.impl.GradeServiceImpl;
import com.yhp.service.impl.StudentServiceImpl;

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.io.PrintWriter;
import java.util.List;

@WebServlet("/Educational/student/deletebyid")
public class DeleteByIdServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1接收参数:获取主键学生的ID
        String sid = req.getParameter("sid");
        //2调用方法:删除的方法
        StudentService service = new StudentServiceImpl();
        int i = service.deleteStu(sid);
        System.out.println("i="+i);

        //3判断是否更新成功,弹窗显示,跳转页面
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        if (i>0){
            //修改成功
            //弹出"删除成功"的弹窗,并且跳转到GetStudentServlet查询显示数据,然后跳转到list.jsp页面显示所有的数据
            writer.println("");
        }else {
            //修改失败
            //弹出"删除失败"的弹窗,并且跳转到GetStudentServlet查询显示数据,然后跳转到list.jsp页面显示所有的数据
            writer.println("");
        }
    }
}
service UsersService
package com.yhp.service;

import com.yhp.bean.Users;

public interface UsersService {
    
    public Users login(String username,String password);
}
GradeService
package com.yhp.service;

import com.yhp.bean.Grade;

import java.util.List;

public interface GradeService {
    
    public List getList();
}
StudentService
package com.yhp.service;

import com.yhp.bean.Student;

import java.util.List;

public interface StudentService {
    
    public int deleteStu(String sid);
    
    public int updateStu(Student student);
    
    public Student findById(int sid);

    
    public List getStudent(String name,String stuno,int sex,int pageIndex,int pageSize);
    
    public int total(String name,String stuno,int sex);
    
    public int insertStu(Student student);
}
service impl UsersServiceImpl
package com.yhp.service.impl;

import com.yhp.bean.Users;
import com.yhp.dao.UsersDao;
import com.yhp.dao.impl.UsersDaoImpl;
import com.yhp.service.UsersService;

public class UsersServiceImpl implements UsersService {
    //创建Dao层对象
    private UsersDao usersDao = new UsersDaoImpl();
    @Override
    //登陆方法
    public Users login(String username, String password) {
        //由Dao对象调取UsersDao中的登陆方法
        return usersDao.login(username,password);
    }
}
GradeServiceImpl
package com.yhp.service.impl;

import com.yhp.bean.Grade;
import com.yhp.dao.GradeDao;
import com.yhp.dao.impl.GradeDaoImpl;
import com.yhp.service.GradeService;

import java.util.List;

public class GradeServiceImpl implements GradeService {
    //service层的实现类主要就是调取Dao层
    private GradeDao gradeDao = new GradeDaoImpl();
    @Override
    public List getList() {
        return gradeDao.getList();
    }
}
 StudentServiceImpl
package com.yhp.service.impl;

import com.yhp.bean.Student;
import com.yhp.dao.StudentDao;
import com.yhp.dao.impl.StudentDaoImpl;
import com.yhp.service.StudentService;

import java.util.List;

public class StudentServiceImpl implements StudentService {
    StudentDao studentDao = new StudentDaoImpl();
    
    @Override
    public int deleteStu(String sid) {
        return studentDao.deleteStu(sid);
    }

    @Override
    public int updateStu(Student student) {
        return studentDao.updateStu(student);
    }

    
    @Override
    public Student findById(int sid) {
        StudentDao studentDao = new StudentDaoImpl();
        return studentDao.findById(sid);
    }

    @Override
    public List getStudent(String name,String stuno,int sex,int pageIndex,int pageSize) {
        return studentDao.getStudent(name,stuno,sex,pageIndex,pageSize);
    }
    @Override
    public int total(String name, String stuno, int sex) {
        return studentDao.total(name,stuno,sex);
    }

    @Override
    public int insertStu(Student student) {
        return studentDao.insertStu(student);
    }
}
dao UsersDao
package com.yhp.dao;

import com.yhp.bean.Users;

public interface UsersDao {
    
    public Users login(String username, String password);
}
GradeDao
package com.yhp.dao;

import com.yhp.bean.Grade;

import java.util.List;

public interface GradeDao {
    
    public List getList();
}
StudentDao
package com.yhp.dao;

import com.yhp.bean.Student;

import java.util.List;

public interface StudentDao {
    
    public int deleteStu(String sid);
    
    public int updateStu(Student student);
    
    public Student findById(int sid);

    
    public List getStudent(String name,String stuno,int sex,int pageIndex,int pageSize);
    
    public int total(String name,String stuno,int sex);
    
    public int insertStu(Student student);
}
dao impl GradeDaoImpl
package com.yhp.dao.impl;

import com.yhp.bean.Grade;
import com.yhp.dao.DBUtils;
import com.yhp.dao.GradeDao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class GradeDaoImpl extends DBUtils implements GradeDao {
    
    @Override
    public List 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("grademname"));
                //这里的columnLabel要与数据库中的列名一致
                gs.add(grade);
            }
            System.out.println(gs);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            closeAll();
        }
        return gs;
    }
}
UsersDaoImpl 
package com.yhp.dao.impl;

import com.yhp.bean.Users;
import com.yhp.dao.DBUtils;
import com.yhp.dao.UsersDao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

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 objects = new ArrayList<>();
            objects.add(username);
            objects.add(password);
            //这里的resultSet是继承父类的
            resultSet = query(sql, objects);
            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;
    }
}
 
StudentDaoImpl  
package com.yhp.dao.impl;

import com.yhp.bean.Student;
import com.yhp.dao.DBUtils;
import com.yhp.dao.StudentDao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class StudentDaoImpl extends DBUtils implements StudentDao {
    
    @Override
    public int deleteStu(String sid) {
        int i = 0;
        try {
            String sql = "update student set state = ? where stuid = ?";
            List params = new ArrayList();
            params.add(4);
            params.add(sid);
            i = update(sql, params);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return i;
    }

    
    @Override
    public int updateStu(Student student) {
        int update = 0;
        try {
            String sql = "update student set stuno=?, stuname=?,gid=?,sex=?,email=?,phone=?,registered=?,address=?,politics=?,idnumber=?,profession=?,introduction=? where stuid=?";
            //注意下面添加变量的顺序要和上面设置数据的顺序一致
            List params = new ArrayList();
            params.add(student.getStuNo());
            params.add(student.getStuName());
            params.add(student.getGid());
            params.add(student.getSex());
            params.add(student.getEmail());
            params.add(student.getPhone());
            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.getStuId());
            update = update(sql, params);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return update;
    }

    
    @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.setAddress(resultSet.getString("address"));
                student.setIdNumber(resultSet.getString("idnumber"));
                student.setPolitics(resultSet.getString("politics"));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return student;
    }

    
    @Override
    public int insertStu(Student student) {
        int i =0;
        try {
            String sql = "insert into student value(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(1);//状态:1表示在读;2休学;3退学;4删除
            params.add(student.getIntroduction());
            params.add(student.getGid());

            i = update(sql, params);//表示受影响的行数
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return i;
    }


    
    @Override
    public List getStudent(String name,String stuno,int sex,int pageIndex,int pageSize) {
        List list = new ArrayList<>();
        List params = new ArrayList();//参数的集合
        //String sql = "select * from student";
        //注意下面的字符串,前后都要有空格,否则系统进行字符串拼接的时候,就都拼接到一起了
        StringBuffer sqlbuf = new StringBuffer(" select * from student where 1=1 and state!=4 ");
        //拼接的条件
        if (name != null && name.length()>0){
            //如果name有值,则拼接下面的字符串内容
            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);
        }
        //添加分页条件
        sqlbuf.append(" limit ?,? ");//比如要获取第1页,每页5条,则limit0,5
        //limit (pageIndex-1)*pageSize,pageSize;
        params.add((pageIndex-1)*pageSize);//开始位置
        params.add(pageSize);//每页显示条数

        resultSet = query(sqlbuf.toString(), params);
        try {
            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;
    }
    
    @Override
    public int total(String name, String stuno, int sex) {
        int total = 0;
        try {
            List params = new ArrayList();//参数的集合
            //String sql = "select * from student";
            //注意下面的字符串,前后都要有空格,否则系统进行字符串拼接的时候,就都拼接到一起了
            StringBuffer sqlbuf = new StringBuffer(" select count(*) from student where 1=1 and state!=4 ");
            //拼接的条件
            if (name != null && name.length()>0){
                //如果name有值,则拼接下面的字符串内容
                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);//resultSet是一个数值
            while (resultSet.next()){
                total = resultSet.getInt(1);//取出数据
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return total;
    }


}

优化 1枚举值保存学生的状态

这个在日后的维护是很不利的,而且在团队开发中,也会产生很多误解

解决方法:Enum枚举

package com.yhp.util;

public enum StudentEnum {
    //更新学生的state(状态)状态:1表示在读;2休学;3退学;4删除
    //数据库中想要用的状态是数字;页面(程序)中想要用的是可以读懂的字符串
    READING(1,"在读"),
    SUSPENSION(2,"休学"),
    DROpOUT(3,"退学"),
    DELETE(4,"删除");

    public final Integer type;
    public final String value;

    StudentEnum(Integer type,String value){
        this.type=type;
        this.value = value;
    }
}

 把之前用数字的地方改为枚举值

在27、28行;132、133行

package com.yhp.dao.impl;

import com.yhp.bean.Student;
import com.yhp.dao.DBUtils;
import com.yhp.dao.StudentDao;
import com.yhp.util.StudentEnum;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class StudentDaoImpl extends DBUtils implements StudentDao {
    
    @Override
    public int deleteStu(String sid) {
        int i = 0;
        try {
            String sql = "update student set state = ? where stuid = ?";
            List params = new ArrayList();
            //params.add(4);//更新学生的state(状态)状态:1表示在读;2休学;3退学;4删除
            params.add(StudentEnum.DELETE.type);
            params.add(sid);
            i = update(sql, params);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return i;
    }

    
    @Override
    public int updateStu(Student student) {
        int update = 0;
        try {
            String sql = "update student set stuno=?, stuname=?,gid=?,sex=?,email=?,phone=?,registered=?,address=?,politics=?,idnumber=?,profession=?,introduction=? where stuid=?";
            //注意下面添加变量的顺序要和上面设置数据的顺序一致
            List params = new ArrayList();
            params.add(student.getStuNo());
            params.add(student.getStuName());
            params.add(student.getGid());
            params.add(student.getSex());
            params.add(student.getEmail());
            params.add(student.getPhone());
            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.getStuId());
            update = update(sql, params);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return update;
    }

    
    @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.setAddress(resultSet.getString("address"));
                student.setIdNumber(resultSet.getString("idnumber"));
                student.setPolitics(resultSet.getString("politics"));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return student;
    }

    
    @Override
    public int insertStu(Student student) {
        int i =0;
        try {
            String sql = "insert into student value(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(1);//状态:1表示在读;2休学;3退学;4删除
            params.add(StudentEnum.READING.type);
            params.add(student.getIntroduction());
            params.add(student.getGid());

            i = update(sql, params);//表示受影响的行数
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return i;
    }


    
    @Override
    public List getStudent(String name,String stuno,int sex,int pageIndex,int pageSize) {
        List list = new ArrayList<>();
        List params = new ArrayList();//参数的集合
        //String sql = "select * from student";
        //注意下面的字符串,前后都要有空格,否则系统进行字符串拼接的时候,就都拼接到一起了
        StringBuffer sqlbuf = new StringBuffer(" select * from student where 1=1 and state!=4 ");
        //拼接的条件
        if (name != null && name.length()>0){
            //如果name有值,则拼接下面的字符串内容
            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);
        }
        //添加分页条件
        sqlbuf.append(" limit ?,? ");//比如要获取第1页,每页5条,则limit0,5
        //limit (pageIndex-1)*pageSize,pageSize;
        params.add((pageIndex-1)*pageSize);//开始位置
        params.add(pageSize);//每页显示条数

        resultSet = query(sqlbuf.toString(), params);
        try {
            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;
    }
    
    @Override
    public int total(String name, String stuno, int sex) {
        int total = 0;
        try {
            List params = new ArrayList();//参数的集合
            //String sql = "select * from student";
            //注意下面的字符串,前后都要有空格,否则系统进行字符串拼接的时候,就都拼接到一起了
            StringBuffer sqlbuf = new StringBuffer(" select count(*) from student where 1=1 and state!=4 ");
            //拼接的条件
            if (name != null && name.length()>0){
                //如果name有值,则拼接下面的字符串内容
                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);//resultSet是一个数值
            while (resultSet.next()){
                total = resultSet.getInt(1);//取出数据
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return total;
    }


}
 2使用filter(过滤器)处理乱码

在添加学生和修改学生信息因为要接收大量数据,怕出乱码问题,加了一个req.setCharacterEncoding(“utf-8”)方法,来进行乱码的处理,每一次添加会很麻烦,所有可以使用过滤器,一次添加,永绝后患

 ①添加filter

注意:Filter是javax.servlet包的

package com.yhp.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter("
            writer.println("");
        }else {
            //新增失败
            //writer.println("");
            //弹窗显示新增失败,然后跳转到add.jsp页面
            
            writer.println("");
        }
    }
    //主键查询
    protected void findbyid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1接收参数:获取主键学生的ID
        String sid = req.getParameter("sid");
        //2处理查询的方法:根据主键查询学生信息
        StudentService service = new StudentServiceImpl();
        Student student = service.findById(Integer.parseInt(sid));

        //查询年级的动态列表
        GradeService gradeService = new GradeServiceImpl();
        List list = gradeService.getList();
        //存储年级集合
        req.setAttribute("glist",list);

        //存储学生的信息
        req.setAttribute("stu",student);
        //3跳转页面
        req.getRequestDispatcher("edit.jsp").forward(req,resp);
    }
    //查询列表
    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方法
        StudentService service = new StudentServiceImpl();

        //在jsp页面中sex默认为undefined(没有值),这样到后台中就会报错,这里就是一出异常,就给sex赋null值
        int s ;
        try {
            if (sex == null){
                s =-1;
            }else {
                s = Integer.parseInt(sex);
            }
        } catch (NumberFormatException e) {
            sex = null;//这里的问题是sex.length==0
        }
        //List students = service.getStudent(stuname,stuno,sex==null ? -1: Integer.parseInt(sex),index,5);
        //sex==null ? -1: Integer.parseInt(sex)防止第一次进入,sex没有传入任何值,而导致的转换错误

        //sex的三目运算符
        //int usex = sex==null || sex.length()==0 ? -1 : Integer.parseInt(sex);
        int usex = sex == null ?-1:Integer.parseInt(sex);
        List students = service.getStudent(stuname,stuno,usex,index,5);
        //获取总页数=总页数%每页显示的条数>0?总条数/每页显示条数+1:总条数/每页显示条数
        int total = service.total(stuname, stuno, usex);//总条数
        int totalPages = total%5>0 ? total/5+1 : total/5;//总页数

        //如果后台想给前台传数据,是一定要在后台存值的
        req.setAttribute("stulist",students);
        //因为这里的数据只在展示页面使用,在其他页面不是用,所以只用request存值即可
        System.out.println(sex);

        //3跳转页面(转发)
        //存储模糊差条件
        req.setAttribute("stuname",stuname);
        req.setAttribute("stuno",stuno);
        req.setAttribute("sex",sex);
        //存储分页数据
        req.setAttribute("index",index);//当前的页数
        req.setAttribute("size",5);//每页显示条数
        req.setAttribute("total",total);//总条数
        req.setAttribute("totalPages",totalPages);//总页数

        req.getRequestDispatcher("list.jsp").forward(req,resp);
    }
    //更新学员信息
    protected void update (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1接收参数
        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");
        //2调取方法
        Student student = new Student();
        student.setStuId(Integer.parseInt(sid));
        student.setStuNo(stuNo);
        student.setStuName(stuName);
        student.setGid(Integer.parseInt(gid));
        student.setSex(Integer.parseInt(sex));
        student.setEmail(email);
        student.setPhone(phone);
        student.setRegistered(registered);
        student.setAddress(address);
        student.setPolitics(politics);
        student.setProfession(profession);
        student.setIdNumber(idNumber);
        student.setIntroduction(introduction);

        StudentService service = new StudentServiceImpl();
        int i = service.updateStu(student);

        //3判断是否更新成功,弹窗显示,跳转页面
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        if (i>0){
            //修改成功:跳转到查询全部
            writer.println("");
        }else {
            //修改失败
            
            writer.println
                    ("");
        }
    }
}
4学号的非重复性验证:AJAX (1)add.jsp页面:添加页面

只需要实现在数据库中查找是否有相同的学号即可,有则报错,没有则通过

① web/js目录下添加js文件:jquery-1.8.0.mim.js

②学号标签加上id,后面加上span标签,用来显示是否有重复

jquery代码:

servlet

service

实现service 

dao

实现dao

(2)edit.jsp:修改页面

需要查询数据库中是否有相同的学号,并且要排除本学号重复的情况,有则报错,无则通过

表单部分

ajax部分

servlet

查询是否有相同学号的方法,用之前的添加页面的创建的方法即可,现在需要获取本id的学号

service

service的实现类

dao

dao的实现类

5filter:登陆验证 

package com.yhp.web;

import com.yhp.bean.Users;
import com.yhp.service.UsersService;
import com.yhp.service.impl.UsersServiceImpl;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1接收参数
        String username = req.getParameter("TxtUserName");
        String password = req.getParameter("TxtPassword");
        //2调取service
        UsersService usersService = new UsersServiceImpl();//用接口声明,new接口的实现类
        Users users = usersService.login(username, password);
        //3跳转页面
        if (users == null){
            //以弹窗方式提示用户,登陆失败
            resp.setContentType("text/html;charset=utf-8");//避免乱码
            PrintWriter writer = resp.getWriter();
            writer.println("");
        }else {
            //重定向跳转到主页面
            //保存用户信息
            req.getSession().setAttribute("u1",users);
            resp.sendRedirect("index.jsp");
        }
    }
}

注意:这里从session中获取的数据,是在LoginServlet.java中存的数据

​​​​​​​

二JavaWeb项目实战-权限管理 1数据库分析与创建 (1)数据库分析

使用4张表:用户表、角色表、权限表、角色与权限的中间表

角色表和权限表之间的关系:多对多(某个角色对应多个权限,某个权限对应多个角色)

角色表和用户表之间的关系:一对多(某个角色对应多个用户,一个用户对应一个角色)

(2)数据库的创建与数据填充

菜单表中的url存储的是,按钮对应的地址

菜单表也就是这些菜单按钮,有对应权限,才能打开对应的菜单

 

中间表把角色和菜单对应起来

角色表和菜单表的关系为多对多,一个角色有多个菜单权限,多个角色可以有共同的菜单权限

 2实体类创建 (1)Users:用户表

之前的Users实体类只有4个成员变量,因为权限管理,Users又添加了7个数据库的列,所以对应的实体类也要把他们添加上

package com.yhp.bean;
//用户信息实体类
//多表关系分析:用户表和角色表为多对一的关系,多个用户对应一个角色
public class Users {
    private Integer userId;//用户id
    private String loginName;//登陆账号
    private String passWord;//密码
    private String realName;//真实姓名
    private Integer sex;//性别
    private String email;//邮箱
    private String phone;//电话
    private String cardId;//身份证
    private String descs;//简介
    private String roleId;//角色id
    private String address;//地址

    private Role role;//角色的属性:一个用户对应一个角色

    public Role getRole() {
        return role;
    }
    public void setRole(Role role) {
        this.role = role;
    }
    public Integer getSex() {
        return sex;
    }
    public void setSex(Integer sex) {
        this.sex = sex;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getCardId() {
        return cardId;
    }
    public void setCardId(String cardId) {
        this.cardId = cardId;
    }
    public String getDescs() {
        return descs;
    }
    public void setDescs(String descs) {
        this.descs = descs;
    }
    public String getRoleId() {
        return roleId;
    }
    public void setRoleId(String roleId) {
        this.roleId = roleId;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    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;
    }
}
(2)role:角色表
package com.yhp.bean;

import java.util.List;

public class Role {
    private Integer roleId;//角色id
    private String roleName;//角色姓名
    private Integer roleState;//角色状态:1可用;0禁用

    private List usersList;//用户属性:一个角色可以对应多个用户
    private List menuList;//菜单属性:菜单和角色是多对多的关系

    public List getUsersList() {
        return usersList;
    }
    public void setUsersList(List usersList) {
        this.usersList = usersList;
    }
    public List getMenuList() {
        return menuList;
    }
    public void setMenuList(List menuList) {
        this.menuList = menuList;
    }
    public Integer getRoleId() {
        return roleId;
    }
    public void setRoleId(Integer roleId) {
        this.roleId = roleId;
    }
    public String getRoleName() {
        return roleName;
    }
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }
    public Integer getRoleState() {
        return roleState;
    }
    public void setRoleState(Integer roleState) {
        this.roleState = roleState;
    }
}
(3)menu:菜单表
package com.yhp.bean;

import java.util.List;

public class Menu {
    private Integer menuId;
    private String menuName;
    private Integer upMenuId;
    private Integer state;
    private String desc;
    private String url;

    private List roleList;//菜单和角色是多对多的关系

    public Integer getMenuId() {
        return menuId;
    }
    public void setMenuId(Integer menuId) {
        this.menuId = menuId;
    }
    public String getMenuName() {
        return menuName;
    }
    public void setMenuName(String menuName) {
        this.menuName = menuName;
    }
    public Integer getUpMenuId() {
        return upMenuId;
    }
    public void setUpMenuId(Integer upMenuId) {
        this.upMenuId = upMenuId;
    }
    public Integer getState() {
        return state;
    }
    public void setState(Integer state) {
        this.state = state;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public List getRoleList() {
        return roleList;
    }
    public void setRoleList(List roleList) {
        this.roleList = roleList;
    }
}
(4)middle:中间表

注意:中间表是不需要添加实体类的

​​​​​​​3用户管理按钮:列表展示

limit分页语句;多表联查;

left.jsp:调用“用户管理”的地址

 

UsersServlet

 

service

如果需要模糊查询的话,就在查询总条数的方法中,传入模糊查询的条件

serviceImpl

 

dao

 

daoImpl

 

/power/user/list.jsp

1引入jstl标签库

2c标签foreach遍历集合

​​​​​​​ 

 

 

 

 

 

 

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号