jsp复习笔记、jstl标签、el表达式

jsp (java server page)

什么是jsp?

  • sun公司制定的一种服务器端动态页面技术规范;

因为虽然使用servlet也可以生成动态页面,但是过于繁琐
(需要使用out.println)并且难以维护(修改页面就需要就该java代码),所以制定了jsp.

  • jsp本质就是一个Servlet;

jsp是以”.jsp”为后缀的文件,该文件被容器转换成一个对应的Servlet然后执行。

如何写jsp?

  • step1.添加一个.jsp后缀文件

  • step2.在文件里面可以添加如下内容:

    • 1、html(css、javascript):直接写;

    • 2、java代码:

      • java代码片段:<% java代码 %>
      • jsp表达式:<%= java表达式 %>
      • jsp声明:<%! 声明一些新的属性或者方法 %>
    • 3、隐含对象:直接使用

      • 隐含对象:在jsp可以直接使用的对象(共9个)
        1. 输入输出对象:out、request、response;
        2. 作用域通信对象:session、application、pageContext;
          • pageContext:容器会为每一个jsp实例创建唯一符合PageContext接口的对象,称为page上下文;
          • 唯一性:一个jsp实例对应一个page上下文;
          • 持久性:jsp实例存在,page上下文就存在。
          • pageContext作用:
            1. 绑定数据;(a6/a7.jsp)

              绑定到page上下文上的数据,只有对应的jsp能访问;

            2. 能通过该对象,找到其他所有对象
        3. servlet对象:config、page(从来不用)
          • config:jsp也可以当作servlet来配置;(a5.jsp)
        4. 异常对象:exception(只当isErrorPage指令为true时使用)
      • 能直接使用原因:容器将jsp转译成servlet时会自动添加获得这些隐含对象的代码;
    • 4、指令

      • 指令:通知容器在将jsp转换成servlet时,做一些额外操作,如导包;
      • 语法:<%@ 指令名 属性=值 %>
      1. page指令:

        • import属性:导包;
          <%@ page import=“java.util.*”%>

          注意:多个包之间用逗号隔开

        • ContentType属性:设置响应字符集;
          <%@ page contentType=“text/html;charset=utf-8”%>

          注意:多个属性间用空格隔开

        • pageEncoding属性:设置容器读取jsp文件时的编码字符集。
          <%@ page pageEncoding=“utf-8”%>
        • session属性:缺省值为true,如果是false表示session隐含对象不可用。
          <%@ page session=“false”%>
        • errorPage属性:指定一个异常处理界面;
          当jsp运行发生异常时,容器调用指定异常处理界面。
          <%@ page errorPage=“a4.jsp”%>
        • isErrorPage属性:缺省值false,如果值为true,则可以使用exception隐含对象。

        例题参见Servlet_day04

      2. include指令:

        • 作用:告诉容器,将jsp转换成Servlet时,将某个文件的内容插入到该指令所在位置。
          <%@ include file=“路径”%>
      3. taglib指令:

        • 导入jsp标签,替换jsp当中的java代码;
          标签体
    • 5、注释

        • 如果注释内容是java代码,java代码会执行;
      1. <%—注释的内容—%>
        • 如果注释内容是java代码,java代码不会执行;

jsp如何运行?

  • step1.容器要将jsp读取(期间要解码)并转译成servlet;
    在这里插入图片描述

    • html(css、js)—>service方法里面使用out.write()输出;
    • <% java代码 %> —>service方法里面照搬不动;
    • <%= java表达式 %> —>service() 里面用out.println()输出
    • <%! 声明一些新的属性或者方法 %>—->在转译后servlet中添加新的属性和方法

      out.write()会将null转换成 “ “(空子符串)输出;
      out.println()会将null直接输出。

  • step2.容器调用该servlet.

jsp标签(jstl)和el表达式 (案例:servlet_jsp)

(1)jsp标签是什么?

  • jsp标签是sun公司制定的一种用来代替jsp中java代码的技术,语法类似html(含有开始结束标记和属性等)。

(2)制定原因

  • 因为直接在jsp中写java代码,不利于jsp文件的维护,所以sun公司制定了jsp标签技术规范。
  • 好处:使jsp文件更简洁,方便维护,也可以实现代码重用;

(3)el表达式是什么?

  • 是一套简单的运算规则,用来给jsp标签的属性赋值,也可以用来直接输出。

注:el表达式也可以脱离jsp标签直接使用。

javaBean

  • 指的是一个公共的类,含有一个空参构造器和一些属性及访问这些属性的get/set方法且实现Serializable接口。

el表达式的作用

