Bootstrap

JavaWeb项目实战

没有任何优化的代码 

数据库

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

2创建登陆用户的表格

 3创建年级的表格

4创建学员表格

填写测试数据 

1给用户表添加数据

2给年级表填写数据

3学生表添加数据

insert into student values(1,'张三','stu1001',1,'13719201111','[email protected]','北京','XX区XX镇','物理','2209121102911111','党员','2020-01-01',1,'优秀学员1',1)(2,'李四','stu1002',1,'13719203830','[email protected]','上海','XX区XX镇','化学','22091211029121212','党员','2020-05-03',1,'优秀学员2',1),(3,'王五','stu1003',1,'13719201111','[email protected]','杭州','XX区XX镇','生物','32091211029121212','党员','2020-06-03',1,'优秀学员3',2),(4,'赵六','stu1004',1,'13719204444','[email protected]','四川','XX区XX镇','英语','44444411029121212','群众','2020-04-04',1,'优秀学员4',2),(5,'李雷','stu1005',1,'13719205555','[email protected]','湖南','XX区XX镇','医学','220912110295555555','群众','2020-05-05',1,'优秀学员5',3),(6,'韩梅梅','stu1006',0,'1371920666','[email protected]','武汉','XX区XX镇','政治','220912110291666666','群众','2020-06-06',1,'优秀学员6',3),(7,'翠花','stu1007',0,'13719207777','[email protected]','天津','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;

/**
 * 年级表的实体类
 * 表名=类名,列名=属性名
 * 尽量使用包装类int->Integer
 */
public class Grade {
    private Integer gradeId;//年级编号
    private String gradeName;//年级名称
    //年级和学生之间是一对多的关系:一个年级包含多个学生
    private List<Student> 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<Student> getStudentList() {
        return studentList;
    }
    public void setStudentList(List<Student> 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<list.size();i++) {
                     try {
                         pps.setObject(i+1,list.get(i));
                     } catch (SQLException throwables) {
                         throwables.printStackTrace();
                     }
                 }
             }
    }

    //6.执行操作(增删改+查询)
    protected  int  update(String sql,List list){
        getPps(sql);
        param(list);
        try {
            count= pps.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return count;
    }

    //7.查询
    protected  ResultSet query(String sql,List list){
        getPps(sql);
        param(list);
        try {
            resultSet= pps.executeQuery();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return resultSet;
    }

    //8.关闭资源
    protected  void closeAll(){
        try {
            if (connection != null) {
                connection.close();
            }
            if (pps != null) {
                pps.close();
            }

            if (resultSet != null) {
                resultSet.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }




}

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标签库

②将需要循环展示的真实数据,用<c:forEach></c:forEach>包裹 

(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的值为男或者女,则男或者女为默认值 

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

 

8更新数据 

(1)修改提交地址,修改表单元素的名字(可以不改,不过最好修改为成员变量的名字)

修改后 

①下拉列表框的name属性

②文本域的name属性

*③在隐藏域中存值:type= “hidden”

 (2)定义Servlet类

①Service层

②Service层的实现类,调用Dao层

③ Dao层

④Dao层的实现类:

把Servlet层从前端获取的数据,获取出来,并且把它添加到集合内,发送到Druid中,通过里面的方法,把它和sql语句一起在数据库中运行,将数据添加到数据库中 

 9删除数据

点击删除按钮之后删除数据

在开发过程中,删除有两种:

        ①真删除:直接delete

        ②假删除:更新表中状态列的值

(1)首先在list.jsp页面找到删除按钮,修改其路径

修改后:

(2)创建DeleteByIdServlet

①首先创建StudentService的删除学生信息方法

②StudentServiceImpl实现StudentService的删除学生信息的方法,主要就是调用StudentDao的方法

③创建StudentDao的删除学生信息的方法

④StudentDaoImpl实现StudentDao删除学生信息的方法,并且继承DBUtils可以使用德鲁伊操作数据库

这里是假删除,数据库中没有删除数据,只是修改了学生的状态值为4

⑤为了修改状态值为4后,前端页面并不会继续显示该学生的信息,我们需要把之前“分页模糊查询”的查询条件加上 ,不显示state=4的数据 

⑥为了之后显示总条数和实际显示的条数是一样的,还需要修改“获取总条数”的sql语句

最后DeleteByIdServlet的代码为

 未优化的代码

JSP代码

login.jsp:登陆页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>用户登录</title>

<link href="css/login.css" type="text/css" rel="stylesheet" />

</head>
<body id="userlogin_body">
<form action="login" method="post">
<div id="user_login">
	<dl>
		<dd id="user_top">
			<ul>
				<li class="user_top_l"></li>
				<li class="user_top_c"></li>
				<li class="user_top_r"></li>
			</ul>
		</dd>
		<dd id="user_main">
			<ul>
				<li class="user_main_l"></li>
				<li class="user_main_c">
					<div class="user_main_box">
						<ul>
							<li class="user_main_text">用户名: </li>
							<li class="user_main_input">
								<input name="TxtUserName" maxlength="20" id="TxtUserName" class="txtusernamecssclass">
							</li>
						</ul>
						<ul>
							<li class="user_main_text">密 码: </li>
							<li class="user_main_input">
								<input type="password" name="TxtPassword" id="TxtPassword" class="txtpasswordcssclass">
							</li>
						</ul>
						
						
					</div>
				</li>
				<li class="user_main_r">
				<a href="index.jsp">
				<input type="image" name="IbtnEnter" src="img/user_botton.gif" class="ibtnentercssclass">
				</a>
				</li>
			</ul>
		</dd>
		<dd id="user_bottom">
			<ul>
				<li class="user_bottom_l"></li>
				<li class="user_bottom_c"></li>
				<li class="user_bottom_r"></li>
			</ul>
		</dd>
	</dl>
</div>
</form>

</body>
</html>

 left.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv=content-type content="text/html; charset=utf-8" />
        <link href="css/admin.css" type="text/css" rel="stylesheet" />
        <script language=javascript>
            function expand(el)
            {
                childobj = document.getElementById("child" + el);

                if (childobj.style.display == 'none')
                {
                    childobj.style.display = 'block';
                }
                else
                {
                    childobj.style.display = 'none';
                }
                return;
            }
        </script>
    </head>
    <body background=img/menu_bg.jpg >
        <table height="100%" cellspacing=0 cellpadding=0 width=170   background=./img/menu_bg.jpg border=0>
            <tr>
                <td valign=top align=middle>
                    <table cellspacing=0 cellpadding=0 width="100%" border=0>
						<tr>
                            <td height=10></td>
						</tr>
					</table>
                   
             
					<table cellspacing=0 cellpadding=0 width=150 border=0>
                        <tr height=22>
                            <td style="padding-left: 30px" background=./img/menu_bt.jpg>
							   <a     class=menuparent onclick=expand(2)    href="javascript:void(0);">教务中心</a>
							 </td>
						</tr>
                        <tr height=4>
                            <td></td>
						</tr>
					</table>		
							
					<table id=child2 style="display: none" cellspacing=0 cellpadding=0  width=150 border=0>
                       
						<tr height=20>
                            <td align=middle width=30>
								<img height=9  src="./img/menu_icon.gif" width=9>
							</td>
                            <td>
								<%--<a class=menuchild  href="Educational/student/list.jsp"   target="right">学生管理</a>--%>
                                <%--上面是前端提供的路径,下面是修改的路径Educational/student这里最好不要改,否则css样式可能会没有--%>
                                <a class=menuchild  href="Educational/student/getStudentList"   target="right">学生管理</a>
							</td>
						</tr>
						
						
                      
                        <tr height=4>
                            <td colspan=2></td>
						</tr>
					</table>
					
					
									
				</td>
                <td width=1 bgcolor=#d1e6f7></td>
            </tr>
        </table>
    </body>
</html>

right.jsp 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv=content-type content="text/html; charset=utf-8" />
        <link href="css/admin.css" type="text/css" rel="stylesheet" />
    </head>
    <body>
        <table cellspacing=0 cellpadding=0 width="100%" align=center border=0>
            <tr height=28>
                <td background=./img/title_bg1.jpg>当前位置: </td></tr>
            <tr>
                <td bgcolor=#b1ceef height=1></td></tr>
            <tr height=20>
                <td background=./img/shadow_bg.jpg></td></tr></table>
        <table cellspacing=0 cellpadding=0 width="90%" align=center border=0>
            <tr height=100>
                <td align=middle width=100>
					<img height=100 src="./img/admin_p.gif"  width=90>
				</td>
                <td width=60>&nbsp;</td>
                <td>
                    <table height=100 cellspacing=0 cellpadding=0 width="100%" border=0>

                        <tr>
                         <td>当前时间:2018-12-27 17:03:55</td>
						</tr>
                        <tr>
                            <td style="font-weight: bold; font-size: 16px">${u1.loginName}</td>
						</tr>
                        <tr>
                            <td>欢迎进入网站管理中心!</td></tr></table></td>
						</tr>
            <tr>
         <td colspan=3 height=10></td></tr></table>
       
    </body>
</html>

head.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv=content-type content="text/html; charset=utf-8" />
        <link href="./css/admin.css" type="text/css" rel="stylesheet" />
    </head>
    <body>
        <table cellspacing=0 cellpadding=0 width="100%" 
               background="./img/header_bg.jpg" border=0>
            <tr height=56>
                <td width=260>
				<!--<img height=56 src="img/header_left.jpg"  width=260>--></td>
                <td style="font-weight: bold; color: #fff; padding-top: 20px" 
                    align=middle> 
														<!-- onclick="if (confirm('确定要退出吗?')) return true; else return false;"  -->
                </td>
                <td style="font-weight: bold; color: #fff; padding-top: 20px" 
                    align="right">
                    当前用户:${u1.loginName} &nbsp;&nbsp;
					<a href="loginout">退出</a>
					
                    </td></tr></table>
        <table cellspacing=0 cellpadding=0 width="100%" border=0>
            <tr bgcolor=#1c5db6 height=4>
                <td></td>
            </tr>
        </table>
    </body>
</html>

 index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!doctype html public "-//w3c//dtd xhtml 1.0 frameset//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-frameset.dtd">
<html>
    <head>
        <meta http-equiv=content-type content="text/html; charset=utf-8" />
        <meta http-equiv=pragma content=no-cache />
        <meta http-equiv=cache-control content=no-cache />
        <meta http-equiv=expires content=-1000 />
        
        <title>湖南商贸经济管理专修学院</title>
    </head>
    <frameset border=0 framespacing=0 rows="60, *" frameborder=0>
        <frame name=head src="head.jsp" frameborder=0 noresize scrolling=no>
            <frameset cols="170, *">
                <frame name=left src="left.jsp" frameborder=0 noresize />
                <frame name=right src="right.jsp" frameborder=0 noresize scrolling=yes />
            </frameset>
    </frameset>
    <noframes>
    </noframes>
</html>

 if.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!doctype html public "-//w3c//dtd xhtml 1.0 frameset//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-frameset.dtd">
<html>
    <head>
        <meta http-equiv=content-type content="text/html; charset=utf-8" />
        <meta http-equiv=pragma content=no-cache />
        <meta http-equiv=cache-control content=no-cache />
        <meta http-equiv=expires content=-1000 />
        
        <title>启明星辰人力资源管理V1.0</title>
    </head>
		<frameset cols="170, *">
                <frame name=left src="left.jsp" frameborder=0 noresize />
                <frame name=right src="right.jsp" frameborder=0 noresize scrolling=yes />
		</frameset>		
    <noframes>	
    </noframes>
</html>

 add.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>
	学生信息管理平台
</title>
	<link href="../../Style/StudentStyle.css" rel="stylesheet" type="text/css" />
	<link href="../../Script/jBox/Skins/Blue/jbox.css" rel="stylesheet" type="text/css" />
	<link href="../../Style/ks.css" rel="stylesheet" type="text/css" />
	<link href="../../css/mine.css" type="text/css" rel="stylesheet">
    <script src="../../Script/jBox/jquery-1.4.2.min.js" type="text/javascript"></script>
    <script src="../../Script/jBox/jquery.jBox-2.3.min.js" type="text/javascript"></script>
    <script src="../../Script/jBox/i18n/jquery.jBox-zh-CN.js" type="text/javascript"></script>
    <script src="../../Script/Common.js" type="text/javascript"></script>
    <script src="../../Script/Data.js" type="text/javascript"></script>
    

</head>
<body>

		<div class="div_head">
            <span>
                <span style="float:left">当前位置是:教务中心-》学生管理-》新增</span>
                <span style="float:right;margin-right: 8px;font-weight: bold"></span>
            </span>
        </div>
</div>
<div class="cztable">
    <form action="/Educational/student/addStu" method="post">
	<table border="1" width="100%" class="table_a">
                <tr  width="120px;">
                    <td width="10%">学号:<span style="color:red">*</span>:</td>
                    <td>
						<input type="text"  name="stuNo" value="" />
					</td>
                </tr>

                <tr  width="120px;">
                    <td>姓名<span style="color:red">*</span>:</td>
                    <td>
						<input type="text"  name="stuName" value="杨XX" />
					</td>
                </tr>
              
                <tr>
                    <td>班级<span style="color:red">*</span>:</td>
                    <td>
                        <select name="gid"><%--下拉列表的name--%>
                            <c:forEach items="${glist}" var="g">
                        	<option value="${g.gradeId}">${g.gradeName}</option>
                                <%--value是传给后台的数据,后台存储年级的时候用的是id--%>
                            </c:forEach>

                        </select>
                    </td>
                </tr>
                <tr>
                    <td>性别<span style="color:red">*</span>:</td>
                    <td>
                        <input type="radio" name="sex" checked value="1" />男
                        <input type="radio" name="sex" value="0"/>女
                    </td>
                </tr>


				<tr>
                    <td>EMAIL:</td>
                    <td>
                        <input type="text" name="email" value="[email protected]" />
                    </td>                
                </tr>

				<tr>
                    <td>联系电话:</td>
                    <td>
                        <input type="text" name="phone" value="13333333333" />
                    </td>                
                </tr>

				<tr>
                    <td>户口所在地:</td>
                    <td>
                        <input type="text" name="registered" value="北京"  />
                    </td>                
                </tr>

				<tr>
                    <td>住址:</td>
                    <td>
                        <input type="text" name="address" value="朝阳" />
                    </td>                
                </tr>
				<tr>
                    <td>政治面貌:</td>
                    <td>
                        <input type="text" name="politics" value="党员" />
                    </td>                
                </tr>
				<tr>
                    <td>身份证号:</td>
                    <td>
                        <input type="text" name="idNumber" value="110111111111111111111" />
                    </td>                
                </tr>
				
				<tr>
                    <td>专业:</td>
                    <td>
                        <input type="text" name="profession" value="java" />
                    </td>                
                </tr>
					
				
				<tr>
                    <td>简介<span style="color:red">*</span>:</td>
                    <td>
                        <textarea name="introdction">一个新开辟领域的探讨,探讨摸索</textarea>
                    </td>
                </tr>
				<tr>
					<td colspan=2 align="center">
						<input type="submit" value="添加" /> 
					</td> 
				</tr>
			</table>
	</form>
</div>

            </div>
        </div>
    </div>
</body>
</html>

edit.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>
	学生信息管理平台
</title>
	<link href="../../Style/StudentStyle.css" rel="stylesheet" type="text/css" />
	<link href="../../Script/jBox/Skins/Blue/jbox.css" rel="stylesheet" type="text/css" />
	<link href="../../Style/ks.css" rel="stylesheet" type="text/css" />
	<link href="../../css/mine.css" type="text/css" rel="stylesheet">
    <script src="../../Script/jBox/jquery-1.4.2.min.js" type="text/javascript"></script>
    <script src="../../Script/jBox/jquery.jBox-2.3.min.js" type="text/javascript"></script>
    <script src="../../Script/jBox/i18n/jquery.jBox-zh-CN.js" type="text/javascript"></script>
    <script src="../../Script/Common.js" type="text/javascript"></script>
    <script src="../../Script/Data.js" type="text/javascript"></script>
    

</head>
<body>

		<div class="div_head">
            <span>
                <span style="float:left">当前位置是:教务中心-》学生管理-》更新</span>
                <span style="float:right;margin-right: 8px;font-weight: bold"></span>
            </span>
        </div>
</div>
<div class="cztable">
    <form action="/Educational/student/updateStu" method="post">
        <input type="hidden" name="sid" value="${stu.stuId}">
	<table border="1" width="100%" class="table_a">
                <tr  width="120px;">
                    <td width="10%">学号:<span style="color:red">*</span>:</td>
                    <td>
						<input type="text"  name="stuNo" value="${stu.stuNo}" />
					</td>
                </tr>

                <tr  width="120px;">
                    <td>姓名<span style="color:red">*</span>:</td>
                    <td>
						<input type="text"  name="stuName" value="${stu.stuName}" />
					</td>
                </tr>
                 
                <tr>
                    <td>班级<span style="color:red">*</span>:</td>
                    <td>
                        <select name="gid">
                            <%--1需要年级动态展示
                            2需要学生原本信息的年级为默认年级--%>
                        	<c:forEach items="${glist}" var="g">
                            <option value="${g.gradeId}" ${g.gradeId == stu.gid?'selected':''}>${g.gradeName}</option>
                            </c:forEach>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>性别<span style="color:red">*</span>:</td>
                    <td>
                        <input type="radio" name="sex" ${stu.sex == 1? "checked":""} value="1" />男
                        <input type="radio" name="sex" ${stu.sex == 0? "checked":""}  value="0"/>女
                    </td>
                </tr>


				<tr>
                    <td>EMAIL:</td>
                    <td>
                        <input type="text" name="email" value="${stu.email}" />
                    </td>                
                </tr>

				<tr>
                    <td>联系电话:</td>
                    <td>
                        <input type="text" name="phone" value="${stu.phone}" />
                    </td>                
                </tr>

				<tr>
                    <td>户口所在地:</td>
                    <td>
                        <input type="text" name="registered" value="${stu.registered}"  />
                    </td>                
                </tr>

				<tr>
                    <td>住址:</td>
                    <td>
                        <input type="text" name="address" value="${stu.address}" />
                    </td>                
                </tr>
				<tr>
                    <td>政治面貌:</td>
                    <td>
                        <input type="text" name="politics" value="${stu.politics}" />
                    </td>                
                </tr>
				<tr>
                    <td>身份证号:</td>
                    <td>
                        <input type="text" name="idNumber" value="${stu.idNumber}" />
                    </td>                
                </tr>
				
				<tr>
                    <td>专业:</td>
                    <td>
                        <input type="text" name="profession" value="${stu.profession}" />
                    </td>                
                </tr>
					
				
				<tr>
                    <td>简介<span style="color:red">*</span>:</td>
                    <td>
                        <textarea name="introduction">${stu.introduction}</textarea>
                    </td>
                </tr>
				<tr>
					<td colspan=2 align="center">
						<input type="submit" value="保存"> 
					</td> 
				</tr>
			</table>
	</form>
</div>

            </div>
        </div>
    </div>
</body>
</html>

info.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>
	学生信息管理平台
</title>
	<link href="../../Style/StudentStyle.css" rel="stylesheet" type="text/css" />
	<link href="../../Script/jBox/Skins/Blue/jbox.css" rel="stylesheet" type="text/css" />
	<link href="../../Style/ks.css" rel="stylesheet" type="text/css" />
	<link href="../../css/mine.css" type="text/css" rel="stylesheet">
    <script src="../../Script/jBox/jquery-1.4.2.min.js" type="text/javascript"></script>
    <script src="../../Script/jBox/jquery.jBox-2.3.min.js" type="text/javascript"></script>
    <script src="../../Script/jBox/i18n/jquery.jBox-zh-CN.js" type="text/javascript"></script>
    <script src="../../Script/Common.js" type="text/javascript"></script>
    <script src="../../Script/Data.js" type="text/javascript"></script>
    

</head>
<body>

		<div class="div_head">
            <span>
                <span style="float:left">当前位置是:教务中心-》学生管理-》新增</span>
                <span style="float:right;margin-right: 8px;font-weight: bold"></span>
            </span>
        </div>
</div>
<div class="cztable">
    <form action="../../right.jsp" method="post">
	<table border="1" width="100%" class="table_a">
                <tr  width="120px;">
                    <td width="10%">学号:<span style="color:red">*</span>:</td>
                    <td>
						<input type="text"  name="f_goods_image" value="" />
					</td>
                </tr>

                <tr  width="120px;">
                    <td>姓名<span style="color:red">*</span>:</td>
                    <td>
						<input type="text"  name="f_goods_image" value="杨XX" />
					</td>
                </tr>
                 <tr>
                    <td>学院<span style="color:red">*</span>:</td>
                    <td>
                        <select>
                        	<option>矿冶工程学院</option>
                            <option>冶金工程学院</option>
                            <option>资源工程学院</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>专业<span style="color:red">*</span>:</td>
                    <td>
                        <select>
                        	<option>石油工程</option>
                            <option>煤炭工程</option>
                            <option>矿加工程</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>班级<span style="color:red">*</span>:</td>
                    <td>
                        <select>
                        	<option>一班</option>
                            <option>二班</option>
                            <option>三班</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>性别<span style="color:red">*</span>:</td>
                    <td>
                        <input type="radio" name="gender" checked value="1" />男 <input type="radio" name="gender" value="0"/>女
                    </td>
                </tr>


				<tr>
                    <td>EMAIL:</td>
                    <td>
                        <input type="text" name="f_goods_image" value="[email protected]" />
                    </td>                
                </tr>

				<tr>
                    <td>联系电话:</td>
                    <td>
                        <input type="text" name="f_goods_image" value="13333333333" />
                    </td>                
                </tr>

				<tr>
                    <td>户口所在地:</td>
                    <td>
                        <input type="text" name="f_goods_image" value="北京"  />
                    </td>                
                </tr>

				<tr>
                    <td>住址:</td>
                    <td>
                        <input type="text" name="f_goods_image" value="朝阳" />
                    </td>                
                </tr>
				<tr>
                    <td>政治面貌:</td>
                    <td>
                        <input type="text" name="f_goods_image" value="党员" />
                    </td>                
                </tr>
				<tr>
                    <td>身份证号:</td>
                    <td>
                        <input type="text" name="f_goods_image" value="110111111111111111111" />
                    </td>                
                </tr>
				
				<tr>
                    <td>专业:</td>
                    <td>
                        <input type="text" name="f_goods_image" value="java" />
                    </td>                
                </tr>
					
				
				<tr>
                    <td>简介<span style="color:red">*</span>:</td>
                    <td>
                        <textarea>一个新开辟领域的探讨,探讨摸索</textarea>
                    </td>
                </tr>
				<tr>
					<td colspan=2 align="center">
						<input type="submit" value="添加" /> 
					</td> 
				</tr>
			</table>
	</form>
</div>

            </div>
        </div>
    </div>
</body>
</html>

list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>学生信息管理平台</title>
    <link href="../../Style/StudentStyle.css" rel="stylesheet" type="text/css"/>
    <link href="../../Script/jBox/Skins/Blue/jbox.css" rel="stylesheet" type="text/css"/>
    <link href="../../Style/ks.css" rel="stylesheet" type="text/css"/>
    <link href="../../css/mine.css" type="text/css" rel="stylesheet">
    <script src="../../Script/jBox/jquery-1.4.2.min.js" type="text/javascript"></script>
    <script src="../../Script/jBox/jquery.jBox-2.3.min.js"
            type="text/javascript"></script>
    <script src="../../Script/jBox/i18n/jquery.jBox-zh-CN.js"
            type="text/javascript"></script>
    <script src="../../Script/Common.js" type="text/javascript"></script>
    <script src="../../Script/Data.js" type="text/javascript"></script>

    <script>
        function del() {
            confirm("确认操作?");
        }

    </script>


</head>
<body>

<div class="div_head" style="width: 100%;text-align:center;">
		<span>
                <span style="float: left;">当前位置是:教务中心-》学生管理</span>
                <span style="float: right; margin-right: 8px; font-weight: bold;">
                    <a style="text-decoration: none;" href="/Educational/student/getGradeList">【新增学生】</a>&emsp;&emsp;&emsp;&emsp;
                </span>
            </span>
</div>

<div class="cztable">
    <div>
        <form action="/Educational/student/getStudentList" method="get">
            学生名称:
            <input type="text" name="stuname" value="${stuname}"/>
            学生学号:
            <input type="text" name="stuno" value="${stuno}"/>
            性别:
            <select name="sex">
                <option value="-1" ${sex==-1?"selected":""}>--请选择--</option>
                <%--${sex==1?"selected":""},如果sex的值等于1,则男被默认选中--%>
                <option value="1" ${sex==1?"selected":""}>男</option>
                <option value="0" ${sex==0?"selected":""}>女</option>
            </select>
            <input type="submit" value="查询"/>

        </form>


        <table width="100%" border="0" cellspacing="0" cellpadding="0">
            <tbody>
            <tr style="height: 25px" align="center">
                <th>学号</th>
                <th width="">姓名</th>
                <th width="">性别</th>
                <th width="15%">联系电话</th>
                <th width="15%">专业</th>
                <th width="15%">登记时间</th>
                <th>操作</th>
            </tr>

            <c:forEach items="${stulist}" var="stu">
                <%--items是被遍历的数据集合;var是数据取出来后叫什么名字--%>
                <tr id="product1">
                    <td align="center">${stu.stuNo}</td>
                        <%--学生的学号--%>
                    <td align="center">${stu.stuName}</td>
                        <%--学生姓名--%>
                    <td align="center">${stu.sex==1?'男':'女'}</td>
                        <%--性别--%>
                    <td align="center">${stu.phone}</td>
                        <%--手机号--%>
                    <td align="center">${stu.profession}</td>
                        <%--专业--%>
                    <td align="center">${stu.regdate}</td>
                        <%--登记时间--%>
                    <td align="center">
                        <a href="/Educational/student/findbyid?sid=${stu.stuId}">修改</a>
                        <a href="/Educational/student/deletebyid?sid=${stu.stuId}">删除</a>
                    </td>
                </tr>
            </c:forEach>


            <tr>
                <td colspan="20" style="text-align: center;">
                    <a style="text-decoration: none;"
                       href="/Educational/student/getStudentList?stuname=${stuname}&stuno=${stuno}&sex=${sex}">首页 </a>
                    <%--这里${stuname}&stuno=${stuno}&sex=${sex}是为了在模糊查询时,进行翻页操作,避免点击跳转页面出现模糊查询条件失效的情况--%>
                    <a style="text-decoration: none;"
                       href="/Educational/student/getStudentList?pageIndex=${index-1<=1?1:index-1}&stuname=${stuname}&stuno=${stuno}&sex=${sex}">上一页</a>
                    <%--上一页:当本页页数-1小于1,则为第1页,否则就当前页数-1--%>
                    <a style="text-decoration: none;"
                       href="/Educational/student/getStudentList?pageIndex=${index+1>=totalPages?totalPages:index+1}&stuname=${stuname}&stuno=${stuno}&sex=${sex}">下一页</a>
                    <a style="text-decoration: none;"
                       href="/Educational/student/getStudentList?pageIndex=${totalPages}&stuname=${stuname}&stuno=${stuno}&sex=${sex}">尾页</a>

                        共${total}条
                        每页显示
                        ${index}/${totalPages}
                </td>
            </tr>
            </tbody>
        </table>
    </div>4

</div>
</div>

</div>
</body>
</html>

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("<script>location.href='login.jsp';alert('用户名或密码不正确')</script>");
        }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("<script>alert('退出成功');top.location.href='login.jsp';</script>");
    }
}

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<Student> 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<Student> 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<Grade> 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("<script>alert('更新成功');location.href='/Educational/student/getStudentList'</script>");
        }else {
            //修改失败
            /*注意直接跳转到edit.jsp页面,会因为缺少年级列表的数据而报错,
                我们需要先去查询所有的信息(需要把主键值一起传过去),再跳转到edit.jsp页面*/
            writer.println("<script>alert('更新失败');location.href='/Educational/student/findbyid?sid="+sid+"'</script>");
        }
    }
}

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("<script>alert('新增成功');location.href='list.jsp'</script>");
            //弹窗显示新增成功,然后跳转到list.jsp页面
            /*注意直接跳转到list.jsp页面,会因为缺少学生列表显示的数据而报错,所以我们需要先去查询数据,
                然后由'/Educational/student/getStudentList'跳转到list.jsp页面*/
            writer.println("<script>alert('新增成功');location.href='/Educational/student/getStudentList'</script>");
        }else {
            //新增失败
            //writer.println("<script>alert('新增失败');location.href='add.jsp'</script>");
            //弹窗显示新增失败,然后跳转到add.jsp页面
            /*注意直接跳转到add.jsp页面,会因为缺少年级列表的数据而报错,
                所以我们先去查询数据,然后由'/Educational/student/getGradeList'去跳转到add.jsp页面*/
            writer.println("<script>alert('新增失败');location.href='/Educational/student/getGradeList'</script>");
        }
    }
}

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("<script>alert('删除成功');location.href='/Educational/student/getStudentList'</script>");
        }else {
            //修改失败
            //弹出"删除失败"的弹窗,并且跳转到GetStudentServlet查询显示数据,然后跳转到list.jsp页面显示所有的数据
            writer.println("<script>alert('删除失败');location.href='/Educational/student/getStudentList'</script>");
        }
    }
}

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("<script>alert('删除成功');location.href='/Educational/student/getStudentList'</script>");
        }else {
            //修改失败
            //弹出"删除失败"的弹窗,并且跳转到GetStudentServlet查询显示数据,然后跳转到list.jsp页面显示所有的数据
            writer.println("<script>alert('删除失败');location.href='/Educational/student/getStudentList'</script>");
        }
    }
}

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<Grade> getList();
}

