Servlet之EL表达式&JSTL&过滤&监听

EL表达式,全称是Expression Language。意为表达式语言。它是Servlet规范中的一部分,是JSP2.0规范加入的内容。其作用是用于在JSP页面中获取数据,从而让我们的JSP脱离java代码块和JSP表达式。
基本语法${表达式内容}
例如:在浏览器中输出请求域中名称为message的内容。

假定,在请求域中存入了一个名称为message的数据(request.setAttribute("message","EL");),此时在jsp中获取的方式,如下表显示:

Java代码块 JSP表达式 EL表达式
<%

String message = (String)request.getAttribute("message");
out.write(message);
%>
<%=request.getAttribute("message")%> ${message}

通过上面可以看出,都可以从请求域中获取数据,但是EL表达式写起来是最简单的方式。这也是以后我们在实际开发中,当使用JSP作为视图时,绝大多数都会采用的方式。

EL表达式获取四大域中的数据
它只能从四大域中获取数据,调用的就是findAttribute(name,value);方法,根据名称由小到大逐个域中查找,找到就返回,找不到就什么都不显示。它可以获取对象,可以是对象中关联其他对象,可以是一个List集合,也可以是一个Map集合。

值是对象:${键.属性名} 
// 属性指的setXxx或getXxx的xxx,遵循了: OGNL(对象图导航语言, 操作东西都是属性)表达式
值是数组或者单列集合:${键[索引]}
值是map集合:${键.map的键}  注意map的键不带引号

EL表达式中支持运算符:算术, 逻辑 , 比较, 三元运算
${empty 对象} :

  1. 判断对象为null
  2. 判断集合或者数组的长度是否为0
  3. 字符是否为null或者长度为0

${not empty 对象} 判断不为空

注意:在使用EL表达式时,它帮我们做了一些处理,使我们在使用时可以避免一些错误。它没有空指针异常,没有数组下标越界,没有字符串拼接。

JSTL的全称是:JSP Standard Tag Libary。它是JSP中标准的标签库。它是由Apache实现的。

组成 作用 说明
Core 核心标签库。 通用逻辑处理
Fmt 国际化有关。 需要不同地域显示不同语言时使用
Functions EL函数 EL表达式可以使用的方法

要想使用JSTL标签库,在javaweb工程中需要导入坐标。首先是在工程的WEB-INF目录中创建一个lib目录,接下来把jstl的jar拷贝到lib目录中,最后在jar包上点击右键,然后选择【Add as Libary】添加。

JSTL核心标签库

常用标签:

标签名称 功能分类 分类 作用
流程控制 核心标签库 用于判断
,, 流程控制 核心标签库 用于多个条件判断
迭代操作 核心标签库 用于循环遍历

JSTL的使用

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
  <head>
    <title>JSTL的常用标签title>
  head>
  <body>
    <%-- c:if  c:choose   c:when c:otherwise --%>
    <% pageContext.setAttribute("score","F"); %>
    <c:if test="${pageScope.score eq 'A' }">
    	优秀
    c:if>
    <c:if	test="${pageScope.score eq 'C' }">
    	一般
    c:if>
    <hr/>
    <c:choose>
    	<c:when test="${pageScope.score eq 'A' }">
    		AAA
    	c:when>
    	<c:when test="${pageScope.score eq 'B' }">BBB
    	c:when>
    	<c:when test="${pageScope.score eq 'C' }">CCC
    	c:when>
    	<c:when test="${pageScope.score eq 'D' }">DDD
    	c:when>
    	<c:otherwise>其他c:otherwise>
    c:choose>
    
    <%-- c:forEach 它是用来遍历集合的
    	 属性:
    	 	items:要遍历的集合,它可以是EL表达式取出来的
    	 	var:把当前遍历的元素放入指定的page域中。 var的取值就是key,当前遍历的元素就是value
    	 		注意:它不能支持EL表达式,只能是字符串常量
    	 	begin:开始遍历的索引
    	 	end:结束遍历的索引
    	 	step:步长。i+=step
    	 	varStatus:它是一个计数器对象。里面有两个属性,一个是用于记录索引。一个是用于计数。
    	 			   索引是从0开始。计数是从1开始
    --%>
    <hr/>
    <% List<String> list = new ArrayList<String>();
       list.add("AAA");
       list.add("BBB");
       list.add("CCC");
       list.add("DDD");
       list.add("EEE");
       list.add("FFF");
       list.add("GGG");
       list.add("HHH");
       list.add("III");
       list.add("JJJ");
       list.add("KKK");
       list.add("LLL");
       pageContext.setAttribute("list",list);
     %>
	<c:forEach items="${list}" var="s" begin="1" end="7" step="2">
    	${s}<br/>
    c:forEach>
    <hr/>
    <c:forEach begin="1" end="9" var="num">
    	<a href="#">${num}a>
    c:forEach>
    <hr/>
    <table>
    	<tr>
    		<td>索引td>
    		<td>序号td>
    		<td>信息td>
    	tr>
    <c:forEach items="${list}" var="s" varStatus="vs">
    	<tr>
    		<td>${vs.index}td>
    		<td>${vs.count}td>
    		<td>${s}td>
    	tr>
    c:forEach>
    table>
  body>
