EL表达式、JSTL标签库、过滤器(Filter)、监听器(Listener)

1. EL表达式

1.1 介绍

  • EL(Expression Lannguage):表达式语言
  • 在JSP2.0规范中加入的内容,也是Servlet规范的一部分
  • 作用
    • 在JSP页面获取数据,让我们的JSP脱离Java代码块和JSP表达式
  • 不需要关心是哪个对象,只需要关心名称就行了
  • 语法
    • ${表达式的内容}
  • 只能从域对象中获取,即四大域对象

1.2 入门案例

<head>
    <title>el快速入门title>
head>
<body>
    <% request.setAttribute("username","zhangsan");%>

    ${username}
body>
html>

1.3 功能

1.3.1 获取数据

  • 获取普通类型数据
    • ${数据的名称}
  • 自定义对象类型
    • ${数据的名称} ==> 获取到的是对象
    • ${数据名称.属性名}
  • list集合
    • ${数据名称[索引]}
  • map集合
    • ${数据名称.map集合key的名称}
    • ${数据名称[“map集合key的名称”]}
<body>
<%--基本数据类型--%>
    <%pageContext.setAttribute("num",10);%>
    ${num}<br/>
<%--自定义对象--%>
    <%
        Student stu = new Student("张三","23");
        pageContext.setAttribute("stu",stu);
    %>

    ${stu}<br/>
    ${stu.name}
    ${stu.age}

<%--数组类型--%>
    <%
        String[] arr = {"hello","world"};
        pageContext.setAttribute("arr",arr);
    %>

    ${arr} <br/>
    ${arr[0]}<br/>
    ${arr[1]}<br/>

<%--List集合--%>
    <%
        ArrayList<String> list = new ArrayList<>();
        list.add("hello");
        list.add("world");
        pageContext.setAttribute("list",list);
    %>

    ${list}<br/>
    ${list[0]}<br/>
    ${list[1]}<br/>

<%--Map集合--%>
    <%
        HashMap<String,Student> map = new HashMap<>();
        map.put("hm1",new Student("张三","23"));
        map.put("hm2",new Student("李四","24"));
        pageContext.setAttribute("map",map);
    %>

    ${map}<br/>
    ${map.hm1}<br/>
    ${map.hm2}<br/>
body>

1.3.2 运算符

  • 关系运算符
运算符 作用 示例 结果
==或eq 等于 5 = = 5 或 {5 == 5}或 5==5{5 eq 5} true
!=或ne 不等于 5 ! = 5 或 {5 != 5}或 5!=5{5 ne 5} false
<或It 小于 3 < 5 或 {3 < 5}或 3<5{3 It 5} true
> 或gt 大于 3 > 5 或 {3 > 5}或 3>5{3 gt 5} false
<=或le 小于等于 3 < = 5 或 {3 <= 5}或 3<=5{3 le 5} true
>=或ge 大于等于 3 > = 5 或 {3 >= 5}或 3>=5{3 ge 5} false
  • 逻辑运算符
运算符 作用 示例 结果
&&或and 并且 {A&&B}或{A and B} true/false
||或or 或者 A ∥ ∥ B 或 {A\|\|B}或 AB{A or B} true/false
!或not 取反 ! A 或 {! A}或 !A{not A} true/false
  • 其他运算符
运算符 作用
empty 判断对象是否为Null,判断字符串是否为空字符串,判断集合长度是否为0
条件?表达式1:表达式2 三元运算符
  • 特殊运算符示例
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.itheima.domain.User" %>

<html>
	<head>
		<title>EL两个特殊的运算符title>
	head>
	<body>
		<%--empty运算符:
			它会判断:对象是否为null,字符串是否为空字符串,集合中元素是否是0个
		--%>
		<% String str = null;
		  String str1 = "";
		  List<String> slist = new ArrayList<String>();
		  pageContext.setAttribute("str", str);
		  pageContext.setAttribute("str1", str1);
		  pageContext.setAttribute("slist", slist);
		%>
		${empty str}============当对象为null返回true<br/>
		${empty str1 }==========当字符串为空字符串是返回true(注意:它不会调用trim()方法)<br>
		${empty slist}==========当集合中的元素是0个时,是true
		<hr/>
		<%--三元运算符 
			 条件?真:假
		--%>
		<% request.setAttribute("gender", "female"); %>
		<input type="radio" name="gender" value="male" ${gender eq "male"?"checked":""} ><input type="radio" name="gender" value="female" ${gender eq "female"?"checked":""}>body>