StudentService

package com.yhp.service;

import com.yhp.bean.Student;

import java.util.List;

public interface StudentService {
    /**
     * 删除学生的信息
     * @param sid 学生的id
     * @return
     */
    public int deleteStu(String sid);
    /**
     * 修改学生的信息
     * @param student 学生的信息
     * @return
     */
    public int updateStu(Student student);
    /**
     * 主键查询的方法
     */
    public Student findById(int sid);

    /**
     * 获取所有学员的信息列表
     * name:学生姓名
     * stuno:学号
     * sex:性别
     * pageIndex:页码值
     * pageSize:每页显示条数
     */
    public List<Student> 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<Grade> 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();
    /**
     * 删除学生信息的方法
     * @param sid 学生的id
     * @return
     */
    @Override
    public int deleteStu(String sid) {
        return studentDao.deleteStu(sid);
    }

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

    /**
     * 主键查询的方法
     * @param sid 学生的id
     * @return
     */
    @Override
    public Student findById(int sid) {
        StudentDao studentDao = new StudentDaoImpl();
        return studentDao.findById(sid);
    }

    @Override
    public List<Student> 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<Grade> getList();
}

StudentDao

package com.yhp.dao;

import com.yhp.bean.Student;

import java.util.List;

public interface StudentDao {
    /**
     * 删除学生的信息
     * @param sid 学生的id
     * @return
     */
    public int deleteStu(String sid);
    /**
     * 修改学生的信息
     * @param student 学生的信息
     * @return
     */
    public int updateStu(Student student);
    /**
     * 主键查询的方法
     */
    public Student findById(int sid);

