关于EL,JSTL&&Filter&&Listener

1.EL
是什么?
是一种表达式语言,也是Servlet的一种规范
有什么用?
在JSP页面中获取数据,让JSP脱离java代码块和JSP表达式,更方便的展示JSP数据
基本语法
${表达式内容}
获取数据
只能从四大域中获取数据
根据名称从小到大逐个从域中查找
还可以获取JSP其他八大隐式对象,并且调用其中方法
代码如下:

	<%@ page import="com.itheima.bean.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/2/3
  Time: 13:20
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL获取数据</title>
</head>
<body>
<%--获取基本数据类型--%>
<%pageContext.setAttribute("num",10);%>
基本数据类型的获取:${
     num}<br/>
<hr/>

<%--获取数组类型的数据--%>
<%
String[] arr = {
     "hello","world"};
pageContext.setAttribute("arr",arr);
%>
数组:${
     arr}<br/>
    ${
     arr[0]}
    ${
     arr[1]}
</body>
</html>


<%--获取自定义对象类型的数据--%>
<% Student stu = new Student("zhangsan",22);
    pageContext.setAttribute("student",stu);
%>
自定义对象:${
     student}<br/>
学生姓名:${
     student.name}<br/>
学生年龄:${
     student.age}<br/>
<hr/>

<%--获取集合数据--%>
<%
    ArrayList<String> list = new ArrayList<>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    pageContext.setAttribute("lists",list);
%>
list集合:${
     lists}<br/>
零号元素:${
     lists.get(0)}<br/>
一号元素:${
     lists.get(1)}<br/>
<hr/>

<%--获取map集合类型数据--%>
<%
    HashMap<String,Student> map = new HashMap<>();
    map.put("hm1",new Student("张三",23));
    map.put("hm2",new Student("李四",24));
    pageContext.setAttribute("maps",map);
%>
map集合:${
     maps}<br/>
第一个学生对象:${
     maps.get("hm1")}<br/>
第一个学生对象姓名:${
     maps.hm1.name}<br/>
第一个学生对象年龄:${
     maps.hm1.age}<br/>
		

注意事项:
EL中没有空指针,没有索引越界,没有字符串拼接
EL表达式的运算符:
(1)关系运算符
关于EL,JSTL&&Filter&&Listener_第1张图片
(2)逻辑运算符
关于EL,JSTL&&Filter&&Listener_第2张图片
(3)其他运算符
关于EL,JSTL&&Filter&&Listener_第3张图片
代码如下:

<%@ page import="java.util.ArrayList" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/2/2
  Time: 10:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>运算符</title>
</head>
<body>
<%--1.判断对象是否为null 2.判断字符串是否为空 3.判断容器元素是否为零--%>
<%
    String str1 = null;
    String str2 = "";
    ArrayList list = new ArrayList();

    pageContext.setAttribute("str1", str1);
    pageContext.setAttribute("str2", str2);
    pageContext.setAttribute("list", list);
%>

${
     empty str1}<br/>
${
     empty str2}<br/>
${
     empty list}<br/>
${
     str2.length()>0}<br/>

<%
    pageContext.setAttribute("gender", "men");
%>
<input type="radio" name="gender" value="men" ${
     gender == "men" ? "checked":""}><input type="radio" name="gender" value="women" ${
     gender == "women" ? "checked":""}></body>
</html>


			

2.JSTL
是什么?
是JSP的核心标签库
由五个部分组成其中两个
Core 核心标签库 用于做逻辑处理
functions EL函数 EL表达式可以用的方法
标签库
关于EL,JSTL&&Filter&&Listener_第4张图片
流程控制 代码如下:

<%@ 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>
${
     pageContext.setAttribute("score","E")}
${
     pageContext.setAttribute("age","20")}
<c:if test="${score eq 'A'}">
    优秀
</c:if>
<c:if test="${age >= 20}">
    年龄合法
</c:if>

<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>

</body>
</html>

循环控制 代码如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.ArrayList" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/2/2
  Time: 11:25
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>循环</title>
</head>
<body>
<%--向域中添加集合--%>
<%
    ArrayList<String>list = new ArrayList<>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    list.add("ddd");
    pageContext.setAttribute("list",list);