html>
  • 运行结果
    EL表达式、JSTL标签库、过滤器(Filter)、监听器(Listener)_第1张图片

1.4 注意事项

  • EL表达式中没有空指针异常
  • EL表达式中没有索引越界异常
  • EL表达式中没有字符串拼接的效果
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>EL表达式的注意事项title>
  head>
  <body>
    <%--EL表达式的三个没有--%>
    第一个:没有空指针异常<br/>
    <% String str = null;
       request.setAttribute("testNull",str);
    %>
    ${testNull}
    <hr/>
    第二个:没有数组下标越界<br/>
    <% String[] strs = new String[]{"a","b","c"};
       request.setAttribute("strs",strs);
    %>
    取第一个元素:${strs[0]}
    取第六个元素:${strs[5]}
    <hr/>
    第三个:没有字符串拼接<br/>
    <%--${strs[0]+strs[1]}--%>
    ${strs[0]}+${strs[1]}
  body>
html>

1.5 使用细节

  • EL表达式能够获取四大域对象的数据,
  • EL表达式能够获取JSP中其他的八个隐式对象,并且可以调用对应对象的对应方法
    • ${pageContext.request.方法名}
  • EL表达式中共有11个隐式对象
EL中的隐式对象 类型 对应JSP隐式对象 备注
PageContext Javax.serlvet.jsp.PageContext PageContext 完全一样
ApplicationScope Java.util.Map 没有 应用层范围
SessionScope Java.util.Map 没有 会话范围
RequestScope Java.util.Map 没有 请求范围
PageScope Java.util.Map 没有 页面层范围
Header Java.util.Map 没有 请求消息头key,值是value(一个)
HeaderValues Java.util.Map 没有 请求消息头key,值是数组(一个头多个值)
Param Java.util.Map 没有 请求参数key,值是value(一个)
ParamValues Java.util.Map 没有 请求参数key,值是数组(一个名称多个值)
InitParam Java.util.Map 没有 全局参数,key是参数名称,value是参数值
Cookie Java.util.Map 没有 Key是cookie的名称,value是cookie对象

2. JSTL标签库

2.1 介绍

  • JSTL(Java Server Pages Standarded Tag Library):JSP标准标签库
  • 主要提供给开发人员一个标准通用的标签库
  • 开发人员可以利用这些标签取代JSP中的Java代码
    组成 作用 说明
    core 核心标签库 通用的逻辑处理
    fmt 国际化 不同地域显示不同语言
    functions EL函数 EL表达式可以使用的方法
    sql 操作数据库 可以直接从页面上实现数据库操作的功能
    xml 操作XML 能轻松的读取xml文件的内容

2.2 核心标签库(core)

标签名称 功能分类 属性 作用
<标签名:if> 流程控制 核心标签库 用于条件判断
<标签名:choose><标签名:when><标签名:otherwise> 流程控制 核心标签库 用于多条件判断
<标签名:forEach> 迭代遍历 核心标签库 用于循环遍历

2.3 常用标签

2.3.1 if标签

  • test属性 : 书写判断条件
<%--向域对象中添加成绩数据--%>
${pageContext.setAttribute("score","A")}

<%--对成绩进行判断--%>
<c:if test="${score == 'A'} ">
	优秀
c:if>

2.3.2 choose标签

  • 子标签: when标签
    • test属性:书写判断条件
 <%--向域对象中添加成绩数据--%>
    ${pageContext.setAttribute("score","T")}

    <%--对成绩进行多条件判断--%>
    <c:choose>
        <c:when test="${score eq 'A'}">优秀c:when>
        <c:when test="${score eq 'B'}">良好c:when>
        <c:when test="${score eq 'C'}">及格c:when>
        <c:when test="${score eq 'D'}">较差c:when>
        <c:otherwise>成绩非法c:otherwise>
    c:choose>