    /**
     * 获取所有学员的信息列表
     */
    public List<Student> 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 {
    /**
     * 查询年级列表的方法(全查)
     * @return
     */
    @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("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<Object> 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 {
    /**
     * 删除学生的信息
     * 这里是一个假删除,更新学生的state(状态)状态:1表示在读;2休学;3退学;4删除
     * @param : sid 学生的id
     * @return :受影响行数
     */
    @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;
    }

    /**
     * 修改学生的信息
     * @param student 学生的信息
     * @return
     */
    @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;
    }

    /**
     * 主键查询的方法
     * @param sid
     * @return
     */
    @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;
    }

    /**
     * 增加学生信息
     * @param student
     * @return
     */
    @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;
    }


    /**
     * 分页模糊查询
     * @param name
     * @param stuno
     * @param sex
     * @param pageIndex
     * @param pageSize
     * @return
     */
    @Override
    public List<Student> 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;
    }
    /**
     * 获取总条数的方法
     * @return 总条数
     */
    @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 {
    /**
     * 删除学生的信息
     * 这里是一个假删除,更新学生的state(状态)状态:1表示在读;2休学;3退学;4删除
     * @param : sid 学生的id
     * @return :受影响行数
     */
    @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;
    }

    /**
     * 修改学生的信息
     * @param student 学生的信息
     * @return
     */
    @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;
    }

    /**
     * 主键查询的方法
     * @param sid
     * @return
     */
    @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;
    }

    /**
     * 增加学生信息
     * @param student
     * @return
     */
    @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;
    }


    /**
     * 分页模糊查询
     * @param name
     * @param stuno
     * @param sex
     * @param pageIndex
     * @param pageSize
     * @return
     */
    @Override
    public List<Student> 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;
    }
    /**
     * 获取总条数的方法
     * @return 总条数
     */
    @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("/*")
