JSP

Java Server Page

一个特殊的页面,等于HTML+java代码
运行在服务端,实际不是页面,Tomcat中有一个用于处理url-pattern为 *.jsp的请求,会找到对应的jsp文件,将jsp文件转换成servlet类,在这个servlet中处理数据,并完成数据和html的组装,最后返回给浏览器一个组装完成的静态HTML页面

用于简化书写

JSP脚本

  1. <% code %> : 最后会出现在Servlet的service方法中,service方法中能执行什么代码,这里就能写什么代码
  2. <%! code %> : 最后会出现在Servlet中的定义成员变量的位置
  3. <%= code %>:相当于输出语句,会将code中的表达式,输出到页面上

JSP内置对象(一共有9个)

变量名 真实类型 作用
pageContext PageContext 当前页面共享数据,可获取其他8个对象
request HttpServletRequest 一次请求的request
session HttpSession 一次会话的session
application ServletContext 当前web应用的上下文
response HttpServletResponse 一次请求的response
page Object(this) 当前Servlet对象
out JspWriter 输出流对象
exception Throwable 异常

out : 字符输出流,可以对页面进行输出。与response.getWriter()类似

  1. response.getWriter() 无论定义在什么地方,都会先于out输出,这是因为tomcat在输出时,会先找response的缓冲区,再去找jsp内置对象out的缓冲区。所以,response的缓冲区的数据,永远都会在out之前输出
  2. 所以在JSP页面中,尽可能用out,一致输出

JSP指令

<%@ 指令名称 属性1=值1 属性2=值2 ...%>

共有3种

  1. page : 用来配置JSP页面
    1. contentType:等同于response.setContentType
    2. import:导入java包
    3. errorPage:当前jsp执行java代码出现异常后,跳转到的页面
    4. isErrorPage:标识当前jsp页面是否是错误页面
      1. true:可以使用内置对象exception
      2. false:默认值,不可使用内置对象exception
  2. include:用来包含其他的jsp页面
  3. taglib:导入JSTL标签库等资源

EL表达式

  1. 定义:Expression Language 表达式语言

  2. 作用:替换和简化JSP页面中java代码的编写

  3. 语法:${EL表达式}

  4. 注意

    1. JSP默认支持EL表达式

    2. 若不想解析EL表达式,可以在JSP文件头加上

      <%@ page isELIgnored="true" %>
      

      这样整个页面的EL表达式都将被展示为字符串

      也可以在EL表达式之前加上反斜杠,忽略单个EL表达式

      \${4 > 3}
      
  5. EL表达式的使用

    1. 做运算

      1. 算数运算符:+ - * / mod

      2. 比较运算符: > < >= <= == !=

      3. 逻辑运算符: && || ! 或者 and or not

      4. 空运算符: empty

        空运算符,主要用于判断字符串,集合,数组是否为null,长度是否为0

        ${empty list} 判断域中的一个名为list的属性值为null或大小为0时,该表达式为true

        ${not empty list} 判断是否不为null,或长度>0

    2. 取值

      1. EL表达式只能从域对象中获取值(JSP的内置对象中,只有4个对象是域对象)

      2. 语法

        1. ${域名称.键名} 从指定的域对象中获取键值

          1. 域名称

            1. pageScope -> pageContext
            2. requestScope -> request
            3. sessionScope -> session
            4. applicationScope -> application
          2. 例子:在request域中存储了name=zhangsan

            ${requestScope.name} 则能拿到zhangsan。若EL表达式获取不到值,则表现为空字符串

        2. ${键名} : 默认会依次从范围最小的域对象中查找是否有该键对应的值,直到找到为止。

          若在不同域对象中存储的键名都不同,则可以简化书写,不必指定域名称

      3. 获取对象中的属性值

        ${域名称.键名.属性名} - > 本质上会调用对象的getter方法

        <%
        	User user = new User();
        	user.setName("yogurt");
        	user.setAge(23);
        	user.setBirthday(new Date());
        	request.setAttribute("user",user);
        %>
        
        <h3>
            获取对象中的属性值
            <!-- 同归对象的属性来获取
        	getter方法,去掉get,将剩余部分首字母变小写,就可以,类似于BeanUtils对类设置属性时的机制,它找的是set/get方法
        	-->
        </h3>
        ${user.name}
        ${user.age}
        
      4. 获取List中的值

        ${域名称.键名[索引]}

      5. 获取Map中的值

        ${域名称.键名.key名称}

        ${域名称.键名.["key名称"]}

    3. EL表达式的隐式对象

      共11个,类似于JSP的内置对象,学习1个就可以了

      1. pageContext

        类似于JSP的pageContext,可以直接获取JSP的其他8个对象

        ${pageContext.request.contextPath} 可以获取到项目的虚拟目录。动态获取虚拟目录。

        要记得,重定向是让客户端重新发起一次请求,故要添加虚拟目录。而转发是在服务端进行的,已经在项目的上下文中,其当前目录已经是虚拟目录了,故不需要设置虚拟目录

JSTL

  1. 概念:JavaServer Page Tag Library JSP标准标签库

    • 是由apache组织提供的开源免费的jsp标签
  2. 作用:用于简化和替换jsp页面上的java代码

  3. 使用步骤:

    1. 导入JSTL相关jar包

    2. 引入标签库:用taglib指令

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

  4. 常用的JSTL标签

    1. if:相当于java的if语句

      属性:

      • test:必填属性,接收boolean表达式(一般结合EL表达式)

        若表达式为true,显示标签体内的内容

        <c:if test="${not empty list}">
            开始遍历...
        </c:if>
        

        注意if标签没有对应else,若要实现else,则需要再写一个if

    2. choose:相当于java的switch语句

      choose

      when

      otherwise

    3. foreach:相当于java的for循环

      属性

      • begin 开始值
      • end 结束值
      • var 临时变量
      • step 步长
      • varStatus 状态,可以获取当前迭代的位置