第九篇学习总结
一、Filter
过滤器会在请求到实际指向目标的时候先截获到请求,并且在请求离开目标之后再次截获请求。Filter是Servlet技术的核心技术,可以利用其完成自动登录、编码过滤、权限控制、过滤请求、压缩数据等。
1、编写过滤器
-
定义类实现Filter接口:public class MyFilter implements Filter{}
-
指定Filter的拦截范围
- 配置式:在web.xml文件中配置
<filter> <filter-name>myfilter</filter-name> <filter-class>com.qianfeng.user.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>myfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 注解式:在过滤器中配置,@WebFilter("/*"),拦截所有
-
多过滤器下的优先级:如果采用配置式,按照注册顺序调用,写在前面的先调用;如果采用注解式,按照类名的字符串顺序调用
-
自动登录:
public class AutoLoginFilter implements Filter {
//过滤器的生命周期 : 服务器启动诞生 服务器运行 活着 服务器关闭 消亡
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//为什么要强转?
//Session是和Http协议配合的, 所以只有HttpServletRequest才能获取到
//能安全的强转吗?
//如果请求是http协议的, 那么, tomcat造的就是HttpServletRequest对象, ServletRequest 是HttpServletRequest父类
HttpServletRequest req = (HttpServletRequest) servletRequest;
Object obj = req.getSession().getAttribute("login");//获取登录标志
if(obj==null){
//做自动登录
Cookie[] cookies = req.getCookies();//如果前台一个cookie都没有传递过来, 这里会获取到null
if(cookies!=null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
if("autologin".equals(name)){
String value = cookie.getValue();
String[] strs = value.split("=");
if(Message.users.containsKey(strs[0])&&Message.users.get(strs[0]).equals(strs[1])){
req.getSession().setAttribute("login",true);
break;//不能写return, 如果是return的话, 放行代码都无法执行了
}
}
}
}
}
filterChain.doFilter(servletRequest,servletResponse); //放行请求
}
@Override
public void destroy() {
}
}
二、监听器
监听器用于监听web应用中某些对象、信息的创建、销毁、增加、修改、删除等动作的发生,然后作出响应处理。常用于统计在线人输和在线用户,系统加载时进行信息初始化,统计网站的访问量等。
1、编写监听器
- 定义类实现对应的监听器接口
- 重写方法
- 配置:
- 注解式
- 配置式
- 优点:非侵入式检测
三、JSP
1、HTML作为展示页的缺点
1.1 缺点
- 缓存问题,浏览器如果认为是同一个HTML页面,不会重新请求
- 回显问题,无法动态页面展示
- 动态显示页面
2、解决办法
- MIME类型
- 使用servlet,动态拼接代码
2、JSP介绍
JSP是Java Server Pages,基于html模板,可以在html模板中嵌入Java代码,同时还可以和CSS与JavaScript结合。
- jsp是servlet,不是静态页面,所以不会缓存
- 优势:
- 与纯Servlet相比,很方便的编写或者修改HTML网页而不用去面对大量的println语句
- 与JavaScript相比,JavaScript很难与服务器交互。
- 与静态HTML相比:静态HTML不包含动态信息
- 缺点:
- 传输量大,可以使用异步,尽量不刷新页面
- 每次都要拼接大量的字符串:页面静态化
3、JSP指令
- page指令:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
- include指令:静态包含 <%@ include file="header.jsp" %>
- taglib指令:引入其他标签库:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
4、JSP的动作(尽量不用)
- jsp:include动态包含:<jsp:include page="header.jsp"></jsp:include>
- 静态包含与动态包含的区别:翻译的时间段不同,静态包含在翻译时就把两个文件进行合并,动态包含不会合并文件,当代码执行到include时才会合并。
5、JSO九大内置对象
-
对象名 类型 说明 request javax.servlet.http.HttpServletRequest response javax.servlet.http.HttpServletResponse session javax.servlet.http.HttpSession 由session=“true”开关 application javax.servlet.ServletContext exception java.lang.Throwable 由isErrorPage=“false”开关 page java.lang.Object当前对象this 当前servlet实例 config javax.servlet.ServletConfig pageContext javax.servlet.jsp.PageContext out javax.servlet.jsp.JspWriter javax.servlet.jsp.JspWriter
六、JSP的四大域对象
- pageContext:标识当前JSP页面
- request域:常用于转发
- session域:同一个浏览器法除的多个请求共享一个域
- servletContext域:最大的一个域,被所有请求共享
七、EL表达式
EL表达式不是一种语言,是JSP中获取数据的一种规范
- 格式:${参数名称}
八、JSTL
这是一款强大的逻辑标签库,可以在JSP页面进行逻辑判断,在使用之前需要导入外部标签库,主要用到的是两个标签:判断与循环。
- 导入外部标签库:<%@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c" %>
- 判断:<c:if test=""></c:if>
- 循环:<c:forEach items="" var=""></c:forEach>
网友评论