//也可以由web.xml进行过滤配置
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 {
        //1强制转换:把servletRequest强转为HttpServletRequest
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        request.setCharacterEncoding("utf-8");
        //2由filterChain.doFilter()进行调用
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

②web.xml配置过滤器地址

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--
    <filter>
        <filter-name>aa</filter-name>
        <filter-class>
            com.yhp.filter.EncodingFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>aa</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    -->
</web-app>

③之前的添加和修改的类里面就可以把req.setCharacterEncoding("utf-8");删除掉

3多请求走同一个servlet

之前每一个功能需要调用一个servlet

新增学员:

        /Educational/student/addStu

修改学员:

        /Educational/student/findbyid

        /Educational/student/updateStu

查询学员

        /Educational/student/getStudentList

删除学员

        /Educational/student/deletebyid

以上做每一个操作都需要一个Servlet,这样比较浪费资源,我们可以把上述的servlet都合并为一个/Educational/student/studentServlet,但是合并之后,我们要怎样精准的调用对应的新增、修改、查询和删除

解决方案:在地址后面拼接参数,

比如新增学员:/Educational/student/studentServlet?method=add

比如修改学员:/Educational/student/studentServlet?method=update

(1)新建StudentServlet类

①把其他的Servlet内容剪切到StudentServlet中,然后删除这些空的Servlet

②如何区分调用的是哪个Servlet

(2)参数怎么传:需要修改前端页面

①left.jsp页面

这里是需要查询全部学生信息的,因为在Servlet页面中这种情况是else,所以后面需要拼接method

②list.jsp页面

首先是底下的首页、上一页、下一页和尾页按钮,因为这里也是全查所以不需要拼接method

其次是修改和删除按钮,这里就需要拼接method了

③add.jsp页面

添加的表单提交地址

④edit.jsp页面

修改的表单提交地址

⑤还需要注意,在StudentServlet.java中,关于跳转页面也需要修改对应的地址

删除学员:修改成功和修改失败都直接查询所有学员信息,然后由查询所有学员信息方法进行跳转

更新学员:

        更新成功则跳转到查询所有学生信息方法,不需要拼接method

        更新失败后,则需要先到查询主键id,所以这里需要拼接method

StudenServlet代码

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/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);
        }
    }
    //删除学员
    protected void deletestu(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("<script>alert('删除成功');location.href='/Educational/student/getStudentList'</script>");
            //这里是跳转到查询列表,所以不需要拼接method
            writer.println("<script>alert('删除成功');location.href='/Educational/student/studentServlet'</script>");
        }else {
            //修改失败
            //弹出"删除失败"的弹窗,并且跳转到GetStudentServlet查询显示数据,然后跳转到list.jsp页面显示所有的数据
            //writer.println("<script>alert('删除失败');location.href='/Educational/student/getStudentList'</script>");
            //这里是跳转到查询列表,所以不需要拼接method
            writer.println("<script>alert('删除失败');location.href='/Educational/student/studentServlet'</script>");
        }
    }
    //新增学员
    protected void insert(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //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("<script>alert('新增成功');location.href='list.jsp'</script>");
            //弹窗显示新增成功,然后跳转到list.jsp页面
            /*注意直接跳转到list.jsp页面,会因为缺少学生列表显示的数据而报错,所以我们需要先去查询数据,
                然后由'/Educational/student/getStudentList'跳转到list.jsp页面*/
            writer.println("<script>alert('新增成功');location.href='/Educational/student/studentServlet'</script>");
        }else {
            //新增失败
            //writer.println("<script>alert('新增失败');location.href='add.jsp'</script>");
            //弹窗显示新增失败,然后跳转到add.jsp页面
            /*注意直接跳转到add.jsp页面,会因为缺少年级列表的数据而报错,
                所以我们先去查询数据,然后由'/Educational/student/getGradeList'去跳转到add.jsp页面*/
            writer.println("<script>alert('新增失败');location.href='/Educational/student/getGradeList'</script>");
        }
    }
    //主键查询
    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<Grade> 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<Student> 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<Student> 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("<script>alert('更新成功');location.href='/Educational/student/studentServlet'</script>");
        }else {
            //修改失败
            /*注意直接跳转到edit.jsp页面,会因为缺少年级列表的数据而报错,
                我们需要先去查询所有的信息(需要把主键值一起传过去),再跳转到edit.jsp页面*/
            writer.println
                    ("<script>alert('更新失败');location.href='/Educational/student/studentServlet?method=findbyid&sid="
                            +sid+"'</script>");
        }
    }
}

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("<script>location.href='login.jsp';alert('用户名或密码不正确')</script>");
        }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<Users> usersList;//用户属性:一个角色可以对应多个用户
    private List<Menu> menuList;//菜单属性:菜单和角色是多对多的关系

    public List<Users> getUsersList() {
        return usersList;
    }
    public void setUsersList(List<Users> usersList) {
        this.usersList = usersList;
    }
    public List<Menu> getMenuList() {
        return menuList;
    }
    public void setMenuList(List<Menu> 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<Role> 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<Role> getRoleList() {
        return roleList;
    }
    public void setRoleList(List<Role> roleList) {
        this.roleList = roleList;
    }
}

