javaweb_笔记3(jsp指令,el表达式,标签库,过滤器和监听器)

1.JSP的指令

  • 指令的作用:指导JSP的翻译引擎如何工作(指导当前的JSP翻译引擎如何翻译JSP文件。)

指令包括哪些呢?

  • include指令:包含指令,在JSP中完成静态包含,很少用了。

  • taglib指令:标签库指令,是jsp的一套外部标签(foreach,if等等)

  • page指令:设置jsp的一些属性,编码,格式等等

 关于page指令当中都有哪些常用的属性呢?

1.<%@page session="true|false" %>
<%@page session=true%>代表启动session,默认启用, jsp本身就是一个servlet,会自己创建session在内的九大对象。设置为false的时候不能使用session

2.<%@page contentType="text/json" %>
用来设置格式,也可以同时设置字符集
<%@page contentType="text/json;charset=UTF-8" %>

3.<%@page pageEncoding="UTF-8" %>
用于专门的设置字符集

4.<%@page import="java.util.List, java.util.Date, java.util.ArrayList" %>
<%@page import="java.util.*" %>
import语句,导包。 

5.<%@page errorPage="/error.jsp" %>
用于设置本jsp页面出错之后跳转到的页面

6.<%@page isErrorPage="true" %>
表示启用JSP九大内置对象之一:exception,默认不启动,启动之后可以使用该对象在jsp页面抛出异常。

7.<%@ page isELIgnored="true" %>用于忽略el表达式

 JSP的九大内置对象

四个域:从小到大

  • jakarta.servlet.jsp.PageContext pageContext 页面作用域

  • jakarta.servlet.http.HttpServletRequest request 请求作用域

  • jakarta.servlet.http.HttpSession session 会话作用域

  • jakarta.servlet.ServletContext application 应用作用域

两个输出流

  • jakarta.servlet.jsp.JspWriter out (负责输出)

  • jakarta.servlet.http.HttpServletResponse response (负责响应)

三个其他

  • java.lang.Throwable exception

  • jakarta.servlet.ServletConfig config

  • java.lang.Object page (其实是this,当前的servlet对象)

2.EL表达式

从某个作用域中取数据,然后将其转换成字符串,然后将其输出到浏览器。这就是EL表达式的功效。三大功效:

第一功效:从某个域中取数据。

第二功效:将取出的数据转成字符串。

第三功效:将字符串输出到浏览器。

使用方法

request.setAttribute("userObj", user);存放一个对象

 ${userObj}
等同于java代码:<%=request.getAttribute("userObj")%>

${"userObj"}会直接输出userobj这个字符串

${userObj.username} 使用这个语法的前提是:User对象有getUsername()方法。

只要有get方法就可以使用,哪怕没有这个字段。一个点表示调用这个对象的get方法。

el表达式有四个域,不标明的时候优先从小范围中读取数据。

  • pageContext < request < session < application

EL表达式中有四个隐含的隐式的范围:

  • pageScope 对应的是 pageContext范围。

  • requestScope 对应的是 request范围。

  • sessionScope 对应的是 session范围。

  • applicationScope 对应的是 application范围。

EL表达式对null进行了预处理。如果是null,则向浏览器输出一个空字符串。(看不见)  

request.setAttribute("abc.def", "zhangsan");

${requestScope.abc.def} 这样是无法取值的。

应该这样:${requestScope["abc.def"]}

EL表达式,怎么从Map集合,数组和List集合中取数据  

  • ${map.key}

  • ${数组[0]}                  指的是String数组

  • ${数组[1]}

  • ${list[0]}                     ArryList

 通过EL表达式获取应用的根和隐式对象

 ${pageContext.request.contextPath}

等同于代码<% pageContext.getRequest().getContextPath()%>

因为jsp的隐式对象中没有request,所以需要用pageContext来调用getrequest方法,然后在调用request对象本身有的getContextPath()方法来获取根路径

  • EL表达式中其他的隐式对象:

pageContext  获取根路径, ${pageContext.request.contextPath}