2.3.3 forEach标签

  • items属性: 集合的名称
  • var属性 : 集合中每一个元素的名称
<%--向域对象中添加集合--%>
    <%
        ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");
        pageContext.setAttribute("list",list);
    %>

    <%--遍历集合--%>
    <c:forEach items="${list}" var="str">
        ${str} <br>
    c:forEach>

2.4 JSTL基本使用

  • 创建web项目
  • 在web目录下创建一个WEB-INF目录
  • 在WEB-INF中创建lib文件夹
  • 将jar包导入到lib文件夹中
  • 在web文件夹中创建一个jsp文件
  • 在jsp文件开头第二行引入核心标签库
    • <%@ taglib uri = “路径” prefix =“标签名” %>
  • 文件中书写代码可以正常使用标签
    EL表达式、JSTL标签库、过滤器(Filter)、监听器(Listener)_第2张图片

3. 过滤器(Filter)

3.1 介绍

  • 在程序中访问服务器资源时,当一个请求到来,服务器首先判断是否有过滤器与请求资源相关联,如果有,过滤器可以将请求拦截下来,完成一些特定的功能,再由过滤器决定是否交给请求资源,如果没有则像之前那样直接请求资源了,响应也是类似的
  • 功能
    • 过滤器一般用于完成通用的操作
  • web阶段的三大组件:servlet 过滤器 监听器

3.2 Filter介绍

  • 是一个接口,想要实现过滤器的功能,需要实现该接口,然后进行相关配置
  • Filter_API
    EL表达式、JSTL标签库、过滤器(Filter)、监听器(Listener)_第3张图片
    EL表达式、JSTL标签库、过滤器(Filter)、监听器(Listener)_第4张图片

3.3 核心方法

方法 说明
init(FilterCofig config) 初始化
doFilter(ServletRequset Request,ServletResponse Response,FilterChain ) 执行服务
destroy() 销毁

3.4 FilterChain介绍

  • FilterChain是一个接口,代表过滤器链对象,由Servlet容器提供实现类对象,可以直接使用
  • 过滤器可以定义多个,就会组成过滤器链对象
  • FilterChain_API
    EL表达式、JSTL标签库、过滤器(Filter)、监听器(Listener)_第5张图片
  • 核心方法
方法 作用
doFilter(ServletRequset Request,ServletResponse Response) 放行方法
  • 如果有多个过滤器,在第一个过滤器中调用下一个过滤器,以此类推,直到到达最终访问资源,如果只有一个过滤器,放行时,就会直接到达最终访问资源

3.5 案例

  • 创建一个web项目
  • 创建一个servlet文件
  • 定义一个过滤器(创建文件实现Filter接口,重写doFilter方法)
    public class FilterDemo1 implements Filter {
           
      @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
           
          System.out.println("我是filterDemo1过滤器");
          //放行
          chain.doFilter(request,response);
      }
    }
    
  • 配置文件
    • 在web.xml中进行配置
    <filter>
        <filter-name>demo1filter-name>
        <filter-class>com.itheima.filter.FilterDemo1filter-class>
    filter>
    <filter-mapping>
        <filter-name>demo1filter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>
    
    • 注解的配置方式
      • 在过滤器类上添加@WebFilter("/拦截路径")

3.6 拦截路径的配置

  • 完全路径
    • 特点:以/开头
  • 目录路径
    • 特点:以/开头,以*结尾
  • 后缀名路径
    • 特点:以*开头,以后后缀名结尾

3.7 使用细节

  • 配置方式
    • 注解 :@WebFilter(拦截路径)
    • 配置文件
      <filter>
      	<filter-name>过滤器命名filter-name>
      	<filter-class>路径filter-class>
      filter>
      
      <filter-mapping>
      	<filter-name>过滤器名称filter-name>
      	<url-pattern>拦截路径url-pattern>
      filter-mapping>
    
  • 多个过滤器,以什么顺序进行拦截
    • 以配置文件中的标签为标准,谁在前,谁先执行
    • 使用注解的方式配置过滤器,则根据命名的字典顺序为标准
    • 如果项目中有多个过滤器且他们有顺序要求,那么建议使用xml配置文件进行配置