(4)middle:中间表

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

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

limit分页语句;多表联查;

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

UsersServlet

service

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

serviceImpl

dao

daoImpl

/power/user/list.jsp

1引入jstl标签库

2c标签foreach遍历集合

​​​​​​​ 

4用户管理->新增人员 

jstl标签,c:foreach循环

思路:

点击新增人员按钮->查询角色列表(servlet)->add.jsp->c:foreach遍历角色列表->角色id->addUsers->insert

->新增成功则查询列表数据

->新增失败,返回查询角色列表的请求->add.jsp 

(1)查询角色列表

因为这里有个角色列表,所以需要先到后台查询出角色列表,然后再跳转到新增人员页面

而不能直接跳转到新增人员这个jsp页面

 1修改新增人员路径

2创建servlet:该方法不需要获取参数

3创建service方法

4实现service方法

5创建UsersDao方法

6实现UsersDao方法,主要是查询role数据表,获取roleid和rolename数据

7add.jsp页面

引入jstl标签

通过servlet发送的list集合数据,

c:foreach循环遍历获取角色id和角色名称,角色名称用来显示,角色id作为值,当表单提交的时候,后台可以直接获得角色id

这里的c:forEach和Java中的forEach循环对比

items中的值就是从servlet中获取的roleList集合

var的值就相当于下方法的变量:role