html>

过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener。

它是在2000年发布的Servlet2.3规范中加入的一个接口。是Servlet规范中非常实用的技术。

它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作。

常见应用场景:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。

作用是在"请求"达到资源之前, 在响应到达浏览器之前, 做一些统一的操作
使用步骤:

  1. 定义一个类实现Tomcat提供的规则javax.servlet.Filter接口, 其中doFilter每次都会执行
  2. 在doFilter中编写统一的逻辑
  3. 不管是对和错需要放行或者跳转
  4. 放行方法filterChain.doFilter(req,resp);
  5. 配置的拦截路径分为:
  • 绝对路径匹配: “/servletDemo1”
  • 目录匹配:"/user/* "
  • 后缀名匹配:" * .jsp "
    6.配置filter分为:
  • 注解方式:@WebFilter(“拦截路径”)
  • 注解的顺序由类名的字符串表现形式来决定, 谁小谁先执行
  • xml方式:
  • 过滤器的顺序由filter-mapping配置的上下顺序决定, 谁在上面谁先执行
  <filter>
        <filter-name>名称filter-name>
        <filter-class>过滤器的全类名filter-class>
    filter>
    <filter-mapping>
        <filter-name>这个名称和上面保持一致filter-name>
        
        <url-pattern>拦截路径url-pattern>
    filter-mapping>

过滤器的生命周期:创建到销毁的过程
服务器启动时就会执行 init(); 方法
每次拦截都会执行 doFilter(); 方法
当服务器正常关闭或者项目被移除执行 destroy();方法
所以filter是一个单例!
很少为单个Filter去配置参数了 所以FilterConfig 就不常用了,它的使用和servletConfig用法相似!

观察者设计模式:它是事件驱动的一种体现形式。就好比在做什么事情的时候被人盯着。当对应做到某件事时,触发事件。

观察者模式通常由以下三部分组成:

​ 事件源:触发事件的对象。

​ 事件:触发的动作,里面封装了事件源。

​ 监听器:当事件源触发事件时,要做的事情。一般是一个接口,由使用者来实现。
Servlet规范中的8个监听器:

  • 监听域对象的创建和销毁
  • ServletContextListener: 监听ServletContext域对象的创建和销毁。1.定义一个类实现这个接口,2.重写必要的方法(初始化, 销毁),3.在"初始化"的时候做一些动作(读取全局参数,将这些读取到的参数放到域中来共享,可以减少磁盘IO).4.配置: 注解:@WebListener
    xml方式:
<listener>
     <listener-class>监听器的全类名listener-class>
listener>

以下监听器的使用和配置与全局参数类似.

  • HttpSerssionListener
  • ServletRequestListener
  • 监听域对象属性的变化
  • ServletContextAttributeListener
  • HttpSessionAttributeListener
  • ServletRequestAttributeListener
  • 监听Session中的活化和钝化,属性的变化
  • HttpSessionBindingListener
  • HttpSessionActivationListener

你可能感兴趣的:(网页编写,javaEE,java,servlet)