3.8 过滤器的生命周期

  • 创建
    • 当应用加载时实例化对象并执行init初始化方法
    • init(FilterConfig filterConfig),需要一个FilterConfig参数
  • 服务
    • 对象提供服务的过程,执行doFilter方法
  • 销毁
    • 当应用卸载时或服务器停止时对象销毁,执行destroy方法

3.9 FilterConfig

  • 接口,代表过滤器的配置对象,可以加载一些初始化参数
    • 把字符集在配置文件中配置,可以通过读取配置文件的方式得到字符集
  • FilterConfig_API
    EL表达式、JSTL标签库、过滤器(Filter)、监听器(Listener)_第6张图片

3.10 过滤器的四种拦截行为

  • 我们的过滤器目前拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的,要想使用,需要我们配置。配置的方式如下:

<filter>
    <filter-name>FilterDemo1filter-name>
    <filter-class>com.itheima.web.filter.FilterDemo1filter-class>
    
    <async-supported>trueasync-supported>
filter>
<filter-mapping>
    <filter-name>FilterDemo1filter-name>
    <url-pattern>/ServletDemo1url-pattern>
    
    <dispatcher>REQUESTdispatcher>
    
    <dispatcher>ERRORdispatcher>
    
    <dispatcher>FORWARDdispatcher>
    
    <dispatcher>INCLUDEdispatcher>
    
    <dispatcher>ASYNCdispatcher>
filter-mapping>

3.11 过滤器与Servlet的区别

方法/类型 Servlet Filter 备注
初始化 方法 void init(ServletConfig); void init(FilterConfig); 几乎一样,都是在web.xml中配置参数,用该对象的方法可以获取到。
提供服务方法 void service(request,response); void dofilter(request,response,FilterChain); Filter比Servlet多了一个FilterChain,它不仅能完成Servlet的功能,而且还可以决定程序是否能继续执行。所以过滤器比Servlet更为强大。 在Struts2中,核心控制器就是一个过滤器。
销毁方法 void destroy(); void destroy();

4. 监听器(Listener)

4.1 介绍

  • 观察者设计模式,所有的监听器都是基于观察者设计模式的
  • 三个组成部分
    • 事件源:触发事件的对象
    • 事件:触发的动作,封装了事件源
    • 监听器:当事件源触发事件后,可以完成功能
  • 在程序当中,我们可以对:对象的创建销毁、域对象中属性的变化、会话的相关内容进行监听
  • Servlet中共计有8个监听器

4.2 监听对象的监听器

  • ServletContextListener:用于监听ServletContext域对象的创建和销毁
    • 核心方法
      方法名 作用
      contextInitialized(ServletContextEvent sce) 对象创建时执行该方法
      contextDestroyed(ServletContextEvent sce) 对象销毁时执行该方法
    • 参数介绍
      • ServletContextEvent代表事件对象
      • 事件对象中封装了事件源,也就是ServletContext
      • 真正的事件指的是创建或销毁ServletContext对象的操作
/**
 * 用于监听ServletContext对象创建和销毁的监听器
 */

public interface ServletContextListener extends EventListener {
     

    /**
     *	对象创建时执行此方法。该方法的参数是ServletContextEvent事件对象,事件是【创建对象】这个动作
     *  事件对象中封装着触发事件的来源,即事件源,就是ServletContext
     */
    public default void contextInitialized(ServletContextEvent sce) {
     
    }

    /**
     * 对象销毁执行此方法
     */
    public default void contextDestroyed(ServletContextEvent sce) {
     
    }
}
  • HttpSessionListener:用于监听HttpSession对象的创建和销毁
    • 核心方法
      方法名 作用
      sessionCreated(HttpSessionEvent se) 对象创建时执行该方法
      sessionDestroyed(HttpSessionEvent se) 对象销毁时执行该方法
    • 参数介绍
      • HttpSessionEvent代表事件对象
      • 事件对象中封装了事件源,也就是HttpSession
      • 真正的事件指的是创建或销毁HttpSession对象的操作
