数据库 1创建数据库school,并且使用该数据库
2创建登陆用户的表格 3创建年级的表格 4创建学员表格填写测试数据
1给用户表添加数据
2给年级表填写数据
3学生表添加数据
insert into student values(1,'张三','stu1001',1,'13719201111','11111111@qq.com','北京','XX区XX镇','物理','2209121102911111','党员','2020-01-01',1,'优秀学员1',1)(2,'李四','stu1002',1,'13719203830','3432312@qq.com','上海','XX区XX镇','化学','22091211029121212','党员','2020-05-03',1,'优秀学员2',1),(3,'王五','stu1003',1,'13719201111','3333333@qq.com','杭州','XX区XX镇','生物','32091211029121212','党员','2020-06-03',1,'优秀学员3',2),(4,'赵六','stu1004',1,'13719204444','4444444@qq.com','四川','XX区XX镇','英语','44444411029121212','群众','2020-04-04',1,'优秀学员4',2),(5,'李雷','stu1005',1,'13719205555','55555555@qq.com','湖南','XX区XX镇','医学','220912110295555555','群众','2020-05-05',1,'优秀学员5',3),(6,'韩梅梅','stu1006',0,'1371920666','6666666@qq.com','武汉','XX区XX镇','政治','220912110291666666','群众','2020-06-06',1,'优秀学员6',3),(7,'翠花','stu1007',0,'13719207777','7777777@qq.com','天津','XX区XX镇','计算机','22091211029177777','党员','2020-07-07',0,'优秀学员7',3);
把html页面修改为jsp页面 1在html中添加page指令
2将html的后缀修改为jsp修改之前的
修改之后的
实体类 bean包
bean包:属性,封装方法,无参构造,全参构造;表名=类名,列名=属性名
1多表之间关系分析①用户表和年级表、学生表之间没有关系
②年级表和学生表之间是一对多的关系,一个年级对应多个学生
2创建年级(班级)列表的实体package com.yhp.bean;
import java.util.List;
public class Grade {
private Integer gradeId;//年级编号
private String gradeName;//年级名称
//年级和学生之间是一对多的关系:一个年级包含多个学生
private List studentList;
public Integer getGradeId() {
return gradeId;
}
public void setGradeId(Integer gradeId) {
this.gradeId = gradeId;
}
public String getGradeName() {
return gradeName;
}
public void setGradeName(String gradeName) {
this.gradeName = gradeName;
}
public List getStudentList() {
return studentList;
}
public void setStudentList(List studentList) {
this.studentList = studentList;
}
}
3创建学生信息实体类
package com.yhp.bean;
import java.util.Date;
public class Student {
private Integer stuId;//学生id,主键自增
private String stuName;//学生姓名
private String stuNo;//学号
private Integer sex;//性别0女1男
private String phone;//联系电话
private String email;//邮箱
private String registered;//户口
private String address;//住址
private String profession;//专业
private String idNumber;//身份证号
private String politics;//政治面貌
private Date regdate;//登记时间
private Integer state;//状态0在校1删除
private String introduction;//简介
private Integer gid;//班级编号
//年级和学生之间是一对多的关系:一个学生对应一个年级
private Grade grade;
//以上所有成员对象的get和set方法
public Integer getStuId() {
return stuId;
}
public void setStuId(Integer stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getRegistered() {
return registered;
}
public void setRegistered(String registered) {
this.registered = registered;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getProfession() {
return profession;
}
public void setProfession(String profession) {
this.profession = profession;
}
public String getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public String getPolitics() {
return politics;
}
public void setPolitics(String politics) {
this.politics = politics;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getIntroduction() {
return introduction;
}
public void setIntroduction(String introduction) {
this.introduction = introduction;
}
public Integer getGid() {
return gid;
}
public void setGid(Integer gid) {
this.gid = gid;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
4 创建登陆用户的实体类
package com.yhp.bean;
//用户信息实体类
//多表关系分析:用户表和其他表没有关系
public class Users {
private Integer userId;//用户id
private String loginName;//登陆账号
private String passWord;//密码
private String realName;//真实姓名
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
}
dao包:主要是操作数据库的
①定义操作方法的接口,命名:实体类名+Dao
②Dbutils(属性文件,*.properties):连接数据库的工具类
1德鲁伊
注意:这里的DBUtils使用的是Druid技术,需要导入相关的jar包和数据文件
package com.yhp.dao;
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.*;
import java.util.List;
import java.util.ResourceBundle;
public class DBUtils {
//1.定义变量
private Connection connection;
private PreparedStatement pps;
protected ResultSet resultSet;
private int count;//存储收影响的行数
private static String userName;
private static String userPass;
private static String url;
private static String dirverName;
//德鲁伊
private static DruidDataSource dataSource=new DruidDataSource();
//2.加载驱动
static {
//德鲁伊
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
dirverName = bundle.getString("driverClassName");
url = bundle.getString("url");
userName = bundle.getString("username");
userPass = bundle.getString("password");
dataSource.setUsername(userName);
dataSource.setPassword(userPass);
dataSource.setUrl(url);
dataSource.setDriverClassName(dirverName);
// dataSource.setInitialSize(20);
}
//3.获得链接
protected Connection getConnection(){
try {
connection=dataSource.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return connection;
}
//4.得到预状态通道
protected PreparedStatement getPps(String sql){
try {
pps= getConnection().prepareStatement(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return pps;
}
//5.绑定参数 List保存的是给占位符所赋的值
protected void param(List list){
if(list!=null&&list.size()>0){
for (int i=0;i
2德鲁伊的配置文件
数据文件放到src目录下,注意jdbc.properties中的路径数据要修改
url=jdbc:mysql://localhost:3306/school?serverTimezone=UTC
username=root
password=XXXXXX
driverClassName=com.mysql.cj.jdbc.Driver
initialSize=5
maxActive=10
minIdle=5
maxWait=3000
3 jar包放到WEB-INF目录下的lib目录
impl包:实现接口,继承Dbutils类
命名:接口名+Impl
service.impl:主要是调取dao包的
service定义的是接口,接口中的方法和dao层接口中的方法一致
impl:这层的实现类主要负责调取dao层方法
service层的意义:service层是一个业务层,如果你的功能点的业务比较复杂,那么我们可以把业务逻辑都封装到这里进行包装,相当于进行一个准备工作
servlet:需要结合具体的功能点和需求去定义
在servlet中需要做的三件事
①接收参数
②调取service层的方法,service又在调取dao层的方法
③根据结果跳转页面
核心:jsp页面负责发送请求和展示数据
客户端:可以是浏览器、服务器、微信小程序
比如我想在淘宝上查找商品,那就是客户端发送请求,servlet调取service,service调取DAO,DAO,调取数据库,数据库将对应的消息依次返回,最后servlet获取到了数据,然后展示给客户端
代码的步骤:
1 先看jsp->2 jsp中指定Servlet地址->3 写对应的Servlet代码->4 Servelt主要做三件事:①接收参数、②调取service中对应的方法、③跳转到指定的页面(可以是前端页面,可以是有指定功能的Servlet页面,然后由该Servlet类跳转到前端页面)->5 因为Servlet中需要调用service中的方法,所以需要写对应的service接口中的抽象方法->6 写对应的Dao层的抽象方法->7Dao层的实现类实现Dao层的接口->8service层的实现类,实现service的接口(其中抽象方法的实现,是调取Dao层的实现类)
1. 登陆功能
(1)先看login.jsp页面的内容
①login.jsp的数据怎么发送过来
用户名的name是TxtUserName,密码的name是TxtPassword
②设置form的地址和method
(2)创建LoginServlet
servlet中主要做三件事1接收参数2调取service3跳转页面
1接收参数
用到了login.jsp的数据发送
2调取service
①需要在之前创建的UsersService接口中创建登陆的方法
②在UsersServiceImpl实现类中实现UsersService中的登陆方法,调取Dao层的UsersDao。
③UsersDao接口中定义登陆方法
④UsersDaoImpl中,需要进行调取数据库的操作
继承DBUtils(德鲁伊),实现UsersDao
⑤将2调取service和3跳转页面的代码内容补全
注意:代码运行时,浏览器页面出现问题,IDEA控制台中没有报错,可以按F12,点击Network,点击Response,查看
2退出功能
将session值清空掉即可
(1)书写head.jsp中的内容
(2)新建OutServlet
(3)如何验证是否退出成功
直接访问index.jsp,当前页面没有显示用户信息,就说明退出成功了
3学员列表展示
(1)首先修改left.jsp(学员信息展示的页面)当中的代码
把请求的地址修改为servlet的地址
(2)创建GetStudentServlet,它的地址就是上图中的Educational/student/getStudentList
①service
②serviceImpl
③dao
④daoImpl:进行数据库操作,调取数据库中存的数据
(3)修改之前的list.html为list.jsp,并且将其中展示的固定数据修改为真实数据展示
①引入JSPL标签库
②将需要循环展示的真实数据,用 包裹
(4)结果:
4 模糊查询实现
(1)首先看list.jsp
①需要把button(普通按钮)改为submit(提交按钮)
②需要把学生名称、学生学号和性别加上name属性,方便后续获取值
③在性别的请选择、男和女选项中加上value属性
④添加表单数据提交的请求名form的action属性
(2)修改之前的GetStudentServlet类
①类中之前是没有获取参数的,现在就需要把刚刚的参数添加上
②类之前调取service方法,是不需要穿参数的,现在则需要把获取到的参数进行传递,这就需要修改StudentService,StudentServiceImpl,StudentDao,StudentDaoImpl
③第2条修改的目的就是为了StudentDaoImpl类,进行数据库查询
④其中涉及到了,
1String类型强制转换为Integer(Integer.parseInt(sex))
2如果String为null,强制转换为Integer报错的处理(使用三目运算符,如果String为null,那String就等于-1: String == null? -1:Integer.parseInt(sex))
3String 和StringBuffer(两者区别:String是固定长度,StringBuffer可以进行动态的内存更新)
4StringBuffer转换为String类型(StringBuffer.toString)
5关于查询一次后,查询的内容自动删除的问题(这是因为每次查询后,会自动刷新一次页面,想要不丢失查询内容,需要对查询内容进行保存,并且需要在list.jsp页面中对保存的内容进行调取)
(3) 代码
①list.jsp
②GetStudentServlet
③StudentService这里比之前多了三个需要传入的参数
④StudentServiceImpl,实现StudentService,调取Dao层的StudentDao
⑤Dao层的StudentDao
⑥StudentDaoImpl,实现了StudentDao,里面跟之前不同的是查找sql的语句不同,这里使用的是:StringBuffer(String长度是固定的生成了就不能变,但是StringBuffer是可以不断添加的)
5分页功能
当用户点击首页、尾页、上一页、下一页以及中间的页码的时候,可以看到对应的信息
(1)修改相关的jsp页面(list.jsp)
给相关的按钮添加上要提交的页面连接(GetStudentServlet的地址)
(2)点击首页的功能实现
①修改GetStudentServlet中,将获取每页页码值和显示条数添加进去
②当获取了页码值和显示条数之后,就需要将他们传递给service层
③对应的GetStudentServlet和Student ServiceImpl、Dao层的接口和实现类也要进行响应的修改
④StudentDaoImpl的修改:sql语句添加分页条件
⑤GetStudentServlet的修改,需要把之前的调用StudentService进行页码值和每页条数的添加
(3)点击上一页,在jsp页面设置
①前台的页码值在后台获取
变量名为pageIndex
index是当前页面的值,用三目运算符进行值的判断
注意:这里的pageIndex只是一个变量的名字,他需要和后台接收数据的一样即可
②后台的页码值在前台获取
变量名为index
③ 前台使用el表达式对index进行获取
上一页,当前页码值-1,然后判断值是否小于等于1,如果小于1则页码值为1,如果页码值大于1,则正常的页码值-1
(4)下一页
①需要求出总页数(这里总页数命名为totalPages)
②GetStudentServlet中求出总页数
总页数=总条数/每页显示的条数(每页显示的条数是固定的5条)
③那么就需要求出总条数
需要在StudentService接口中定义一个获取总条数的方法
这个方法再复制到Dao层
然后StudentDaoImpl实现StudentDao的这个方法
然后StudentServletImpl实现StudentService接口
由GetStudentServlet调用
④GetStudentServlet中就可以存储分页数据(当前页数、每页显示条数、总条数、总页数)
⑤求出总页数(这里总页数命名为totalPages)
(5)尾页按钮
直接获取总页数即可
(6)目前的分页查询就做好了,但是还有一个模糊查询的功能,在跳转页码后,模糊查询的数据就丢失了
这是因为,上面的jsp代码中,只拼接了页码值,没有拼接模糊查询的条件,当点击上一页后,只会向后台传一个页码的数据,但是模糊查询的数据就被丢掉了
注意:拼接第一个数据加?,后面的数据用&连接
6新增
当用户点击“新增学生”按钮,会跳转到新增页面
填写完信息后,点击添加后,页面会跳回到学生管理页面
并且数据也会在学生管理页面展示
6-1新增-1:动态获取班级列表
(1)打开list.jsp页面,找到新增学生按钮
本来点击新增学生按钮之后,页面直接跳转到add.jsp,现在我们需要点击新增学生之后,跳转到GradeListServlet
①GradeListServlet目前还没有参数需要接收,需要一个查询所有年级列表的方法
(2)修改add.jsp页面的关于班级信息的静态数据换成动态数据
原本的静态数据
(3)修改为动态数据的步骤
①首先加上JSPL标签库
②在GradeService和GradeDao,这两个接口中定义查询年级列表的方法,并返回List集合
③GradeServiceImpl实现GradeService接口
④GradeDaoImpl实现GradeDao接口
⑤GradeListServlet
⑥add.jsp获取servlet层的结果
g.gradeId是年级的id,之后后台获取前台列表中数据
g.gradeName是显示年级的名字的:前台获取后台中存储的年级信息
6-2新增2:表单提交
(1)修改表单提交的地址
将其修改为处理其逻辑的servlet的地址
(2)创建Servlet
当数据成功存储到数据库后,页面会跳转到查询班级的Servlet(GradeListServlet),由Servlet查询到结果后转发到list.jsp页面
(3)StudentDaoImpl中的代码,用来将数据存储到sql中
7修改学生信息:主键查询
当用户点击修改按钮的时候,会展示学生的信息,班级信息应该动态获取,并且默认选中之前设置的
(1)找到list.jsp中的修改按钮,修改请求地址
修改后:后面拼接的sid=${stu.stuId}可以让后台的代码获取id主键
(2)点击修改之后,就会跳转到/Educational/student/findbyid
(3)FindByIdServlet中处理查询的方法,是由StudentServiceImpl调取StudentDao的代码获取的
(4)StudentDao中定义了根据主键查询所有信息的方法
(5)StudentDaoImpl中实现了“根据主键查询所有信息的方法”,这里主要注意columnLabel(列标签)中的值需要和数据库中的列名相同。
(6)当FindByIdServlet获取到了数据库学生和年级的信息,就会跳转到edit.jsp页面中
普通的值主要是在input中去调取
(7)年级列表需要:1动态展示,2需要将学生原本填写信息的年级作为默认值
①这里就需要引入JSPL,进行forEach循环
②性别这种则是sex的值为男或者女,则男或者女为默认值
③简介这种本身用文本域包裹的,则依旧用文本域包裹
edit.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>info.jsp学生信息管理平台 当前位置是:教务中心-》学生管理-》更新
<%@ page contentType="text/html;charset=UTF-8" language="java" %>list.jsp学生信息管理平台 当前位置是:教务中心-》学生管理-》新增
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
学生信息管理平台
当前位置是:教务中心-》学生管理
【新增学生】
| 学号 | 姓名 | 性别 | 联系电话 | 专业 | 登记时间 | 操作 | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ${stu.stuNo} | <%--学生的学号--%>${stu.stuName} | <%--学生姓名--%>${stu.sex==1?'男':'女'} | <%--性别--%>${stu.phone} | <%--手机号--%>${stu.profession} | <%--专业--%>${stu.regdate} | <%--登记时间--%>修改 删除 | |||||||||||||
| 首页 <%--这里${stuname}&stuno=${stuno}&sex=${sex}是为了在模糊查询时,进行翻页操作,避免点击跳转页面出现模糊查询条件失效的情况--%> 上一页 <%--上一页:当本页页数-1小于1,则为第1页,否则就当前页数-1--%> =totalPages?totalPages:index+1}&stuname=${stuname}&stuno=${stuno}&sex=${sex}">下一页 尾页 共${total}条 每页显示 ${index}/${totalPages} | |||||||||||||||||||
package com.yhp.web;
import com.yhp.bean.Users;
import com.yhp.service.UsersService;
import com.yhp.service.impl.UsersServiceImpl;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1接收参数
String username = req.getParameter("TxtUserName");
String password = req.getParameter("TxtPassword");
//2调取service
UsersService usersService = new UsersServiceImpl();//用接口声明,new接口的实现类
Users users = usersService.login(username, password);
//3跳转页面
if (users == null){
//以弹窗方式提示用户,登陆失败
resp.setContentType("text/html;charset=utf-8");//避免乱码
PrintWriter writer = resp.getWriter();
writer.println("");
}else {
//重定向跳转到主页面
//保存用户信息
req.getSession().setAttribute("u1",users);
resp.sendRedirect("index.jsp");
}
}
}
OutServlet
package com.yhp.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/loginout")
public class OutServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//清除session
req.getSession().invalidate();//这个方法可以让session中的所有数据都失效
//重定向页面
//resp.sendRedirect("/login.jsp");因为页面使用框架的原因不能使用重定向
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("");
}
}
GetStudentServlet
package com.yhp.web;
import com.yhp.bean.Student;
import com.yhp.service.StudentService;
import com.yhp.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet(urlPatterns = "/Educational/student/getStudentList")
public class GetStudentServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1获取参数:
//1.1模糊查询条件的参数
String stuname = req.getParameter("stuname");
String stuno = req.getParameter("stuno");
String sex = req.getParameter("sex");
//1.2分页数据的参数 limit 开始位置(每页的页码值),显示条数(一般是固定的)
//获取开始位置(页码值)数据
String pageIndex = req.getParameter("pageIndex");
//如果页面没有传入pageIndex的值,则默认查询第一页
int index = pageIndex == null ? 1:Integer.parseInt(pageIndex);
//2调取service方法
StudentService service = new StudentServiceImpl();
//在jsp页面中sex默认为undefined(没有值),这样到后台中就会报错,这里就是一出异常,就给sex赋null值
int s ;
try {
if (sex == null){
s =-1;
}else {
s = Integer.parseInt(sex);
}
} catch (NumberFormatException e) {
sex = null;//这里的问题是sex.length==0
}
//List students = service.getStudent(stuname,stuno,sex==null ? -1: Integer.parseInt(sex),index,5);
//sex==null ? -1: Integer.parseInt(sex)防止第一次进入,sex没有传入任何值,而导致的转换错误
//sex的三目运算符
//int usex = sex==null || sex.length()==0 ? -1 : Integer.parseInt(sex);
int usex = sex == null ?-1:Integer.parseInt(sex);
List students = service.getStudent(stuname,stuno,usex,index,5);
//获取总页数=总页数%每页显示的条数>0?总条数/每页显示条数+1:总条数/每页显示条数
int total = service.total(stuname, stuno, usex);//总条数
int totalPages = total%5>0 ? total/5+1 : total/5;//总页数
//如果后台想给前台传数据,是一定要在后台存值的
req.setAttribute("stulist",students);
//因为这里的数据只在展示页面使用,在其他页面不是用,所以只用request存值即可
System.out.println(sex);
//3跳转页面(转发)
//存储模糊差条件
req.setAttribute("stuname",stuname);
req.setAttribute("stuno",stuno);
req.setAttribute("sex",sex);
//存储分页数据
req.setAttribute("index",index);//当前的页数
req.setAttribute("size",5);//每页显示条数
req.setAttribute("total",total);//总条数
req.setAttribute("totalPages",totalPages);//总页数
req.getRequestDispatcher("list.jsp").forward(req,resp);
}
}
GradeListServlet
package com.yhp.web;
import com.yhp.bean.Grade;
import com.yhp.service.GradeService;
import com.yhp.service.impl.GradeServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet(urlPatterns = "/Educational/student/getGradeList")
public class GradeListServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//1接收参数
//2调取方法
//查询所有年级列表的方法
GradeService service = new GradeServiceImpl();
List list = service.getList();
//存储数据
req.setAttribute("glist",list);
//这里的glist,是前端获取后端内容的变量名
//3跳转页面
req.getRequestDispatcher("add.jsp").forward(req,resp);
}
}
UpdateStuServlet
package com.yhp.web;
import com.yhp.bean.Student;
import com.yhp.service.StudentService;
import com.yhp.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/Educational/student/updateStu")
public class UpdateStuServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//1接收参数
String sid = req.getParameter("sid");
String stuNo = req.getParameter("stuNo");
String stuName = req.getParameter("stuName");
String gid = req.getParameter("gid");
String sex = req.getParameter("sex");
String email = req.getParameter("email");
String phone = req.getParameter("phone");
String registered = req.getParameter("registered");
String address = req.getParameter("address");
String politics = req.getParameter("politics");
String idNumber = req.getParameter("idNumber");
String profession = req.getParameter("profession");
String introduction = req.getParameter("introduction");
//2调取方法
Student student = new Student();
student.setStuId(Integer.parseInt(sid));
student.setStuNo(stuNo);
student.setStuName(stuName);
student.setGid(Integer.parseInt(gid));
student.setSex(Integer.parseInt(sex));
student.setEmail(email);
student.setPhone(phone);
student.setRegistered(registered);
student.setAddress(address);
student.setPolitics(politics);
student.setProfession(profession);
student.setIdNumber(idNumber);
student.setIntroduction(introduction);
StudentService service = new StudentServiceImpl();
int i = service.updateStu(student);
//3判断是否更新成功,弹窗显示,跳转页面
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
if (i>0){
//修改成功
writer.println("");
}else {
//修改失败
writer.println("");
}
}
}
AddStuServlet
package com.yhp.web;
import com.yhp.bean.Student;
import com.yhp.service.StudentService;
import com.yhp.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/Educational/student/addStu")
public class AddStuServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");//因为这里是需要接收中文,所以需要处理乱码
//1接收参数
String stuNo = req.getParameter("stuNo");
String stuName = req.getParameter("stuName");
String gid = req.getParameter("gid");
String sex = req.getParameter("sex");
String email = req.getParameter("email");
String phone = req.getParameter("phone");
String registered = req.getParameter("registered");
String address = req.getParameter("address");
String politics = req.getParameter("politics");
String idNumber = req.getParameter("idNumber");
String profession = req.getParameter("profession");
String introduction = req.getParameter("introduction");
//将参数封装到学生对象中
Student student = new Student();
student.setStuNo(stuNo);
student.setStuName(stuName);
student.setGid(Integer.parseInt(gid));//班级编号
student.setSex(Integer.parseInt(sex));
student.setEmail(email);
student.setPhone(phone);
student.setRegistered(registered);//户口
student.setAddress(address);//住址
student.setPolitics(politics);//政治面貌
student.setIdNumber(idNumber);//身份证号
student.setProfession(profession);//专业
student.setIntroduction(introduction);//简介
//2调取Service
StudentService service = new StudentServiceImpl();
int i = service.insertStu(student);
//用弹窗的方式给用户提示,是否新增成功
resp.setContentType("text/html;charset=utf-8 ");
PrintWriter writer = resp.getWriter();
//3跳转页面
if (i>0){
//新增成功
//writer.println("");
//弹窗显示新增成功,然后跳转到list.jsp页面
writer.println("");
}else {
//新增失败
//writer.println("");
//弹窗显示新增失败,然后跳转到add.jsp页面
writer.println("");
}
}
}
FindByIdServlet
package com.yhp.web;
import com.yhp.bean.Grade;
import com.yhp.bean.Student;
import com.yhp.service.GradeService;
import com.yhp.service.StudentService;
import com.yhp.service.impl.GradeServiceImpl;
import com.yhp.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet("/Educational/student/deletebyid")
public class DeleteByIdServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1接收参数:获取主键学生的ID
String sid = req.getParameter("sid");
//2调用方法:删除的方法
StudentService service = new StudentServiceImpl();
int i = service.deleteStu(sid);
System.out.println("i="+i);
//3判断是否更新成功,弹窗显示,跳转页面
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
if (i>0){
//修改成功
//弹出"删除成功"的弹窗,并且跳转到GetStudentServlet查询显示数据,然后跳转到list.jsp页面显示所有的数据
writer.println("");
}else {
//修改失败
//弹出"删除失败"的弹窗,并且跳转到GetStudentServlet查询显示数据,然后跳转到list.jsp页面显示所有的数据
writer.println("");
}
}
}
DeleteByIdServlet
package com.yhp.web;
import com.yhp.bean.Grade;
import com.yhp.bean.Student;
import com.yhp.service.GradeService;
import com.yhp.service.StudentService;
import com.yhp.service.impl.GradeServiceImpl;
import com.yhp.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet("/Educational/student/deletebyid")
public class DeleteByIdServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1接收参数:获取主键学生的ID
String sid = req.getParameter("sid");
//2调用方法:删除的方法
StudentService service = new StudentServiceImpl();
int i = service.deleteStu(sid);
System.out.println("i="+i);
//3判断是否更新成功,弹窗显示,跳转页面
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
if (i>0){
//修改成功
//弹出"删除成功"的弹窗,并且跳转到GetStudentServlet查询显示数据,然后跳转到list.jsp页面显示所有的数据
writer.println("");
}else {
//修改失败
//弹出"删除失败"的弹窗,并且跳转到GetStudentServlet查询显示数据,然后跳转到list.jsp页面显示所有的数据
writer.println("");
}
}
}
service
UsersService
package com.yhp.service;
import com.yhp.bean.Users;
public interface UsersService {
public Users login(String username,String password);
}
GradeService
package com.yhp.service;
import com.yhp.bean.Grade;
import java.util.List;
public interface GradeService {
public List getList();
}
StudentService
package com.yhp.service;
import com.yhp.bean.Student;
import java.util.List;
public interface StudentService {
public int deleteStu(String sid);
public int updateStu(Student student);
public Student findById(int sid);
public List getStudent(String name,String stuno,int sex,int pageIndex,int pageSize);
public int total(String name,String stuno,int sex);
public int insertStu(Student student);
}
service impl
UsersServiceImpl
package com.yhp.service.impl;
import com.yhp.bean.Users;
import com.yhp.dao.UsersDao;
import com.yhp.dao.impl.UsersDaoImpl;
import com.yhp.service.UsersService;
public class UsersServiceImpl implements UsersService {
//创建Dao层对象
private UsersDao usersDao = new UsersDaoImpl();
@Override
//登陆方法
public Users login(String username, String password) {
//由Dao对象调取UsersDao中的登陆方法
return usersDao.login(username,password);
}
}
GradeServiceImpl
package com.yhp.service.impl;
import com.yhp.bean.Grade;
import com.yhp.dao.GradeDao;
import com.yhp.dao.impl.GradeDaoImpl;
import com.yhp.service.GradeService;
import java.util.List;
public class GradeServiceImpl implements GradeService {
//service层的实现类主要就是调取Dao层
private GradeDao gradeDao = new GradeDaoImpl();
@Override
public List getList() {
return gradeDao.getList();
}
}
StudentServiceImpl
package com.yhp.service.impl;
import com.yhp.bean.Student;
import com.yhp.dao.StudentDao;
import com.yhp.dao.impl.StudentDaoImpl;
import com.yhp.service.StudentService;
import java.util.List;
public class StudentServiceImpl implements StudentService {
StudentDao studentDao = new StudentDaoImpl();
@Override
public int deleteStu(String sid) {
return studentDao.deleteStu(sid);
}
@Override
public int updateStu(Student student) {
return studentDao.updateStu(student);
}
@Override
public Student findById(int sid) {
StudentDao studentDao = new StudentDaoImpl();
return studentDao.findById(sid);
}
@Override
public List getStudent(String name,String stuno,int sex,int pageIndex,int pageSize) {
return studentDao.getStudent(name,stuno,sex,pageIndex,pageSize);
}
@Override
public int total(String name, String stuno, int sex) {
return studentDao.total(name,stuno,sex);
}
@Override
public int insertStu(Student student) {
return studentDao.insertStu(student);
}
}
dao
UsersDao
package com.yhp.dao;
import com.yhp.bean.Users;
public interface UsersDao {
public Users login(String username, String password);
}
GradeDao
package com.yhp.dao;
import com.yhp.bean.Grade;
import java.util.List;
public interface GradeDao {
public List getList();
}
StudentDao
package com.yhp.dao;
import com.yhp.bean.Student;
import java.util.List;
public interface StudentDao {
public int deleteStu(String sid);
public int updateStu(Student student);
public Student findById(int sid);
public List getStudent(String name,String stuno,int sex,int pageIndex,int pageSize);
public int total(String name,String stuno,int sex);
public int insertStu(Student student);
}
dao impl
GradeDaoImpl
package com.yhp.dao.impl;
import com.yhp.bean.Grade;
import com.yhp.dao.DBUtils;
import com.yhp.dao.GradeDao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class GradeDaoImpl extends DBUtils implements GradeDao {
@Override
public List getList() {
List gs = new ArrayList();
try {
String sql = "select * from grade";
resultSet = query(sql,null);
while (resultSet.next()){
Grade grade = new Grade();
grade.setGradeId(resultSet.getInt("gradeid"));
grade.setGradeName(resultSet.getString("grademname"));
//这里的columnLabel要与数据库中的列名一致
gs.add(grade);
}
System.out.println(gs);
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
closeAll();
}
return gs;
}
}
UsersDaoImpl
package com.yhp.dao.impl;
import com.yhp.bean.Users;
import com.yhp.dao.DBUtils;
import com.yhp.dao.UsersDao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class UsersDaoImpl extends DBUtils implements UsersDao {
@Override
public Users login(String username, String password) {
Users users = null;
try {
String sql = "select*from users where loginname = ? and password = ?";
ArrayList
StudentDaoImpl
package com.yhp.dao.impl;
import com.yhp.bean.Student;
import com.yhp.dao.DBUtils;
import com.yhp.dao.StudentDao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class StudentDaoImpl extends DBUtils implements StudentDao {
@Override
public int deleteStu(String sid) {
int i = 0;
try {
String sql = "update student set state = ? where stuid = ?";
List params = new ArrayList();
params.add(4);
params.add(sid);
i = update(sql, params);
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll();
}
return i;
}
@Override
public int updateStu(Student student) {
int update = 0;
try {
String sql = "update student set stuno=?, stuname=?,gid=?,sex=?,email=?,phone=?,registered=?,address=?,politics=?,idnumber=?,profession=?,introduction=? where stuid=?";
//注意下面添加变量的顺序要和上面设置数据的顺序一致
List params = new ArrayList();
params.add(student.getStuNo());
params.add(student.getStuName());
params.add(student.getGid());
params.add(student.getSex());
params.add(student.getEmail());
params.add(student.getPhone());
params.add(student.getRegistered());
params.add(student.getAddress());
params.add(student.getProfession());
params.add(student.getIdNumber());
params.add(student.getPolitics());
params.add(student.getIntroduction());
params.add(student.getStuId());
update = update(sql, params);
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll();
}
return update;
}
@Override
public Student findById(int sid) {
Student student = new Student();
try {
String sql = "select * from student where stuid = ?";
List params = new ArrayList();
params.add(sid);
resultSet = query(sql, params);
while (resultSet.next()){
student.setStuId(resultSet.getInt("stuid"));
student.setStuNo(resultSet.getString("stuno"));
student.setStuName(resultSet.getString("stuname"));
student.setSex(resultSet.getInt("sex"));
student.setPhone(resultSet.getString("phone"));
student.setProfession(resultSet.getString("profession"));
student.setRegdate(resultSet.getDate("regdate"));
student.setEmail(resultSet.getString("email"));
student.setIntroduction(resultSet.getString("introduction"));
student.setGid(resultSet.getInt("gid"));
student.setRegistered(resultSet.getString("registered"));
student.setAddress(resultSet.getString("address"));
student.setIdNumber(resultSet.getString("idnumber"));
student.setPolitics(resultSet.getString("politics"));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return student;
}
@Override
public int insertStu(Student student) {
int i =0;
try {
String sql = "insert into student value(null,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
List params = new ArrayList();
params.add(student.getStuName());
params.add(student.getStuNo());
params.add(student.getSex());
params.add(student.getPhone());
params.add(student.getEmail());
params.add(student.getRegistered());
params.add(student.getAddress());
params.add(student.getProfession());
params.add(student.getIdNumber());
params.add(student.getPolitics());
params.add(new Date());//注册时间
params.add(1);//状态:1表示在读;2休学;3退学;4删除
params.add(student.getIntroduction());
params.add(student.getGid());
i = update(sql, params);//表示受影响的行数
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll();
}
return i;
}
@Override
public List getStudent(String name,String stuno,int sex,int pageIndex,int pageSize) {
List list = new ArrayList<>();
List params = new ArrayList();//参数的集合
//String sql = "select * from student";
//注意下面的字符串,前后都要有空格,否则系统进行字符串拼接的时候,就都拼接到一起了
StringBuffer sqlbuf = new StringBuffer(" select * from student where 1=1 and state!=4 ");
//拼接的条件
if (name != null && name.length()>0){
//如果name有值,则拼接下面的字符串内容
sqlbuf.append(" and stuname like ? ");
params.add("%"+name+"%");//模糊查的效果
}
if (stuno != null && stuno.length()>0){
sqlbuf.append(" and stuno=? ");
params.add(stuno);
}
if (sex != -1){
sqlbuf.append(" and sex=? ");
params.add(sex);
}
//添加分页条件
sqlbuf.append(" limit ?,? ");//比如要获取第1页,每页5条,则limit0,5
//limit (pageIndex-1)*pageSize,pageSize;
params.add((pageIndex-1)*pageSize);//开始位置
params.add(pageSize);//每页显示条数
resultSet = query(sqlbuf.toString(), params);
try {
while (resultSet.next()){
//最好获取所有的数据
Student student = new Student();
student.setStuId(resultSet.getInt("stuid"));
student.setStuNo(resultSet.getString("stuno"));
student.setStuName(resultSet.getString("stuname"));
student.setSex(resultSet.getInt("sex"));
student.setPhone(resultSet.getString("phone"));
student.setProfession(resultSet.getString("profession"));
student.setRegdate(resultSet.getDate("regdate"));
//把所有的数据放入集合中
list.add(student);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return list;
}
@Override
public int total(String name, String stuno, int sex) {
int total = 0;
try {
List params = new ArrayList();//参数的集合
//String sql = "select * from student";
//注意下面的字符串,前后都要有空格,否则系统进行字符串拼接的时候,就都拼接到一起了
StringBuffer sqlbuf = new StringBuffer(" select count(*) from student where 1=1 and state!=4 ");
//拼接的条件
if (name != null && name.length()>0){
//如果name有值,则拼接下面的字符串内容
sqlbuf.append(" and stuname like ? ");
params.add("%"+name+"%");//模糊查的效果
}
if (stuno != null && stuno.length()>0){
sqlbuf.append(" and stuno=? ");
params.add(stuno);
}
if (sex != -1){
sqlbuf.append(" and sex=? ");
params.add(sex);
}
resultSet = query(sqlbuf.toString(), params);//resultSet是一个数值
while (resultSet.next()){
total = resultSet.getInt(1);//取出数据
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return total;
}
}
优化 1枚举值保存学生的状态
这个在日后的维护是很不利的,而且在团队开发中,也会产生很多误解
解决方法:Enum枚举
package com.yhp.util;
public enum StudentEnum {
//更新学生的state(状态)状态:1表示在读;2休学;3退学;4删除
//数据库中想要用的状态是数字;页面(程序)中想要用的是可以读懂的字符串
READING(1,"在读"),
SUSPENSION(2,"休学"),
DROpOUT(3,"退学"),
DELETE(4,"删除");
public final Integer type;
public final String value;
StudentEnum(Integer type,String value){
this.type=type;
this.value = value;
}
}
把之前用数字的地方改为枚举值
在27、28行;132、133行
package com.yhp.dao.impl;
import com.yhp.bean.Student;
import com.yhp.dao.DBUtils;
import com.yhp.dao.StudentDao;
import com.yhp.util.StudentEnum;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class StudentDaoImpl extends DBUtils implements StudentDao {
@Override
public int deleteStu(String sid) {
int i = 0;
try {
String sql = "update student set state = ? where stuid = ?";
List params = new ArrayList();
//params.add(4);//更新学生的state(状态)状态:1表示在读;2休学;3退学;4删除
params.add(StudentEnum.DELETE.type);
params.add(sid);
i = update(sql, params);
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll();
}
return i;
}
@Override
public int updateStu(Student student) {
int update = 0;
try {
String sql = "update student set stuno=?, stuname=?,gid=?,sex=?,email=?,phone=?,registered=?,address=?,politics=?,idnumber=?,profession=?,introduction=? where stuid=?";
//注意下面添加变量的顺序要和上面设置数据的顺序一致
List params = new ArrayList();
params.add(student.getStuNo());
params.add(student.getStuName());
params.add(student.getGid());
params.add(student.getSex());
params.add(student.getEmail());
params.add(student.getPhone());
params.add(student.getRegistered());
params.add(student.getAddress());
params.add(student.getProfession());
params.add(student.getIdNumber());
params.add(student.getPolitics());
params.add(student.getIntroduction());
params.add(student.getStuId());
update = update(sql, params);
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll();
}
return update;
}
@Override
public Student findById(int sid) {
Student student = new Student();
try {
String sql = "select * from student where stuid = ?";
List params = new ArrayList();
params.add(sid);
resultSet = query(sql, params);
while (resultSet.next()){
student.setStuId(resultSet.getInt("stuid"));
student.setStuNo(resultSet.getString("stuno"));
student.setStuName(resultSet.getString("stuname"));
student.setSex(resultSet.getInt("sex"));
student.setPhone(resultSet.getString("phone"));
student.setProfession(resultSet.getString("profession"));
student.setRegdate(resultSet.getDate("regdate"));
student.setEmail(resultSet.getString("email"));
student.setIntroduction(resultSet.getString("introduction"));
student.setGid(resultSet.getInt("gid"));
student.setRegistered(resultSet.getString("registered"));
student.setAddress(resultSet.getString("address"));
student.setIdNumber(resultSet.getString("idnumber"));
student.setPolitics(resultSet.getString("politics"));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return student;
}
@Override
public int insertStu(Student student) {
int i =0;
try {
String sql = "insert into student value(null,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
List params = new ArrayList();
params.add(student.getStuName());
params.add(student.getStuNo());
params.add(student.getSex());
params.add(student.getPhone());
params.add(student.getEmail());
params.add(student.getRegistered());
params.add(student.getAddress());
params.add(student.getProfession());
params.add(student.getIdNumber());
params.add(student.getPolitics());
params.add(new Date());//注册时间
//params.add(1);//状态:1表示在读;2休学;3退学;4删除
params.add(StudentEnum.READING.type);
params.add(student.getIntroduction());
params.add(student.getGid());
i = update(sql, params);//表示受影响的行数
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll();
}
return i;
}
@Override
public List getStudent(String name,String stuno,int sex,int pageIndex,int pageSize) {
List list = new ArrayList<>();
List params = new ArrayList();//参数的集合
//String sql = "select * from student";
//注意下面的字符串,前后都要有空格,否则系统进行字符串拼接的时候,就都拼接到一起了
StringBuffer sqlbuf = new StringBuffer(" select * from student where 1=1 and state!=4 ");
//拼接的条件
if (name != null && name.length()>0){
//如果name有值,则拼接下面的字符串内容
sqlbuf.append(" and stuname like ? ");
params.add("%"+name+"%");//模糊查的效果
}
if (stuno != null && stuno.length()>0){
sqlbuf.append(" and stuno=? ");
params.add(stuno);
}
if (sex != -1){
sqlbuf.append(" and sex=? ");
params.add(sex);
}
//添加分页条件
sqlbuf.append(" limit ?,? ");//比如要获取第1页,每页5条,则limit0,5
//limit (pageIndex-1)*pageSize,pageSize;
params.add((pageIndex-1)*pageSize);//开始位置
params.add(pageSize);//每页显示条数
resultSet = query(sqlbuf.toString(), params);
try {
while (resultSet.next()){
//最好获取所有的数据
Student student = new Student();
student.setStuId(resultSet.getInt("stuid"));
student.setStuNo(resultSet.getString("stuno"));
student.setStuName(resultSet.getString("stuname"));
student.setSex(resultSet.getInt("sex"));
student.setPhone(resultSet.getString("phone"));
student.setProfession(resultSet.getString("profession"));
student.setRegdate(resultSet.getDate("regdate"));
//把所有的数据放入集合中
list.add(student);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return list;
}
@Override
public int total(String name, String stuno, int sex) {
int total = 0;
try {
List params = new ArrayList();//参数的集合
//String sql = "select * from student";
//注意下面的字符串,前后都要有空格,否则系统进行字符串拼接的时候,就都拼接到一起了
StringBuffer sqlbuf = new StringBuffer(" select count(*) from student where 1=1 and state!=4 ");
//拼接的条件
if (name != null && name.length()>0){
//如果name有值,则拼接下面的字符串内容
sqlbuf.append(" and stuname like ? ");
params.add("%"+name+"%");//模糊查的效果
}
if (stuno != null && stuno.length()>0){
sqlbuf.append(" and stuno=? ");
params.add(stuno);
}
if (sex != -1){
sqlbuf.append(" and sex=? ");
params.add(sex);
}
resultSet = query(sqlbuf.toString(), params);//resultSet是一个数值
while (resultSet.next()){
total = resultSet.getInt(1);//取出数据
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return total;
}
}
2使用filter(过滤器)处理乱码
在添加学生和修改学生信息因为要接收大量数据,怕出乱码问题,加了一个req.setCharacterEncoding(“utf-8”)方法,来进行乱码的处理,每一次添加会很麻烦,所有可以使用过滤器,一次添加,永绝后患
①添加filter注意:Filter是javax.servlet包的
package com.yhp.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter("
writer.println("");
}else {
//新增失败
//writer.println("");
//弹窗显示新增失败,然后跳转到add.jsp页面
writer.println("");
}
}
//主键查询
protected void findbyid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1接收参数:获取主键学生的ID
String sid = req.getParameter("sid");
//2处理查询的方法:根据主键查询学生信息
StudentService service = new StudentServiceImpl();
Student student = service.findById(Integer.parseInt(sid));
//查询年级的动态列表
GradeService gradeService = new GradeServiceImpl();
List list = gradeService.getList();
//存储年级集合
req.setAttribute("glist",list);
//存储学生的信息
req.setAttribute("stu",student);
//3跳转页面
req.getRequestDispatcher("edit.jsp").forward(req,resp);
}
//查询列表
protected void findlist (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1获取参数:
//1.1模糊查询条件的参数
String stuname = req.getParameter("stuname");
String stuno = req.getParameter("stuno");
String sex = req.getParameter("sex");
//1.2分页数据的参数 limit 开始位置(每页的页码值),显示条数(一般是固定的)
//获取开始位置(页码值)数据
String pageIndex = req.getParameter("pageIndex");
//如果页面没有传入pageIndex的值,则默认查询第一页
int index = pageIndex == null ? 1:Integer.parseInt(pageIndex);
//2调取service方法
StudentService service = new StudentServiceImpl();
//在jsp页面中sex默认为undefined(没有值),这样到后台中就会报错,这里就是一出异常,就给sex赋null值
int s ;
try {
if (sex == null){
s =-1;
}else {
s = Integer.parseInt(sex);
}
} catch (NumberFormatException e) {
sex = null;//这里的问题是sex.length==0
}
//List students = service.getStudent(stuname,stuno,sex==null ? -1: Integer.parseInt(sex),index,5);
//sex==null ? -1: Integer.parseInt(sex)防止第一次进入,sex没有传入任何值,而导致的转换错误
//sex的三目运算符
//int usex = sex==null || sex.length()==0 ? -1 : Integer.parseInt(sex);
int usex = sex == null ?-1:Integer.parseInt(sex);
List students = service.getStudent(stuname,stuno,usex,index,5);
//获取总页数=总页数%每页显示的条数>0?总条数/每页显示条数+1:总条数/每页显示条数
int total = service.total(stuname, stuno, usex);//总条数
int totalPages = total%5>0 ? total/5+1 : total/5;//总页数
//如果后台想给前台传数据,是一定要在后台存值的
req.setAttribute("stulist",students);
//因为这里的数据只在展示页面使用,在其他页面不是用,所以只用request存值即可
System.out.println(sex);
//3跳转页面(转发)
//存储模糊差条件
req.setAttribute("stuname",stuname);
req.setAttribute("stuno",stuno);
req.setAttribute("sex",sex);
//存储分页数据
req.setAttribute("index",index);//当前的页数
req.setAttribute("size",5);//每页显示条数
req.setAttribute("total",total);//总条数
req.setAttribute("totalPages",totalPages);//总页数
req.getRequestDispatcher("list.jsp").forward(req,resp);
}
//更新学员信息
protected void update (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1接收参数
String sid = req.getParameter("sid");
String stuNo = req.getParameter("stuNo");
String stuName = req.getParameter("stuName");
String gid = req.getParameter("gid");
String sex = req.getParameter("sex");
String email = req.getParameter("email");
String phone = req.getParameter("phone");
String registered = req.getParameter("registered");
String address = req.getParameter("address");
String politics = req.getParameter("politics");
String idNumber = req.getParameter("idNumber");
String profession = req.getParameter("profession");
String introduction = req.getParameter("introduction");
//2调取方法
Student student = new Student();
student.setStuId(Integer.parseInt(sid));
student.setStuNo(stuNo);
student.setStuName(stuName);
student.setGid(Integer.parseInt(gid));
student.setSex(Integer.parseInt(sex));
student.setEmail(email);
student.setPhone(phone);
student.setRegistered(registered);
student.setAddress(address);
student.setPolitics(politics);
student.setProfession(profession);
student.setIdNumber(idNumber);
student.setIntroduction(introduction);
StudentService service = new StudentServiceImpl();
int i = service.updateStu(student);
//3判断是否更新成功,弹窗显示,跳转页面
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
if (i>0){
//修改成功:跳转到查询全部
writer.println("");
}else {
//修改失败
writer.println
("");
}
}
}
4学号的非重复性验证:AJAX
(1)add.jsp页面:添加页面
只需要实现在数据库中查找是否有相同的学号即可,有则报错,没有则通过
① web/js目录下添加js文件:jquery-1.8.0.mim.js
②学号标签加上id,后面加上span标签,用来显示是否有重复
jquery代码:
servlet
service
实现service
dao
实现dao
(2)edit.jsp:修改页面需要查询数据库中是否有相同的学号,并且要排除本学号重复的情况,有则报错,无则通过
表单部分
ajax部分
servlet
查询是否有相同学号的方法,用之前的添加页面的创建的方法即可,现在需要获取本id的学号
service
service的实现类
dao
dao的实现类
5filter:登陆验证package com.yhp.web;
import com.yhp.bean.Users;
import com.yhp.service.UsersService;
import com.yhp.service.impl.UsersServiceImpl;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1接收参数
String username = req.getParameter("TxtUserName");
String password = req.getParameter("TxtPassword");
//2调取service
UsersService usersService = new UsersServiceImpl();//用接口声明,new接口的实现类
Users users = usersService.login(username, password);
//3跳转页面
if (users == null){
//以弹窗方式提示用户,登陆失败
resp.setContentType("text/html;charset=utf-8");//避免乱码
PrintWriter writer = resp.getWriter();
writer.println("");
}else {
//重定向跳转到主页面
//保存用户信息
req.getSession().setAttribute("u1",users);
resp.sendRedirect("index.jsp");
}
}
}
注意:这里从session中获取的数据,是在LoginServlet.java中存的数据
二JavaWeb项目实战-权限管理 1数据库分析与创建 (1)数据库分析使用4张表:用户表、角色表、权限表、角色与权限的中间表
角色表和权限表之间的关系:多对多(某个角色对应多个权限,某个权限对应多个角色)
角色表和用户表之间的关系:一对多(某个角色对应多个用户,一个用户对应一个角色)
(2)数据库的创建与数据填充菜单表中的url存储的是,按钮对应的地址
菜单表也就是这些菜单按钮,有对应权限,才能打开对应的菜单
中间表把角色和菜单对应起来
角色表和菜单表的关系为多对多,一个角色有多个菜单权限,多个角色可以有共同的菜单权限
2实体类创建 (1)Users:用户表之前的Users实体类只有4个成员变量,因为权限管理,Users又添加了7个数据库的列,所以对应的实体类也要把他们添加上
package com.yhp.bean;
//用户信息实体类
//多表关系分析:用户表和角色表为多对一的关系,多个用户对应一个角色
public class Users {
private Integer userId;//用户id
private String loginName;//登陆账号
private String passWord;//密码
private String realName;//真实姓名
private Integer sex;//性别
private String email;//邮箱
private String phone;//电话
private String cardId;//身份证
private String descs;//简介
private String roleId;//角色id
private String address;//地址
private Role role;//角色的属性:一个用户对应一个角色
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getDescs() {
return descs;
}
public void setDescs(String descs) {
this.descs = descs;
}
public String getRoleId() {
return roleId;
}
public void setRoleId(String roleId) {
this.roleId = roleId;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
}
(2)role:角色表
package com.yhp.bean;
import java.util.List;
public class Role {
private Integer roleId;//角色id
private String roleName;//角色姓名
private Integer roleState;//角色状态:1可用;0禁用
private List usersList;//用户属性:一个角色可以对应多个用户
private List
(3)menu:菜单表
package com.yhp.bean;
import java.util.List;
public class Menu {
private Integer menuId;
private String menuName;
private Integer upMenuId;
private Integer state;
private String desc;
private String url;
private List roleList;//菜单和角色是多对多的关系
public Integer getMenuId() {
return menuId;
}
public void setMenuId(Integer menuId) {
this.menuId = menuId;
}
public String getMenuName() {
return menuName;
}
public void setMenuName(String menuName) {
this.menuName = menuName;
}
public Integer getUpMenuId() {
return upMenuId;
}
public void setUpMenuId(Integer upMenuId) {
this.upMenuId = upMenuId;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public List getRoleList() {
return roleList;
}
public void setRoleList(List roleList) {
this.roleList = roleList;
}
}
(4)middle:中间表
注意:中间表是不需要添加实体类的
3用户管理按钮:列表展示
limit分页语句;多表联查;
left.jsp:调用“用户管理”的地址
UsersServlet
service
如果需要模糊查询的话,就在查询总条数的方法中,传入模糊查询的条件
serviceImpl
dao
daoImpl
/power/user/list.jsp
1引入jstl标签库
2c标签foreach遍历集合



