系列链接:
✨JavaWeb项目实战亲自动手手敲上线小项目的第一天✨
✨JavaWeb项目实战亲自动手手敲上线小项目的第二天✨
✨JavaWeb项目实战亲自动手手敲上线小项目的第三天✨
✨JavaWeb项目:实战亲自动手手敲上线小项目部分功能的第四天优化✨
JavaWeb项目实战第四天进展
那在之前呢,我们已经把我们的项目的功能实现基本都完成了,那接下来这一天就是对我们的功能进行优化。
枚举值保存学生状态
那我们昨天在进行删除功能的实现的时候,将学生状态设置为1,2,3,4,等数字对其赋予状态,但这种方式会让那个后面的维护和在团队开发过程中交接变得很难,因为我们不知道它这个数字是什么意思,怎么赋予,维护起来很难,那我们就可以采用ENUM
枚举值去保存我们的学生状态。
那我们在最开始就创建的util
包到现在就派上用场了,我们新建一个StudentEnum
的枚举类:
那我们最初的想法是想要让它在我们的页面中展示出来,用一个字符串展示就行,那在我们的数据库中因为定义的类型还是int的所以肯定还是显示的数字,所以我们可以,
//1表示状态为在读 2 休学 3 退学 4 删除
public enum StudentEnum {
//状态值
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;
}
}
Enum中的是常量,变大写,赋值,构造方法。
那定义完成后就回到我们的StudentDaoImpl
中去修改insertStu
方法,
那将我们的params.add(1);
迭代为params.add(StudentEnum.READING.type);
还要修改我们的delStu
方法
将params.add(4);
迭代为params.add(StudentEnum.DELETE.type);
,这样就行了。展示效果就不再粘了。
使用filter处理乱码
那这一部分大家肯定都不陌生,处理乱码的filter,话不多说,直接上代码吧,因为也没啥要展开的。
package com.lby.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
request.setCharacterEncoding("utf-8");
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setContentType("text/html; charset=UTF-8");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
注意一点就好了,不要导错包,我们导的是servlet的。
那相应的,我们要在web.xml
去添加配置:
<filter>
<filter-name>lby</filter-name>
<filter-class>com.lby.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>lby</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
那我们去将之前所以防止乱码的设置req.setCharacterEncoding("utf-8");//防止乱码
都先注释掉,这个EncodingFilter
我们也去注释一下,之后去新增一个学生看看没有的情况下会不会乱码,然后再将我们的Filter取消注释,去对比一下。
结果我连添加都没有成功:
那我们配置上我们的Filter后再去试一试:
直接成功,那我是把之前在servlet的所有有关的乱码设置都注释了,那我们再去看看其他功能的效果:
删除的:
那其他的功能我就不再一一去展示了,大家可以自己去探索。
多请求走同一个servlet
在之前我们的servlet都是根据请求来定的,一个请求就要写一个servlet,那这对我们的维护成本太高了,那为了能够释放资源,减少冗余,我们就去优化一下,有什么办法去对其优化呢,那就是标题,合并。
那我们之前的关于学生的请求地址就有很多:
新增学员:
/Educational/student/addStu
修改学员:
/Educational/student/findbyid
/Educational/student/updateStu
查询学员:
/Educational/student/getStudentList
删除学员:
/Educational/studnt/deletebyid
那其实我们请求的根路径其实是一致的/Educational/student/
所以,我们是不是可以去定义一个
/Educational/student/studentServlet
,这是关于学生操作的总servlet,那我们想要去对其进行不同的操作时就加上不同的操作,例如:
这是修改更新操作
/Educational/student/studentServlet?method=update
这是删除操作
/Educational/student/studentServlet?method=delete
那有了想法我们就去对其进行实现,我们首先去创建一个StudentServlet
,那它的请求地址应该为:
/Educational/student/studentServlet
。
之后我们重写service方法,那我们就去依次添加我们有关于学生的servlet的方法体,其实就是把之前的AddStuServlet
,DeleteByIdServlet
,FindByIdServlet
,GetStudentServlet
,UpdateStuServlet
中的内容都填充到我们新建的StudentServlet
中去,然后我们再再重写的service方法中去调用即可,那完整的代码就是这样的:
package com.lby.web;
import com.lby.bean.Grade;
import com.lby.bean.Student;
import com.lby.service.GradeService;
import com.lby.service.StudentService;
import com.lby.service.impl.GradeServiceImpl;
import com.lby.service.impl.StudentServiceImpl;
import com.lby.util.PageUtil;
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;
/**
* @Author: King-lby
* @Date Created in 2021-08-28 9:56
*/
@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. 接收参数
String sid = req.getParameter("sid");
//2. 调用service方法,根据主键查询学生信息
StudentService service = new StudentServiceImpl();
int i = service.delStu(sid);
//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{
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");
//2. 调取service方法
StudentService service=new StudentServiceImpl();
//将参数封装到学生对象中
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);
int i = service.insertStu(student);//返回受影响行数
//System.out.println(i);
//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{
writer.println("<script>alert('新增失败');" +
"location.href='/Educational/student/getGradeList'</script>");
}
}
//主键查询
protected void findbyid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 接收参数
String sid = req.getParameter("sid");
//2. 调用service方法,根据主键查询学生信息
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");//接收参数,然后传给service层
//如果页面没有传入pageIndex的值,则默认查询第一页
int index = pageIndex==null?1:Integer.parseInt(pageIndex);
//2. 调取service方法
PageUtil pageUtil = new PageUtil();
StudentService service = new StudentServiceImpl();
int usex = (sex==null||sex.length()==0?-1:Integer.parseInt(sex));
List<Student> students = service.getStudents(stuname,stuno,usex,index, pageUtil.getPageSize());
//获取总页数=总条数%每页显示的条数>0?总条数/每页显示条数+1:总条数/每页显示条数;//问题又来了,总条数从哪来
int total = service.total(stuname,stuno,usex);//总条数
pageUtil.setTotal(total);
//3. 跳转页面
//如果后台想给前台传数据,是一定要给给前台存值的
pageUtil.setDataList(students);//将students对象的数据存到stulist中
pageUtil.setPageIndex(index);
//存储模糊查询条件x
req.setAttribute("stuname",stuname);
req.setAttribute("stuno",stuno);
req.setAttribute("sex",sex);
//存储分页数据
req.setAttribute("p1",pageUtil);
/**
* 那我们跳转页面到Educational/student/list.jsp查看存储的数据
*/
//注意:这个路径是我们之前在left.jsp中已经有一个请求的路径了,
//所以只要接上之前的就好了,不用全部写完,当然直接用绝对路径的方式也是可行的,还是很好用的。
//注意2:不要加‘/’,加了就变成从根目录web查找路径了
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 regdate = req.getParameter("regdate");注册时间不需要更改
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. 调取service方法
Student stu = new Student();
stu.setStuNo(stuNo);
stu.setStuName(stuname);
stu.setSex(Integer.parseInt(sex));
stu.setPhone(phone);
stu.setProfession(profession);
stu.setAddress(address);
//stu.setRegDate(regdate);//注册时间,不需要更改
stu.setEmail(email);
stu.setIntroduction(introduction);
stu.setGid(Integer.parseInt(gid));
stu.setRegistered(registered);
stu.setIdNumber(idnumber);
stu.setPolitics(politics);
stu.setStuId(Integer.parseInt(sid));
StudentService service = new StudentServiceImpl();
int i = service.updateStu(stu);
//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{
writer.println("<script>alert('更新失败');" +
"location.href='/Educational/student/studentServlet?method=findbyid&sid="+sid+"'</script>");
}
}
}
当然了,我们改了接收的请求地址,那发送方页面中的请求地址也要修改。
那首先去left.jsp
中学生管理的查询全部请求,将
<a class=menuchild href="Educational/student/getStudentList" target="right">学生管理</a>
改为:
<a class=menuchild href="/Educational/student/studentServlet" target="right">学生管理</a>
那在查询全部学生列表后,我们跳转到list.jsp
,同样的(从下而上进行),将首页,上一页下一页的请求地址改为:
我这里粘多一点,将上下文环境也给大家粘过来,
<td colspan="20" style="text-align: center;">
<a style="text-decoration: none;" href="/Educational/student/studentServlet?stuname=${stuname}&stuno=${stuno}&sex=${sex}">首页</a>
<a style="text-decoration: none;" href="/Educational/student/studentServlet?pageIndex=${index-1<=1?1:index-1}&stuname=${stuname}&stuno=${stuno}&sex=${sex}">上一页</a>
<a style="text-decoration: none;" href="/Educational/student/studentServlet?pageIndex=${index+1>=totalPages?totalPages:index+1}&stuname=${stuname}&stuno=${stuno}&sex=${sex}">下一页</a>
<a style="text-decoration: none;" href="/Educational/student/studentServlet?pageIndex=${totalPages}&stuname=${stuname}&stuno=${stuno}&sex=${sex}">尾页</a>
共${total}条
每页显示
${index}/${totalPages}
</td>
那在此上面的修改与删除请求地址也要改为:
<td align="center">
<a href="/Educational/student/studentServlet?method=findbyid&sid=${stu.stuId}">修改</a>
<a href="/Educational/student/studentServlet?method=delete&sid=${stu.stuId}">删除</a>
</td>
继续往上看,发现还有模糊查询没有改,那把form表单的action
改为:
<form action="/Educational/student/studentServlet" method="get">
最上面的学生管理我们先不用改,
那我们再去看我们的新增功能的add.jsp
的form表单,将action
改为:
<form action="/Educational/student/studentServlet?method=insert" method="post">
还有更新功能的edit.jsp
的form表单,将action
改为:
<form action="/Educational/student/studentServlet?method=update" method="post">
那我们再去看看能不能成功展示:
1.先新增一个
2.去查询新增的学生:
3.查到后再去更新学生信息:
4.删除学生信息
查询不到,删除成功。
分页工具类
随着每一次数据的增删查改,我们的数据都要进行一次分页处理,这就使我们的代码冗余,那我们就可以考虑去用一个工具类封装一下。
那我们首先在util
包下,新建一个PageUtil
工具类:
package com.lby.util;
import java.util.List;
/**
* @Author: King-lby
* @Date Created in 2021-08-28 11:09
*/
public class PageUtil {
//1. 页码值 2.显示条数 3.查询结果列表 4. 总条数 5. 总列数
private Integer pageIndex;
private Integer pageSize=5;
private List dataList;
private Integer total;
private Integer totalPage;
public Integer getPageIndex() {
return pageIndex;
}
public void setPageIndex(Integer pageIndex) {
this.pageIndex = pageIndex;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public List getDataList() {
return dataList;
}
public void setDataList(List dataList) {
this.dataList = dataList;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public Integer getTotalPage() {
return total%pageSize>0?total/pageSize+1:total/pageSize;
}
public void setTotalPage(Integer totalPage) {
this.totalPage = totalPage;
}
}
那回到我们的StudentServlet
也要改,那由于我之前就迭代了,所以上面得那个代码就是改过的。
但是我们的list.jsp
也要改,
首当其冲的:
<td colspan="20" style="text-align: center;">
<a style="text-decoration: none;" href="/Educational/student/studentServlet?stuname=${stuname}&stuno=${stuno}&sex=${sex}">首页</a>
<a style="text-decoration: none;" href="/Educational/student/studentServlet?pageIndex=${p1.pageIndex-1<=1?1:pageIndex-1}&stuname=${stuname}&stuno=${stuno}&sex=${sex}">上一页</a>
<a style="text-decoration: none;" href="/Educational/student/studentServlet?pageIndex=${p1.pageIndex+1>=p1.totalPages?p1.totalPages:p1.pageIndex+1}&stuname=${stuname}&stuno=${stuno}&sex=${sex}">下一页</a>
<a style="text-decoration: none;" href="/Educational/student/studentServlet?pageIndex=${p1.totalPages}&stuname=${stuname}&stuno=${stuno}&sex=${sex}">尾页</a>
共${p1.total}条
每页显示
${p1.pageIndex}/${p1.totalPages}
</td>
还有一个要注意的:
那展示效果就是正常的,也就不展示了。
总结
那到这里,我们的项目基本算是结束了。那其实还有能够优化的部分,比如说我们的学号重复性验证,还有用户在未登录的情况下,不允许访问页面都可以优化。那如果大家有想法都可以发到我这。
当然若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
别问,问就是
创作不易,白嫖很爽,但是求各位手下留情。
如果本篇博客有任何错误或者疏漏,请批评斧正,感激不尽 !