✨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的方法体,其实就是把之前的AddStuServletDeleteByIdServlet ,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>

还有一个要注意的:
在这里插入图片描述
那展示效果就是正常的,也就不展示了。

总结

那到这里,我们的项目基本算是结束了。那其实还有能够优化的部分,比如说我们的学号重复性验证,还有用户在未登录的情况下,不允许访问页面都可以优化。那如果大家有想法都可以发到我这。

当然若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
别问,问就是在这里插入图片描述
创作不易,白嫖很爽,但是求各位手下留情。
如果本篇博客有任何错误或者疏漏,请批评斧正,感激不尽 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

少年,又是你

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

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

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

打赏作者

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

抵扣说明:

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

余额充值