.Net转Java自学之路—基础巩固篇二十九(EL、JSTL)

时间:2022-12-13 19:52:44

EL:

   EL是JSP内置的表达式语言。Java 2.0开始,不让再使用Java脚本。而是使用EL表达式和动态标签来代替Java脚本。EL代替的是<%= ... %>,也就是说,EL只能做输出。

  EL表达式来读取四大域:

    ${xxx}:全域查找名为xxx的属性,若不存在,输出空字符串,而不是null。

      查找优先级:pageContext、request、session、application。

    ${pageScope.xxx }、${requestScope.xxx }、${sessionScope.xxx}、${applicationScope.xxx}:指定域查找。

  EL十一个内置对象:

    十一个内置对象,其中10个是Map类型,pageContext不是Map,它就是PageContext类型

    1、pageScope

    2、requestScope

    3、sessionScope

    4、applicationScope

    5、param:对应参数。是Map类型,其中key对应参数名,value对应单个参数值。适用于单值的参数。

    6、paramValues:对应参数。是Map类型,其中key对应参数名,value对应多个参数值。适用于多值的参数。

    7、header:对应请求头。适用于单值的请求头。

    8、headerValues:对应请求头。适用于多值的请求头。

    9、initParam:获取<context-param>内的参数。

    10、cookie:是Map<String,Cookie>类型,其中key是cookie的name,value是cookie对象。取值:${cookie.xxx.name}、${cookie.xxx.value}

    11、pageContext:是PageContext类型。${pagecontext.request.contextPath}项目名。

  EL函数库:

    由JSTL提供。使用EL函数库需要导入标签库。

    <% taglib prefix="fn" uri="" %>

  EL自定义函数库:

    自定义一个Java类,类中可以定义0~N个静态方法,并且有返回值。

    在WEB-INF目录下创建一个tld文件,并录入:

<function>
    <name>fun</name>
    <function-class></function-class>
    <function-signature></function-signature>
</function>

    在JSP页面中导入标签库<%@taglib prefix="fn" uri="/WEB-INF/tlds/xxx.tld"%>;在JSP页面中使用自定义的函数。 

JSTL:

  JSTL是标签语言;是apache对EL表达式的扩展。依赖与EL。

  JSTL四大标签库:

    core:核心标签库

    fmt:格式化标签库

    sql:数据库标签库。已过时

    xml:xml标签库。已过时

  core:又称c标签。

    out和set:

      <c:out>:输出

        <c:out value="输出的值" />

        <c:out value="${xxx}" default="默认输出值" />:当xxx不存在时,输出default的值。

      <c:set>:设置;初建域的属性

        <c:set var="变量名" value="变量值,可以是EL表达式" scope="域" />

    remove:

      <c:remove>:删除域变量

        <c:remove var="变量名" scope="域" />:若不给出scope,则删除所有域的该名称的变量。若指定,则只删除该域的变量。

    url:

      <c:url value="路径" />:指定一个路径,它会在路径前自动添加项目名。

      子标签:<c:param>:用来给url后添加参数。

      例:

        <c:url value="路径">

          <c:param name="x" value="X" />

        </c:url>

      <c:url value="路径" var="变量名" scope="域" />

      var:指定变量名,添加该属性后,那么url标签就不会再输出该页面,而是把生成url保存到域中。

      scope:它与var一起使用,用来保存url。

    if:

      <c:if>:对应if语句

        <c:if test="布尔类型">

          ...

        </c:if>

        当test的值为true时,指定标签体内容。

    choose:

      <c:choose>:对应if/else if/....../else语句。

        <c:choose>

          <c:when test="布尔类型"></c:when>

          <c:when test="布尔类型"></c:when>
          ...
          <c:otherwise></c:otherwise>

        <c:choose>

    forEach:

      <c:forEach>:循环

      例:

        <c:forEach var="i" begin="1" end="10" step="2">

          ${i}

        </c:forEach>

        <c:forEach items="" var="str">

          ${str}

        </c:forEach>

      var:循环变量

      begin:设置循环变量开始值

      end:设置循环变量结束值

      step:设置步长;默认1。等同于循环中的i++/i+=2

      items:指定要遍历的值

      循环状态:

        可以使用varStatus来创建循环状态变量;循环状态变量由一下属性:

        count:元素个数。index:下标。first:第一个元素。last:最后一个元素。current:当前元素。

  fmt:格式化库

    <fmt:formatDate>:格式化输出。通常需要格式化的由时间、数字。

    <fmt:formatDate value="${date}" partten="yyyy-MM-dd HH:mm:ss">

  自定义标签:

    步骤:

      1、标签处理类:标签也是一个对象,那么就需要先由类。

      2、tld文件,它时一个xml。

      3、页面中使用<%@taglib%>来指定tld文件的位置

    标签处理类:

      SimpleTag接口下的方法:

        doTag();每次指定标签时都会调用这个方法。

        JspTag getParent();返回父标签;非生命周期方法。

        setParent(JspTag);设置父标签

        setJspBody(JspFragment);设置标签体

        setJspContext(JspContext);设置JSP上下文对象,JspContext有个子类PageContext

        其中doTag()会在其他三个setXXX()方法后被tomcat调用。

    配置tld文件:

      tld文件一般都放到web-INF之下,这样保证客户端访问不到。

<tag>
    <name></name>  <!--指定当前标签的名称-->
    <tag-class></tag-class>  <!--指定当前标签的标签处理类-->
    <body-content>empty</body-content>  <!--指定标签体的类型,empty:空-->
</tag>

    页面中指定tld文件位置:<%@taglib prefix="" uri="/WEB-INF/tlds/xxx.tld"%>

    标签体内容:

      empty:无标签体

      JSP:jsp 2.0已经不再支持这个类型,表示标签体内容可以是:Java脚本、标签、EL表达式。

      scriptless:只能是EL表达式,也可以是其他的标签。

      tagdependent:标签体内容不会被执行,而是直接赋值标签处理类。

    不再执行标签下面内容的标签:

      在标签处理类中的doTag()中使用SkipPageException来结束。

      tomcat会调用标签处理类的doTag(),然后tomcat会得到SkipPageException,就会跳过本页面的其他内容。

    带有属性的自定义标签:

      步骤:

        1、给自定义标签处理类添加属性

          为标签处理类添加属性,属性至少要有一个set方法。这个set方法会在doTag()之前被tomcat调用执行;所以在doTag()中可以使用属性。

        2、在tld文件中对属性进行配置

          配置方法:

<attribute>
    <name></name>  <!--指定属性名-->
    <required></required>  <!--指定属性是否为必填项-->
    <rtexprvalue></rtexprvalue>  <!--指定属性是否可以使用EL表达式-->
</attribute>