param  直接获取传递到jsp页面的值,就是request.getParameter(“username”)

${param.username}

paramValues,等价于request.getParameterValues()

initParam,获取配置信息this.getServletContext().getInitParameter(),直接获取配置信息

${initParam.name}

EL表达式的运算符

  • 算术运算符

    • +、-、*、/、%       只能运算数字,字符串会强转数字,abc之类的出错

  • 关系运算符

    • == eq != > >= < <=    底层调用equals方法
  • 逻辑运算符

    • ! && || not and or
  • 条件运算符

    • ? :
  • 取值运算符

    • [ ]和.

  • empty运算符

    • empty运算符的结果是boolean类型
    • ${empty param.username}
    • ${not empty param.username}
    • ${!empty param.password}

 3.JSTL标签库

在WEB-INF下新建lib目录,然后将jar包拷贝到lib当中。然后将其“Add Lib...”

然后在页面中<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

就可以直接使用了

JSTL标签的原理

 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
以上uri后面的路径实际上指向了一个xxx.tld文件。
tld文件实际上是一个xml配置文件。
在tld文件中描述了“标签”和“java类”之间的关系。
以上核心标签库对应的tld文件是:c.tld文件。它在哪里。
在jakarta.servlet.jsp.jstl-2.0.0.jar里面META-INF目录下,有一个c.tld文件。

<tag>
    <description>对该标签的描述</description>
    <name>catch</name> 标签的名字
    <tag-class>org.apache.taglibs.standard.tag.common.core.CatchTag</tag-class> 标签对应的java类。
    <body-content>JSP</body-content> 标签体当中可以出现的内容,如果是JSP,就表示标签体中可以出现符合JSP所有语法的代码。例如EL表达式。
    <attribute>
        <description>
        	对这个属性的描述
        </description>
        <name>var</name> 属性名
        <required>false</required> false表示该属性不是必须的。true表示该属性是必须的。
        <rtexprvalue>false</rtexprvalue> 这个描述说明了该属性是否支持EL表达式。false表示不支持。true表示支持EL表达式。
    </attribute>
  </tag>

<c:catch var="">
	JSP....
</c:catch>

 几种常见的用法

<table>


    <c:if test="${not empty list}">
      <c:forEach items="${list}" var="user" varStatus="a">
        <tr><td>
       ${a.count}:姓名:${user.name} //带序号的数据
       ${a.count}:性别:${user.sex}
       ${a.count}:学号:${user.sno}
        </td></tr>
      </c:forEach>
      <c:forEach var="i" begin="1" end="10" step="1">
        <tr><td>
        输出:${i}</td></tr>//数字循环
      </c:forEach>
    </c:if>
    <tr><td>
      <c:choose>//if,else用法
      <c:when test="${param.i<10}">
        10
      </c:when><c:when test="${param.i<20}">
        20
      </c:when><c:when test="${param.i<30}">
        30
      </c:when><c:when test="${param.i<40}">
        40
      </c:when>
      </c:choose>
    </td></tr>
    <tr><td><a href="student/student.jsp">111111</a></td></tr>
  </table>