直接用role.getRoleId()role.getRoleName()获取id和名字

注意

这里不加括号就会报错,因为这里是调用的方法

可以改成下面的,直接调用roleId属性,这样也不会出错

 (2)实现新增人员功能:添加新增人员信息到数据库中

->新增成功则查询列表数据

->新增失败,返回查询角色列表的请求->add.jsp 

1把所有的按钮,都添加上name后续可以在后台正常获取

包括之前查询的角色id,也不要忘记给他添加上name属性

2servlet

/**
     * 添加新增用户管理人员信息
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void addUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Users users = new Users();
        //1获取参数,并且将参数封装到users中
        users.setLoginName(req.getParameter("loginName"));//用户名
        users.setPassWord(req.getParameter("passWord"));//密码
        users.setRealName(req.getParameter("realName"));//姓名
        users.setSex(Integer.parseInt(req.getParameter("sex")));//性别1:男,0:女
        users.setEmail(req.getParameter("email"));//email
        users.setPhone(req.getParameter("phone"));//电话
        users.setCardId(req.getParameter("cardId"));//身份证
        users.setDescs(req.getParameter("descs"));//简介
        users.setRoleId(req.getParameter("roleId"));//角色id
        users.setAddress(req.getParameter("address"));//住址

        //2调用方法
        UsersService service = new UsersServiceImpl();
        int i = service.setUsers(users);
        //用弹窗的方式给用户提示,是否新增成功
        resp.setContentType("text/html;charset=utf-8 ");
        PrintWriter writer = resp.getWriter();
        if (i>0){
            //添加成功:提示信息;跳转到查询数据的servlet由他跳转到/power/user/users/list.jsp
            writer.println("<script>alert('新增成功');location.href='/power/user/users?method=select'</script>");
        }else {
            //添加失败:提示信息;跳转到查询角色列表的servlet由他跳转到/power/user/users/add.jsp
            writer.println("<script>alert('新增失败');location.href='/power/user/users?method=inquiryRole'</script>");
        }
    }

3service

4serviceImpl​​​​​​​ 

5dao

6daoImpl

 /**
     * 存储新增用户的方法
     * @param users
     * @return 0存储失败
     */
    @Override
    public int setUsers(Users users) {
        int update = 0;
        try {
            String sql =
                    "insert into users(loginname,password,realname,sex,roleid,email,phone,adress,cardid,descs) values(?,?,?,?,?,?,?,?,?,?)";//向users表中添加数据
            List params = new ArrayList();
            params.add(users.getLoginName());//账户名
            params.add(users.getPassWord());//密码
            params.add(users.getRealName());//姓名
            params.add(users.getSex());//性别
            params.add(users.getRoleId());//角色
            params.add(users.getEmail());//邮箱
            params.add(users.getPhone());//联系电话
            params.add(users.getAddress());//住址
            params.add(users.getCardId());//身份证
            params.add(users.getDescs());//简介

            update = update(sql, params);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return update;
    }

​​​​​​​

5角色管理按钮:角色管理页面展示

JSTL的forEach遍历、forEach循环

需要获取数据的总条数和数据的内容,所以需要调取两个查询数据库的方法

service

serviceImpl

dao

daoImpl

PageUtil

servlet

list.jsp

1引入jstl标签

2forEach遍历:角色管理的内容

${}中的pageUtil是servlet中存储的数据,.getRoleId()获取pageUtil中的roleid属性的值

 

3forEach循环

首页、上一页、页码值、下一页、尾页、总共多少条数据、每页多少条数据、当前页码数/总页码数

​​​​​​​

页码值:

用forEach循环,begin:开始值,end结束值,var临时遍历(相当于for循环中的i)

其中的 ‘NowItemStyle’是数据的动态效果,直接复制即可

*6 新增角色-菜单列表展示

1点击新增角色按钮之后先把新增的资源查询出来

注意:

菜单是分一二级的,需要把菜单遍历出来之后,进行一二级的拆分

教务中心和权限管理是一级目录,剩下的是二级目录

学生管理属于教务中心

用户、角色、菜单属于权限管理

dao

daoImpl

这里查询出来的是不分一二级的

service

2如何实现菜单一二级拆分:service层的业务操作 

 serviceImpl

Menu的实体类

里面添加了一个保存二级目录的集合,它的泛型是Menu(当前的类)

servlet

add.jsp

显示效果

​​​​​​​ 

*7新增角色-新增功能实现

1power/role/add.jsp

这里主要是对表单地址和角色名称输入框的name值进行了修改

注意:菜单列表,我们要传递他的菜单id,这里一级菜单和二级菜单id的获取方式,还要注意后台是通过name属性获取value值的 

        这里获取菜单id值是因为,创建菜单数据库和角色数据库之间的联系,是通过中间表做联系的,中间表里面需要菜单的id和角色的id

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>
        学生信息管理平台
    </title>
    <link href="../../Style/StudentStyle.css" rel="stylesheet" type="text/css"/>
    <link href="../../Script/jBox/Skins/Blue/jbox.css" rel="stylesheet" type="text/css"/>
    <link href="../../Style/ks.css" rel="stylesheet" type="text/css"/>
    <link href="../../css/mine.css" type="text/css" rel="stylesheet">
    <script src="../../Script/jBox/jquery-1.4.2.min.js" type="text/javascript"></script>
    <script src="../../Script/jBox/jquery.jBox-2.3.min.js" type="text/javascript"></script>
    <script src="../../Script/jBox/i18n/jquery.jBox-zh-CN.js" type="text/javascript"></script>
    <script src="../../Script/Common.js" type="text/javascript"></script>
    <script src="../../Script/Data.js" type="text/javascript"></script>


</head>
<body>

<div class="div_head">
            <span>
                <span style="float:left">当前位置是:教务中心-》考试-》新增</span>
                <span style="float:right;margin-right: 8px;font-weight: bold">
                    <a style="text-decoration: none" href="javascript:history.back();">【返回】</a>
                </span>
            </span>
</div>
</div>
<div class="cztable">
    <form action="/power/role/rose?method=insert" method="post">
        <table border="1" width="100%" class="table_a">
            <tr width="120px;">
                <td width="120px">角色名:<span style="color:red">*</span>:</td>
                <td>
                    <input type="text" name="roleName" value="管理员"/>
                </td>
            </tr>

            <tr width="120px;">
                <td>菜单资源<span style="color:red">*</span>:</td>
                <td>
                    <%--<ul>
                        <li><input type="checkbox" name="menu"  />权限管理
                            <ul>
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="menu"  />人员管理</li>
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="menu"  />角色管理</li>
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="menu"  />菜单管理</li>
                            </ul>
                        </li>
                        <li><input type="checkbox" name="menu"  />个人中心</li>
                        <li><input type="checkbox" name="menu"  />教务中心</li>
                    </ul>--%>
                    <c:forEach items="${menulist}" var="m">
                        <ul>
                            <li><input type="checkbox" name="menu" value="${m.menuId}"/>${m.menuName}
                                <ul>
                                    <c:forEach items="${m.secondMenuList}" var="m2">
                                        <li>&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="menu" value="${m2.menuId}"/>${m2.menuName}</li>
                                    </c:forEach>
                                </ul>
                            </li>
                        </ul>
                    </c:forEach>
                </td>
            </tr>

            <tr>
                <td>启用状态<span style="color:red">*</span>:</td>
                <td>
                    <input type="radio" name="state" checked value="1"/>启用
                    <input type="radio" name="state" value="0"/>禁用
                </td>
            </tr>

            <tr width="120px">
                <td colspan="2" align="center">
                    <input type="submit" value="添加"/>
                </td>
            </tr>
        </table>
    </form>
</div>

</div>
</div>

</div>
</body>
</html>

2 RoleServlet

13调取roleService的方法

注意:这里用到了从前端获取一组值的方法

String[] 变量名 = req.getParameterValues("前端的name属性");
@WebServlet(urlPatterns = "/power/role/rose")
public class RoleServlet extends HttpServlet {
    private RoleService roleService = new RoleServiceImpl();
    private MenuService menuService = new MenuServiceImpl();
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getParameter("method");
        if ("select".equals(method)){
            select(req,resp);
        }else if ("selectmenus".equals(method)){
            selectmenus(req,resp);
        }else if ("insert".equals(method)){
            //调用新增角色的方法
            insert(req,resp);
        }
    }

    /**
     * 新增角色
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void insert(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String rolename = req.getParameter("roleName");//角色名称
        String state = req.getParameter("state");//状态
        String[] menuids = req.getParameterValues("menu");//获得一组值:菜单id
        int i = roleService.insertRole(rolename, state, menuids);
        if (i>0){
            //新增成功,重定向到/power/role/rose?method=select,查询列表
            resp.sendRedirect("/power/role/rose?method=select");
        }else {
            /*新增失败,重定向到/power/role/rose?method=selectmenus,查询菜单列表的请求,                              由他跳转到新增页面*/
            resp.sendRedirect("/power/role/rose?method=selectmenus");
        }
    }
 /**
     * 查询菜单列表
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void selectmenus(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1接收参数
        //2调取service方法
        List<Menu> menuList = menuService.getMenuList();
        req.setAttribute("menulist",menuList);
        req.getRequestDispatcher("add.jsp").forward(req,resp);
    }

    /**
     * 数据查询:角色列表信息和总条数信息
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void select(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PageUtil pageUtil = new PageUtil();//实现分页功能的工具类
        //1获取参数(模糊查询条件+分页查询数据)
        //1.1模糊查询条件:没有,所以不用接收
        //1.2分页查询数据:
        String pageIndex = req.getParameter("pageIndex");//开始位置(当前页码值)前台获取
        //当前页码值:如果页码没有传入页码值(pageIndex),则认为默认查询第一页
        int index = (pageIndex==null || pageIndex.length() ==0)? 1:Integer.parseInt(pageIndex);
        //2调用方法
        List<Role> roleList = roleService.getRoleList(index,pageUtil.getPageSize());//角色列表信息
        int total = roleService.total();//获取总条数
        //PageUtil
        pageUtil.setPageIndex(index);//将页码值(pageIndex),封装进PageUtil
        pageUtil.setDataList(roleList);//将角色列表信息(dataList),封装进PageUtil
        pageUtil.setTotal(total);//将总条数信息(total),封装进PageUtil
        //显示条数(pageSize):固定为5
        /*总页数(totalPages):在PageUtil中已经计算出了
          (总条数%每页显示的条数,如果没有余数,则总页数=总条数/每页显示的条数;如果有余数,则总页数=总条数/每页显示的条数+1)*/

        //3保存数据,跳转页面
        req.setAttribute("pageUtils",pageUtil);//将PageUtil传递给前端
        req.getRequestDispatcher("list.jsp").forward(req,resp);
    }
}