/**
 * 用于监听HttpSession对象创建和销毁的监听器
 */
public interface HttpSessionListener extends EventListener {
     

    /**
     * 对象创建时执行此方法。
     */
    public default void sessionCreated(HttpSessionEvent se) {
     
    }

    /**
     *  对象销毁执行此方法
     */
    public default void sessionDestroyed(HttpSessionEvent se) {
     
    }
}
  • ServletRequestListener:用于监听ServletRequest对象的创建和销毁
    • 核心方法
      方法 作用
      requestInitialized(ServletRequestEvent sre) 对象创建时执行该方法
      requestDestroyed(ServletRequestEvent sre) 对象销毁时执行该方法
    • 参数介绍
      • ServletRequestEvent代表事件对象
      • 事件对象中封装了事件源,也就是ServletRequest
      • 真正的事件指的是创建或销毁ServletRequest对象的操作
/**
 * 用于监听ServletRequest对象创建和销毁的监听器
 */
public interface ServletRequestListener extends EventListener {
     

   	/**
     *  对象创建时执行此方法。
     */
    public default void requestInitialized (ServletRequestEvent sre) {
     
    }
    
    /**
     * 对象销毁执行此方法
     */
    public default void requestDestroyed (ServletRequestEvent sre) {
     
    } 
}

4.3 监听域对象属性变化的监听器

  • ServletContextAttributeListener:用于监听ServletContext应用域中属性的变化
    • 核心方法
      方法 作用
      attributeAdded(ServletContextAttributeEvent scae) 域中添加属性时执行该方法
      attributeReplaced(ServletContextAttributeEvent scae) 域中替换属性时执行该方法
      attributeRemoved(ServletContextAttributeEvent scae) 域中移除属性时执行该方法
    • 参数介绍
      • ServletContextAttributeEvent代表事件对象
      • 事件对象中封装了事件源,也就是ServletContext
      • 真正的事件指的是添加、移除、替换应用域中属性的操作
/**
 * 用于监听ServletContext域(应用域)中属性发生变化的监听器
 */

public interface ServletContextAttributeListener extends EventListener {
     
    /**
     * 域中添加了属性触发此方法。参数是ServletContextAttributeEvent事件对象,事件是【添加属性】。
     * 事件对象中封装着事件源,即ServletContext。
     * 当ServletContext执行setAttribute方法时,此方法可以知道,并执行。
     */
    public default void attributeAdded(ServletContextAttributeEvent scae) {
     
    }

    /**
     * 域中删除了属性触发此方法
     */
    public default void attributeRemoved(ServletContextAttributeEvent scae) {
     
    }

    /**
     * 域中属性发生改变触发此方法
     */
    public default void attributeReplaced(ServletContextAttributeEvent scae) {
     
    }
}
  • HttpSessionAttributeListener:用于监听HttpSession会话域中属性的变化
    • 核心方法
      方法 作用
      attributeAdded(HttpSessionBindingEvent se) 域中添加属性时执行该方法
      attributeRemoved(HttpSessionBindingEvent se) 域中移除属性时执行该方法
      attributeReplaced(HttpSessionBindingEvent se) 域中替换属性时执行该方法
    • 参数介绍
      • HttpSessionBindingEvent代表事件对象
      • 事件对象中封装了事件源,也就是HttpSession
      • 真正的事件指的是添加、移除、替换会话域中属性的操作
/**
 * 用于监听HttpSession域(会话域)中属性发生变化的监听器
 */
public interface HttpSessionAttributeListener extends EventListener {
     

    /**
     * 域中添加了属性触发此方法。
     */
    public default void attributeAdded(HttpSessionBindingEvent se) {
     
    }

    /**
     * 域中删除了属性触发此方法
     */
    public default void attributeRemoved(HttpSessionBindingEvent se) {
     
    }