Filter过滤器

  • Filter是过滤器。

  • Filter可以在Servlet这个目标程序执行之前添加代码。也可以在目标Servlet执行之后添加代码。之前之后都可以添加过滤规则。

  • 一般情况下,都是在过滤器当中编写公共代码。

 用法

  • 第一步:编写一个Java类实现一个接口:jarkata.servlet.Filter。并且实现这个接口当中所有的方法。

    • init方法:在Filter对象第一次被创建之后调用,并且只调用一次。

    • doFilter方法:只要用户发送一次请求,则执行一次。发送N次请求,则执行N次。在这个方法中编写过滤规则。

    • destroy方法:在Filter对象被释放/销毁之前调用,并且只调用一次。

 第二步:在web.xml文件中对Filter进行配置。这个配置和Servlet很像。(@WebFilter({"*.do"})

可以使用web配置,也可以使用注解配置,web的配置和servlet很像,是filter和filtermapper

  • Servlet对象默认情况下,在服务器启动的时候是不会新建对象的。

  • Filter对象默认情况下,在服务器启动的时候会新建对象。

 执行顺序

  • 在web.xml文件中进行配置的时候,Filter的执行顺序是什么?

    • 依靠filter-mapping标签的配置位置,越靠上优先级越高。

  • 过滤器的调用顺序,遵循栈数据结构。

  • 使用@WebFilter的时候,Filter的执行顺序是怎样的呢?

    • 执行顺序是:比较Filter这个类名。

    • 比如:FilterA和FilterB,则先执行FilterA。

    • 比如:Filter1和Filter2,则先执行Filter1.

实例 

//过滤器过滤路径的时候是过滤的跳转页面,也就是浏览器上可以访问的路径。不能使用servlet的路径。但是拦截的时候
//不被容许的servlet最后的跳转路径被拦截的时候里面的代码也不会执行
@WebFilter("/*")
public class File implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request1= (HttpServletRequest) request;
        String path=request1.getServletPath();
        String pass= (String) request1.getSession().getAttribute("pass");
        System.out.println("开始执行");
        if ("/index.jsp".equals(path)||"pass".equals(pass)){
            chain.doFilter(request,response);
            System.out.println("请求路径是:" + path);
        }else {
            System.out.println("拦截了"+path);
        }
        System.out.println("执行结束");
    }

    @Override
    public void destroy() {

    }
}

Listener监听器

  • 什么是监听器?

    • 监听器是Servlet规范中的一员。就像Filter一样。Filter也是Servlet规范中的一员。

    • 在Servlet中,所有的监听器接口都是以“Listener”结尾。

  • 监听器有什么用?

    • 监听器实际上是Servlet规范留给我们javaweb程序员的特殊时机。

    • 特殊的时刻如果想执行这段代码,你需要想到使用对应的监听器。

  • Servlet规范中提供了哪些监听器?

    • jakarta.servlet包下:

      • ServletContextListener用于监听ServletContext对象的创建和销毁

      • ServletContextAttributeListener用于监听ServletContext域的添加修改删除

      • ServletRequestListener用于监听Request对象的创建和销毁

      • ServletRequestAttributeListener用于监听Request域的添加修改删除

    • jakarta.servlet.http包下:

      • HttpSessionListener用于监听session对象的创建和销毁

      • HttpSessionAttributeListener

        • 该监听器需要使用@WebListener注解进行标注。

        • 该监听器监听的是什么?是session域中数据的变化。只要数据变化,则执行相应的方法。主要监测点在session域对象上。

      • HttpSessionBindingListener

        • 该监听器不需要使用@WebListener进行标注。

        • 假设User类实现了该监听器,那么User对象在被放入session的时候触发bind事件,User对象从session中删除的时候,触发unbind事件。

        • 假设Customer类没有实现该监听器,那么Customer对象放入session或者从session删除的时候,不会触发bind和unbind事件。

      • HttpSessionIdListener

        • session的id发生改变的时候,监听器中的唯一一个方法就会被调用。

      • HttpSessionActivationListener

        • 监听session对象的钝化和活化的。

        • 钝化:session对象从内存存储到硬盘文件。

        • 活化:从硬盘文件把session恢复到内存。

  • 实现一个监听器的步骤:以ServletContextListener为例。

    • 第一步:编写一个类实现ServletContextListener接口。并且实现里面的方法。

      • void contextInitialized(ServletContextEvent event)
        void contextDestroyed(ServletContextEvent event)
    • 第二步:在web.xml文件中对ServletContextListener进行配置,如下:

      • <listener>
            <listener-class>com.bjpowernode.javaweb.listener.MyServletContextListener</listener-class>
        </listener>
      • 当然,第二步也可以不使用配置文件,也可以用注解,例如:@WebListener

  • 注意:所有监听器中的方法都是不需要javaweb程序员调用的,由服务器来负责调用?什么时候被调用呢?

    • 当某个特殊的事件发生(特殊的事件发生其实就是某个时机到了。)之后,被web服务器自动调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值