综合案例-过滤器、监听器
解决乱码问题
我们的学生管理系统中,肯定会有请求和响应的中文乱码问题。而乱码问题在学习Servlet的课程中已经讲解了如何解决了。只是在实际开发中,当有很多的Servlet时,肯定不能在每个Servlet中都编写一遍解决乱码的代码。因此,就可以利用我们今天学习的过滤器来实现统一解决请求和响应乱码的问题。
检查登录
在学生管理系统中,它包含了学生信息的录入和学生列表的查询,用户(员工)信息的录入以及查询。当然,我们实际的功能可能远远不止这些。但是就已有功能来说,也不是谁都可以通过地址栏直接输入访问的,它应该有权限的控制,只是我们课程在此处没法深入展开讲解权限,但最起码的登录,身份的认证还是必要的。
由此,就引出来一个问题,是在每次访问Servlet时,在Servlet的代码中加入是否认证过身份的判断吗?显然,是不合理的。那么,既然不是在每个Servlet中编写,就应该是统一管理和维护。此时,我们的过滤器就又可以出场了。
页面的java代码块和jsp表达式改造
我们今天除了学习了过滤器,还学习了EL表达式和JSTL标签库,它们的出现就是避免我们的JSP页面中有过多的java代码或者jsp表达式。我们要运用今天所学知识改造页面。
乱码问题过滤器
创建EncodingFilter类,解决乱码
package com.itheima.filter; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* 解决全局乱码问题 */ @WebFilter("/*") public class EncodingFilter implements Filter{ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) { try{ //1.将请求和响应对象转换为和HTTP协议相关 HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //2.设置编码格式 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //3.放行 filterChain.doFilter(request,response); } catch (Exception e) { e.printStackTrace(); } } }
检查登录过滤器
检查登录,创建LoginFilter 类
package com.itheima.filter; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* 检查登录 */ @WebFilter(value = {"/addStudent.jsp","/listStudentServlet"}) public class LoginFilter implements Filter{ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) { try{ //1.将请求和响应对象转换为和HTTP协议相关 HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //2.获取会话域对象中数据 Object username = request.getSession().getAttribute("username"); //3.判断用户名 if(username == null || "".equals(username)) { //重定向到登录页面 response.sendRedirect(request.getContextPath() + "/login.jsp"); return; } //4.放行 filterChain.doFilter(request,response); } catch (Exception e) { e.printStackTrace(); } } }
jsp页面的改造
1,修改addStudent.jsp
的虚拟访问路径
<form action="${pageContext.request.contextPath}/addStudentServlet" method="get" autocomplete="off"> 学生姓名:<input type="text" name="username"> <br> 学生年龄:<input type="number" name="age"> <br> 学生成绩:<input type="number" name="score"> <br> <button type="submit">保存</button> </form>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <title>学生管理系统首页</title> </head> <body> <%-- 获取会话域中的数据 如果获取到了则显示添加和查看功能的超链接 如果没获取到则显示登录功能的超链接 --%> <c:if test="${sessionScope.username eq null}"> <a href="${pageContext.request.contextPath}/login.jsp">请登录</a> </c:if> <c:if test="${sessionScope.username ne null}"> <a href="${pageContext.request.contextPath}/addStudent.jsp">添加学生</a> <a href="${pageContext.request.contextPath}/listStudentServlet">查看学生</a> </c:if> </body> </html>
<%@ page import="com.itheima.bean.Student" %> <%@ page import="java.util.ArrayList" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <title>查看学生</title> </head> <body> <table width="600px" border="1px"> <tr> <th>学生姓名</th> <th>学生年龄</th> <th>学生成绩</th> </tr> <c:forEach items="${students}" var="s"> <tr align="center"> <td>${s.username}</td> <td>${s.age}</td> <td>${s.score}</td> </tr> </c:forEach> </table> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>学生登录</title> </head> <body> <form action="${pageContext.request.contextPath}/loginStudentServlet" method="get" autocomplete="off"> 姓名:<input type="text" name="username"> <br> 密码:<input type="password" name="password"> <br> <button type="submit">登录</button> </form> </body> </html>