(1)读取javaBean属性

  1. 方式一:${对象绑定名.方法名去掉get,然后剩下全部的变小写}
    ${user.username}

  2. 方式二:${对象绑定名.[“方法名去掉get,然后剩下全部的变小写”]
    []里面可以使用绑定名(request.setAttribute(“s1”,“username”));
    u s e r . u s e r n m a e 等 价 于 {user.usernmae} 等价于 user.usernmae{user.[‘username’]}和${user[s1]}
    []里面可以使用从0开始的下标,用于访问数组中某个元素。
    ${arr.[0]}

  3. el表达式从作用域对象查找数据原则:

    • 获取数据顺序:pageContext–>request–>session–>application–>不显示
  4. el表达式获取数据(指定查找范围)原则:

    • ${xxxScope.方法名去掉get,然后剩下全部的变小写}//xxxScope可省,但不要省
      ${requestScope.user.username}
    • 顺序:pageScope–>requestScope–>sessionScope–>applicationScope
  5. 优点:

    • 相比较直接插入java代码。更简洁;
    • 会将null转换成""输出,不会报空指针异常。

(2)简单运算

  1. 算术运算:+、-、*、/、%

    注意:+ 只能求和,不能连接字符串。

  2. 关系运算:>、>=、<、<=、==、!=
  3. 逻辑运算:&&、||、!
  4. empty运算:empty

(3)读取请求参数

  • ${param.name} 等价于 request.getParameter(“name”);
  • ${paramValues.interest} 等价于 request.getParameterValues(“name”);

jstl (java standard tag library)

(1)什么是jstl?

  • java标准标签库,由apache开发,sun公司定义的一套标准。

(2)如何使用?

  1. 在官网下载jstl开发包,jstlxx.xx.jar,然后把jar包拷到WEB-INF/lib下。
  2. 使用taglib指令引入jsp标签
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
    url属性:指定标签命名空间;
    prefix属性:设置命名空间的别名。
    命名空间:为了区分同名元素在元素前添加的一个限定,通常是一个域名。

(3)标签

  1. 核心标签: core 简称c 常用的标签
    • if标签:
      <c:if test="" var="" scope="">
      标签体
      </c:if>
    1. test属性为true,容器会执行标签体内容;
    2. test属性可以使用el表达式来赋值;
    3. var属性用来指定绑定名;
    4. scope属性指定绑定范围。

在这里插入图片描述

  • choose标签:
    <c:choose>
    <c:when test="">
    标签体
    </c:when>
    <c:otherwise>
    标签体
    </c:otherwise>
    </c:choose>

    1. when属性可以出现一次或多次,test为"true"时,执行标签体;
    2. otherwise可以出现0次或1次,用来处理例外;
    3. 该标签类似多层if嵌套。
  • forEach标签:
    <c:forEach item="" var="" varStatus="">
    标签体
    </c:forEach>
    - item属性用来指定要遍历的集合或者数组,一般用el表达式赋值;
    - var:指绑定的一个名称;

    该标签每一次从集合或数组中取一个元素,将其绑定到pageContext上,var属性用来指定绑定名。
    - varStatus:指定一个绑定名;
    绑定范围是pageContext,绑定值是一个对象,该对象提供了方法,用于获取当前遍历状态;
    getIndex( ):获得当前正在被遍历元素的下标(从0开始);
    getCount( ):获得当前正在被遍历元素的序号(从1开始);

  1. 格式化标签:format 简称fmt 用来对数据做格式化,数字的小数保留位数
  2. sql标签: sql 简称s 用来对数据库进行增删改查的标签

(4)标签执行流程

  • 容器依据命名空间找到标签的描述文件(.tld),然后依据标签名称找到对应的标签类,然后将标签类实例化并执行该实例的相应方法。

自定义标签

(1)编程步骤

  1. 写一个java类,继承SimpleTagSupport类(简单标签支持类);

    注意:jsp标签有两种:复杂标签技术类、简单标签技术类。

  2. 重写daTag方法,在该方法里面,编写相应的处理逻辑;
  3. 标签有哪些属性,标签类也要有对应属性(属性名要相同,类型要匹配,并且提供对应set方法)
  4. 在标签描述文件当中,描述该标签

(2)标签执行过程

  1. 容器依据标签的命名空间找到标签的描述文件(.tld文件);
  2. 容器依据标签的名称找到标签类(及知道标签类的类名),然后会将该标签类实例化。
  3. 如果标签有属性,则容器会调用对应的set方法给这些属性赋值(即将xx的属性赋值给标签对象)
  4. 最后容器调用标签类的doTag()方法。

Guess you like

Origin blog.csdn.net/publicman_/article/details/114918452