3RoleService

public interface RoleService {
    /**
     * 新增角色表
     * @param rolename 角色名称
     * @param state 状态值
     * @param ids 一二级菜单值
     * @return 受影响的行数
     */
    public int insertRole(String rolename,String state,String[] ids);

4RoleServiceImpl:注意:在这个Service中就出现业务逻辑了

11调用中间表方法,

public class RoleServiceImpl implements RoleService {
    private RoleDao roleDao = new RoleDaoImpl();//service层调用dao层的方法
    private MiddleDao middleDao = new MiddleDaoImpl();//中间表
    /**
     * 新增角色表
     * @param rolename 角色名称
     * @param state 状态值
     * @param ids 一二级菜单值
     * @return k1为1时,则说明程序正常走完,数据分别存入了角色表和中间表,k1为0则说明程序出问题了
     */
    @Override //注意:事务问题的操作,目前没有把事务加进来
    public int insertRole(String rolename, String state, String[] ids) {
        int k1= 0;//执行是否成功的标记
        try {
            //1新增角色表
            Role role = new Role();
            role.setRoleName(rolename);
            role.setRoleState(Integer.parseInt(state));
            int k = roleDao.insert(role);
            //2新增中间表
            //如何获得新增角色的id
            middleDao.insertMiddle(k,ids);//调取中间表方法
            //k:角色id;ids:菜单id们
            k1 =1;//如果没有异常,k1就会等于1,如果有则k1=0
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        return k1;
    }

7如何获得新增角色的ID:修改并使用DBUtils的方法

//4.得到预状态通道
    protected  PreparedStatement getPps(String sql){
        try {
           // pps= getConnection().prepareStatement(sql);
            pps= getConnection().prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
            //Statement.RETURN_GENERATED_KEYS:表示要获得新增数据的ID值
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return pps;
    }

5RoleDao

public interface RoleDao {
    /**
     * 新增角色
     * @param role 角色对象
     * @return 受影响的行数
     */
    public int insert(Role role);

6RoleDaoImpl

8获取新增角色的id

public class RoleDaoImpl extends DBUtils implements RoleDao {
    /**
     * 新增角色
     * @param role 角色对象
     * @return
     */
    @Override
    public int insert(Role role) {
        int key =0;//新增数据的id
        try {
            String sql = "insert into role values(null,?,?)";
            //角色id是自增长的,给null值
            List params = new ArrayList();
            params.add(role.getRoleName());//角色名称
            params.add(role.getRoleState());//角色状态
            int update = update(sql,params);//update变量保存的是受影响的行数
               // 获取新增的角色的id
            ResultSet generatedKeys = pps.getGeneratedKeys();//返回的是一个结果集
            if (generatedKeys.next()){
                key=generatedKeys.getInt(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return key;//新增角色的id
    }

9新建中间表:MiddleDao

public interface MiddleDao {
    /**
     * 新增角色,将中间表中添加角色id和菜单id值们相互关联添加
     * @param roleid 角色的id
     * @param ids 菜单ID值们
     * @return
     */
    public int insertMiddle(int roleid,String[] ids);
}

10MiddleDaoImpl

package com.yhp.dao.impl;

import com.yhp.dao.DBUtils;
import com.yhp.dao.MiddleDao;

import java.sql.PreparedStatement;
import java.sql.SQLException;

public class MiddleDaoImpl extends DBUtils implements MiddleDao {
    /**
     * 新增角色,将中间表中添加角色id和菜单id值们相互关联添加
     * @param roleid 角色的id
     * @param ids 菜单ID值们
     * @return 当k=1说明数据正常存入了中间表,当k=0则说明程序有问题
     */
    @Override
    public int insertMiddle(int roleid, String[] ids) {
        int k = 0 ;
        try {
            String sql = "insert into middle values(null,?,?)";
            //同时插入多行数据,使用批量新增方法
            pps = getPps(sql);//使用DBUtils的方法getPps()
            for (String id : ids) {
            //遍历菜单id值们
                pps.setInt(1,roleid);//将角色id添加到语句中
                pps.setString(2,id);//将菜单id添加到语句中
                pps.addBatch();//必须要有,没有就不会正常添加
            }
            pps.executeBatch();
            k=1;//执行过程中,没有异常,则k赋值为1
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return k;
    }
}

8动态权限列表

左侧菜单列表的动态更新,不同角色的用户登陆,看到的菜单目录应该是不一样的

这个修改用户登陆方法即可 ,如果当前登陆是用户名和密码是对的,我们就会返回一个带有对应值的user对象,表示登陆成功;如果登陆失败,则返回一个null。我们需要把它修改为带有角色信息,菜单信息的user对象

UsersServiceImpl

public class UsersServiceImpl implements UsersService {
    //创建Dao层对象
    private UsersDao usersDao = new UsersDaoImpl();
    private RoleDao roleDao = new RoleDaoImpl();

    /**
     * 登陆方法
     * 用户包含角色,角色包含菜单(菜单还是一二级分开的)
     * @param username
     * @param password
     * @return
     */
    @Override
    public Users login(String username, String password) {
        //由Dao对象调取UsersDao中的登陆方法
        //return usersDao.login(username,password);
        Users users = usersDao.login(username, password);
        if (users == null){
            return null;
        }
        //根据角色id查询角色,菜单信息(三表联查)
        Integer roleId = users.getRoleId();
        Role role = roleDao.fingById(roleId);
        //需要对菜单进行分级
        List<Menu> menuList = role.getMenuList();//取出集合
        List<Menu> newMenuList = new ArrayList<>();//保存分级以后的菜单

        for (Menu menu : menuList) {
            if (menu.getUpMenuId() == 0){//说明是一级菜单
                List<Menu> secondList = new ArrayList<>();//保存二级菜单的集合
                for (Menu second : menuList) {
                    if (second.getUpMenuId() == menu.getMenuId()){
                        //当二级菜单的父ID的值和一级菜单的菜单id相同,说明两者有关系
                        secondList.add(second);
                    }
                }
                menu.setSecondMenuList(secondList);//将二级菜单的集合添加到一级菜单的属性中
                newMenuList.add(menu);//将分好的一级菜单,添加到新的集合中
                //因为这是在if判断中,所以menu.getUpMenuId()!=0的是进不了这个集合中的
            }
        }
        role.setMenuList(newMenuList);
        users.setRole(role);
        return users;//用户包含角色,角色包含菜单,菜单分一二级
    }

UsersDaoImpl

public class UsersDaoImpl extends DBUtils implements UsersDao {
    /**
     * 登陆的方法
     * @param username
     * @param password
     * @return
     */
    @Override
    public Users login(String username, String password) {
        Users users = null;
        try {
            String sql = "select*from users where loginname = ? and password = ?";
            ArrayList<Object> 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"));
                //把角色id封装进users中
                users.setRoleId(resultSet.getInt("roleid"));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return users;
    }

RoleDaoImpl

public class RoleDaoImpl extends DBUtils implements RoleDao {
    /**
     * 动态权限列表:登陆时,根据角色id查询角色的菜单权限
     * 用户信息里面包含角色信息,角色信息里面包含菜单权限
     * @param roleId
     * @return
     */
    @Override
    public Role fingById(int roleId) {
        //角色包含菜单
        Role role = new Role();//角色对象
        List menuList = new ArrayList();//菜单集合
        try {
            //根据角色id查询中间表中对应的菜单id,查询出对应菜单信息和角色信息
            String sql = "select*from role r,menu m,middle mid where r.roleid=mid.roleid and mid.menuid=m.menuid and r.roleid=?";
            List params = new ArrayList();
            params.add(roleId);
            resultSet = query(sql,params);
            while (resultSet.next()){
                //角色信息
                role.setRoleId(resultSet.getInt("roleid"));//角色id
                role.setRoleName(resultSet.getString("rolename"));//角色名称
                role.setRoleState(resultSet.getInt("rolestate"));//角色状态
                //菜单信息
                Menu menu = new Menu();
                menu.setMenuId(resultSet.getInt("menuid"));//菜单id
                menu.setMenuName(resultSet.getString("menuname"));//菜单名称
                menu.setUrl(resultSet.getString("url"));//菜单的url地址(请求地址)
                menu.setState(resultSet.getInt("state"));//菜单状态
                menu.setUpMenuId(resultSet.getInt("upmenuid"));//上一级菜单id,我们要通过这个id,来判断它是否是一级菜单,以及它与二级菜单之间的关系
                menuList.add(menu);//把菜单信息放到菜单的集合中
            }
            role.setMenuList(menuList);//把菜单集合放到角色信息中
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            closeAll();
        }
        return role;
    }

首页:left.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv=content-type content="text/html; charset=utf-8" />
        <link href="css/admin.css" type="text/css" rel="stylesheet" />
        <script language=javascript>
            function expand(el)
            {
                childobj = document.getElementById("child" + el);

                if (childobj.style.display == 'none')
                {
                    childobj.style.display = 'block';
                }
                else
                {
                    childobj.style.display = 'none';
                }
                return;
            }
        </script>
    </head>
    <body background=img/menu_bg.jpg >
        <table height="100%" cellspacing=0 cellpadding=0 width=170   background=./img/menu_bg.jpg border=0>
            <tr>
                <td valign=top align=middle>
                    <table cellspacing=0 cellpadding=0 width="100%" border=0>
						<tr>
                            <td height=10></td>
						</tr>
					</table>
             <%--m1是一级菜单m2是二级菜单--%>
             <c:forEach items="${u1.role.menuList}" var="m1">
					<table cellspacing=0 cellpadding=0 width=150 border=0>
                        <tr height=22>
                            <td style="padding-left: 30px" background=./img/menu_bt.jpg>
							   <a     class=menuparent onclick=expand(${m1.menuId})    href="javascript:void(0);">${m1.menuName}</a>
							 </td>
						</tr>
                        <tr height=4>
                            <td></td>
						</tr>
					</table>		


					<table id=child${m1.menuId} style="display: none" cellspacing=0 cellpadding=0  width=150 border=0>
                 <c:forEach items="${m1.secondMenuList}" var="m2">
						<tr height=20>
                            <td align=middle width=30>
								<img height=9  src="./img/menu_icon.gif" width=9>
							</td>
                            <td>
                            <%--注意:href这里的值本来应该是对应的请求地址,这里变成了需要从数据库中调取的值--%>
                                    <a class=menuchild  href="${m2.url}"   target="right">${m2.menuName}</a>
							</td>
						</tr>
                 </c:forEach>
                        <tr height=4>
                            <td colspan=2></td>
						</tr>
					</table>

             </c:forEach>

				</td>
                <td width=1 bgcolor=#d1e6f7></td>
            </tr>
        </table>
    </body>
</html>

menu数据库

menuid1和menuid2是一级菜单,所以不用请求地址

menuid6目前还没有,给一个#表示刷新

 

;