%>
<%--遍历集合--%>
<c:forEach items="${list}" var="str">
    ${
     str}<br>
</c:forEach>
</body>
</html>

3.Filter过滤器
是什么?
是javaWeb三大组件之一,其他两个是Servlet和Listener
有什么用?
当访问服务器资源,请求到来时,服务器会先判断是否有过滤器和请求资源想关联,如果有,就拦截下来做特定功能,再由过滤器决定是否交给请求的资源,如果没有过滤器,会直接访问资源
一般用于处理乱码,登录验证,敏感字符过滤…
Filter是一个接口,要想使用过滤器必须实现该接口
核心方法和生命周期:
init(FilterConfig config) 初始化的方法 应用加载的时候执行
doFilter(ServletRequest request,ServletResponse response,FilterChain doFilter(ServletRequest request,ServletResponse response,FilterChain chain) 对请求资源和响应资源做过滤 只要应用一直提供服务,对象就会一直在
destroy() 销毁的方法 服务器关闭,宕机
注意:Filter实例对象在内存中只有一份
初始化参数配置:
Filter是一个接口可以加载一些初始化配置
核心的方法有:
getFilterName() 获取过滤器的名称
getInitParameter(String key) 根据key获取value
getInitParameterNames() 获取所有参数的key
getServletContext() 获取应用上下文对象
FilterChain是一个接口代表过滤器链,如果配置多个过滤器在第一个过滤器调用下一个过滤器,知道最终访问资源
,只有一个,放行后会直接访问资源
核心方法有:
doFilter(ServletRequest request,ServletResponse response) 用来做放行操作
Filter的配置方式:
第一种注解配置:@WebFilter("/要拦截资源")
@WebFilter("/") ---->>拦截站点所有资源
注解的优先级:如果配置多个拦截器,会以字典的先后顺序拦截
第二种映射文件配置 也可指定拦截的资源和拦截站点所有
映射文件的优先级:如果配置多个拦截器,会以映射文件配置的先后顺序拦截
代码如下:

 <filter>
        <filter-name>filterDemo02</filter-name>
        <filter-class>com.itheima.filter.FilterDemo02</filter-class>
       
    </filter>
    <filter-mapping>
        <filter-name>filterDemo02</filter-name>
        <url-pattern>/*
    

Filter初始化配置参数和生命周期 代码如下:
映射:

	<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<!--    过滤器解决乱码问题 映射文件方式-->
<!--    //映射文件配置方式 第一种:指定资源路径,只拦截指定资源-->
<!--    //第二种: /* 拦截站点所有资源-->
<!--    //如果由多个过滤器 注解方式的优先级 是按照字典顺序-->
<!--    //配置文件的优先级 是按照映射文件的先后顺序-->
    <filter>
        <filter-name>filterDemo02</filter-name>
        <filter-class>com.itheima.filter.FilterDemo02</filter-class>
        <!--filter初始化配置-->
        <init-param>
            <param-name>username</param-name>
            <param-value>zhangsan</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>filterDemo02</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

生命周期:

	//Filter的生命周期
   // @WebFilter("/ServletDemo02")
public class FilterDemo02 implements Filter {
     
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
     
        System.out.println("filter创建了....");
        String filterName = filterConfig.getFilterName();
        System.out.println(filterName);
        //获取Filter名称
        String username = filterConfig.getInitParameter("username");
        System.out.println(username);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
     
        System.out.println("filter在提供服务中...");
        //乱码处理
        servletResponse.setContentType("text/html;charset=UTF-8");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
     
        System.out.println("filter挂了...");
    }
}

乱码问题 代码如下:

//注解方式拦截 解决乱码问题
    //注解有两种方式,第一种:指定资源路径,只拦截指定资源
                    //第二种: /* 拦截站点所有资源
    //映射文件配置方式 第一种:指定资源路径,只拦截指定资源
                   //第二种: /* 拦截站点所有资源
    //如果由多个过滤器 注解方式的优先级 是按照字典顺序
                    //配置文件的优先级 是按照映射文件的先后顺序
@WebFilter("/*")
public class FilterDemo01 implements Filter {
     
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
     

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
     
        System.out.println("FilterDemo01执行了.....");
        //解决乱码
        servletResponse.setContentType("text/html;charset=UTF-8");
        //注意  必须要放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
     

    }
}

当功能类向客户端浏览器写中文是会发生乱码问题,但是配置了过滤器,服务器会先拦截下来请求,做过滤,处理乱码,再放行,就不会产生乱码了
4.Listeren监听器 观察者设计模式
所谓观察者设计模式就是 程序中做了某些操作,触发了监听器,监听器可以做操作,所有的监听器都是基于观察者模式的,要使用监听器要加注解@WebListener,当应用启动监听器会自动创建
由三个部分组成:
事件源---->>触发时间的对象
事件------->>触发的动作,封装了事件源
监听器---->>当事件源触发事件后,可以完成的功能
其中有:
对象的创建,销毁
域对象中属性的变化
会话相关内容的监听
在Servlet规范中共有八个监听器,都是以接口形式提供,具体功能要自己完成
(1)对象监听器 三个
用于监听对象的创建和销毁
ServletContextListener
有两个核心方法
contextInitialized(ServletContextEvent sce) 对象创建时执行
contextDestroyed(ServletContextEvent sce) 对象销毁时执行
HttpSessionListener
有两个核心方法
sessionCreated(HttpSessionEvent se) 对象创建时执行该方法
sessionDestroyed(HttpSessionEvent se)对象销毁时执行该方法
ServletRequestListener
有两个核心方法
requestInitialized(ServletRequestEvent sre) 对象创建时执行该方法
requestDestroyed(ServletRequestEvent sre)对象销毁时执行该方法
(2)属性监听器 三个
用于监听对象域属性值变化
三个方法分别对应 属性赋值 属性值替换 属性删除
ServletContextAttributeListener
有三个核心方法
attributeAdded(ServletContextAttributeEvent scae) 域中添加属性时执行该方法
attributeRemoved(ServletContextAttributeEvent scae) 域中移除属性时执行该方法
attributeReplaced(ServletContextAttributeEvent scae)域中替换属性时执行该方法
HttpSessionAttributeListener
有三个核心方法
attributeAdded(HttpSessionBindingEvent se) 域中添加属性时执行该方法
attributeRemoved(HttpSessionBindingEvent se)域中移除属性时执行该方法
attributeReplaced(HttpSessionBindingEvent se)域中替换属性时执行该方法
ServletRequestAttributeListener
有三个核心方法
attributeAdded(ServletRequestAttributeEvent srae)域中添加属性时执行该方法
attributeRemoved(ServletRequestAttributeEvent srae)域中移除属性时执行该方法
attributeReplaced(ServletRequestAttributeEvent srae)域中替换属性时执行该方法
(3)会话相关感知监听器 两个
HttpSessionBindingListener
用于监听会话域绑定数据和解除绑定
HttpSessionActivationListener
用于监听回话钝化和活化
相关代码如下:

	@WebListener
public class ContextListListenerDemo01 implements ServletContextListener {
     
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
     
        System.out.println("监听到了Context对象的创建...");
        //获取对象
        ServletContext context = servletContextEvent.getServletContext();
        System.out.println(context);
        //添加属性
        context.setAttribute("username","zhangsan");
        //更改属性
        context.setAttribute("username","lisi");
        //删除属性
        context.removeAttribute("username");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
     

    }
}
@WebListener
public class ContextAttributelistenerDemo01 implements ServletContextAttributeListener {
     
    @Override
    public void attributeAdded(ServletContextAttributeEvent even) {
     
        //想请求域添加属性执行此方法
        System.out.println("监听到了属性的添加...");
        ServletContext servletContext = even.getServletContext();
        Object username = servletContext.getAttribute("username");
        System.out.println(username);
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent even) {
     
        //删除请求域属性执行此方法
        System.out.println("监听到了属性的删除...");
        //获取应用域对象
        ServletContext servletContext = even.getServletContext();
        Object username = servletContext.getAttribute("username");
        System.out.println(username);
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent even) {
     
        //向应用域中替换属性执行此方法
        System.out.println("监听到了属性的替换....");
        //获取应用域对象
        ServletContext servletContext = even.getServletContext();
        Object username = servletContext.getAttribute("username");
        System.out.println(username);
    }
}

你可能感兴趣的:(EL,java,后端)