    /**
     * 域中属性发生改变触发此方法
     */
    public default void attributeReplaced(HttpSessionBindingEvent se) {
     
    }
}
  • ServletRequestAttributeListener:用于监听ServletRequest请求域中属性的变化
    • 核心方法
      方法 作用
      attributeAdded(ServletRequestAttributeEvent srae) 域中添加属性时执行该方法
      attributeRemoved(ServletRequestAttributeEvent srae) 域中移除属性时执行该方法
      attributeReplaced(ServletRequestAttributeEvent srae) 域中替换属性时执行该方法
    • 参数介绍
      • ServletRequestAttributeEvent代表事件对象
      • 事件对象中封装了事件源,也就是ServletRequest
      • 真正的事件指的是添加、移除、替换请求域中属性的操作
/**
 * 用于监听ServletRequest域(请求域)中属性发生变化的监听器
 */
public interface ServletRequestAttributeListener extends EventListener {
     
    /**
     * 域中添加了属性触发此方法。
     */
    public default void attributeAdded(ServletRequestAttributeEvent srae) {
     
    }

    /**
     * 域中删除了属性触发此方法
     */
    public default void attributeRemoved(ServletRequestAttributeEvent srae) {
     
    }

    /**
     * 域中属性发生改变触发此方法
     */
    public default void attributeReplaced(ServletRequestAttributeEvent srae) {
     
    }
}

4.4 监听会话相关的感知型监听器

  • HttpSessionBindingListener:用于感知对象和会话域绑定的监听器
    • 核心方法
      方法 作用
      valueBound(HttpSessionBindingEvent event) 数据添加到会话域中(绑定)时执行该方法
      valueUnbound(HttpSessionBindingEvent event) 数据从会话域中(解绑)时执行该方法
    • 参数介绍
      • HttpSessionBindingEvent代表事件对象
      • 事件对象中封装了事件源,也就是HttpSession
      • 真正的事件指的是添加、移除会话域数据的操作
/**
 * 用于感知对象和和会话域绑定的监听器
 * 当有数据加入会话域或从会话域中移除,此监听器的两个方法会执行。
 * 加入会话域即和会话域绑定
 * 从会话域移除即从会话域解绑
 */
public interface HttpSessionBindingListener extends EventListener {
     

    /**
     * 当数据加入会话域时,也就是绑定,此方法执行
     */
    public default void valueBound(HttpSessionBindingEvent event) {
     
    }

    /**
     * 当从会话域移除时,也就是解绑,此方法执行
     */
    public default void valueUnbound(HttpSessionBindingEvent event) {
     
    }
}
  • HttpSessionActivationListener:用于感知会话域中对象钝化和活化的监听器
    • 核心方法
      方法 作用
      sessionWillPassivate(HttpSessionEvent se) 会话域中数据钝化时执行该方法
      sessionDidActivate(HttpSessionEvent se) 会话域中数据活化时执行该方法
    • 参数介绍
      • HttpSessionEvent代表事件对象
      • 事件对象中封装了事件源,也就是HttpSession
      • 真正的事件指的是会话域中数据钝化、活化的操作
/**
 * 用于感知会话域中对象钝化和活化的监听器
 */
public interface HttpSessionActivationListener extends EventListener {
     

    /**
     * 当会话域中的数据钝化时,此方法执行
     */
    public default void sessionWillPassivate(HttpSessionEvent se) {
     
    }

    /**
     * 当会话域中的数据活化时(激活),此方法执行
     */
    public default void sessionDidActivate(HttpSessionEvent se) {
     
    }
}

4.5 监听器的使用

  • 创建文件实现监听器接口,重写方法
/**
 * 用于监听ServletContext对象创建和销毁的监听器
 */
public class ServletContextListenerDemo implements ServletContextListener {
     

    /**
     * 对象创建时,执行此方法
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
     
        System.out.println("监听到了对象的创建");
        //1.获取事件源对象
        ServletContext servletContext = sce.getServletContext();
        System.out.println(servletContext);
    }

    /**
     * 对象销毁时,执行此方法
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
     
        System.out.println("监听到了对象的销毁");
    }
}
  • 配置

<listener>
    <listener-class>com.itheima.web.listener.ServletContextListenerDemolistener-class>
listener>
  • 测试结果
    EL表达式、JSTL标签库、过滤器(Filter)、监听器(Listener)_第7张图片

你可能感兴趣的:(Web,jstl,filter,web)