少年没有乌托邦,

心想远方自明郎

少年心怀乌托邦,

心向朝阳肆生长

JSP

我们这里只介绍JSP的基本使用,不会深入

使用JSP需要导入jsp.jarservlet-api.jar包,它们都在Tomcat安装目录/lib

基本介绍

jsp全称 Java Server Pages(Java 的服务器页面),是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

  • JSP 这门技术的最大的特点在于,写 JSP 就像在写 HTML
  • 相比 html 而言,html 只能为用户提供静态数据,而 JSP 技术允许在页面中嵌套 java 代码,为用户提供动态数据
  • 相比 Servlet 而言,Servlet 很难对数据进行排版,而 jsp 除了可以用 java 代码产 生动态数据的同时,也很容易对数据进行排版

提示:

jsp 页面不能像 HTML 页面, 直接用浏览器运行。只能通过浏览器访问 Tomcat 来访问。因为JSP运行在服务端

JSP运行原理

第一次访问jsp页面的时候。Tomcat 服务器会把 jsp 页面解析成为一个 java 源文件。并 且 对 它 进 行 编 译 成 为 .class 字 节 码 程 序 。

.class文件地址

Page指令

<%@ page contentType="text/html;charset=UTF-8" language="java" import="com.jl.MyServlet" pageEncoding="utf-8" %>
  • language 表示 jsp 翻译后是什么语言文件, 只支持 java
  • contentType 表示 jsp 返回的数据类型,对应源码中 response.setContentType()参数值
  • pageEncoding 属性 表示当前 jsp 页面文件本身的字符集
  • import 属性 跟 java 源代码中一样。用于导包,导类

JSP常用的三种脚本

声明脚本

<%! 声明java代码 %>

定义 jsp 的需要属性、方法、静态代码块和内部类等

<%@ page  %><%--
  Created by IntelliJ IDEA.
  User: jinglong
  Date: 2022/9/8
  Time: 9:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%!
    private Integer id;
    private String name = "老韩同学";
    private String job;
    private static String company;
    private Double sal;
    //静态代码块
    static{
    company = "字节跳动";
    }
    //声明方法
    public String getName() {
    return name;
    }
  %>
  </body>
</html>

表达式脚本

<%=表达式%>

在JSP页面上输出数据

注意:表达式脚本中的表达式不能以分号结束

<%@ page  %><%--
  Created by IntelliJ IDEA.
  User: jinglong
  Date: 2022/9/8
  Time: 9:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%!
    String name = "张三";
  %>
      用户名= <%=name%><br/>
      工作是: <%="java 工程师"%><br/>
  </body>
</html>

代码脚本

<% java 代码%>

可以在 jsp 页面中,使用Java语言编写我们需要的功能 代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据

<%@ page import="java.util.ArrayList" %>
<%@ page  %><%--
  Created by IntelliJ IDEA.
  User: jinglong
  Date: 2022/9/8
  Time: 9:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%!
    ArrayList<String> arrayList = new ArrayList();
  %>
  <%
    arrayList.add("123");
  %>
  </body>
</html>

JSP注释

  1. 第一种:

    <%--注释内容--%>
  2. 第二种:因为JSP可以使用java,所以java的注释也适用(针对java代码)

JSP内置对象

jsp内置了九大对象

对象 描述
request HttpServletRequest 接口的实例,请求实例
response HttpServletResponse 接口的实例,响应实例
out JspWriter类的实例,用于把结果输出至网页上
session HttpSession类的实例,会话对象
application ServletContext类的实例,与应用上下文有关
config ServletConfig类的实例,
pageContext PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问。是一个域对象,可以使用setAttribute(),作用范围是本页面
page 类似于Java类中的this关键字,就是当前JSP页面
Exception Exception类的对象,代表发生错误的JSP页面中对应的异常对象

因为是内置对象,所以不用创建,可以直接使用

JSP四大域对象

  1. pageContext(域对象,存放的数据只能在当前页面使用)

  1. request (域对象,存放的数据在一次 request 请求有效)

  • 请求转发可以。但重定向因为不是同一次请求,所以获取不到
  1. session(域对象,存放的数据在一次会话有效)

  1. application(域对象,存放的数据在整个 web 应用运行期间有效, 范围更大)
  1. 域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数 据的存储范围

  2. 从存储范围(作用域范围看) pageContext < request < session < application

JSP的请求转发标签

<jsp:forward page="转发路劲"></jsp:forward>
<%@ page  %><%--
  Created by IntelliJ IDEA.
  User: jinglong
  Date: 2022/9/8
  Time: 9:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <jsp:forward page="/test02"></jsp:forward>
  </body>
</html>

EL表达式

EL表达式全称:Expression Language(表达式语言)

作用

代替 jsp 页面的表达式脚本<%=java代码%>,以获取某个web域中的对象

基本使用

${key1}
  1. EL 表达式在输出 null 时,输出的是 ""
  2. jsp 表达式脚本输出 null 的时,输出的是 "null" 字符串
<%@ page import="com.jl.Person" %>
<%@ page  %><%--
  Created by IntelliJ IDEA.
  User: jinglong
  Date: 2022/9/8
  Time: 9:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%
    request.setAttribute("key","123");
    Person person = new Person();
    person.setName("666");
    request.setAttribute("person",person);
  %>
  ${key}
  ${person.name}
  </body>
</html>

EL的运算操作

  1. 关系运算符
关系运算符 说明 范 例 结果
== 或 eq 等于 $ { 5= = 5 }或${ 5 eq 5 } true
! =或 ne 不等于 \({ 5 != 5}或\){ 5 ne 5 } false
< 或 lt 小于 $ { 3 <5 }或${ 3 lt 5 } true
> 或 gt 大于 $ { 3 > 5}或${ 3 gt 5 } false
<= 或 le 小于等于 $ { 3 <=5}或${ 3 le 5 } true
>= 或 ge 大于等于 $ { 3 >= 5 }或${ 3 ge 5 } false
  1. 逻辑运算
逻辑运算符 说明 范例 结果
&& 或 and 与运算 $[12 == 12 &&12<11} 或 ${ 12 == 12 and 12<11} false
|| 或 or 或运算 ${ 12 == 12ll12<11} 或 ${12 == 12 or 12<11} true
! 或 not 取反运算 {!true} 或 ${not true } false
  1. 算数运算
算数运算符 说明 范例 心 结果
+ 加法 ${ 12 +18 } 30
- 减法 ${18 - 8 } 10
* 乘法 $12 * 12 } 144
/ 或 div 除法 ${144/ 12} 或 ${ 144 div 12 } 12
% 或 mod 取模 ${ 144 % 10 } 或 ${144 mod 10} 4

EL的empty运算

// 语法
${empty 值}
// 为空返回true,反之则为false

以下情况,结果为空:

  • 值为空串的时
  • 值是 Object 类型数组,长度为零
  • list 集合,元素个数为零
  • map 集合,元素个数为零

El的11个隐含对象

变量 类型 说明
pageContext PageContextlmpl 获取jsp中的九大内置对象
pageScope Map<String,Object> 获取 pageContext域中的数据
requestScope Map<String,Object> 获取 Request域中的数据
sessionScope Map<String,Object> 获取Session域中的数据
applicationScope Map<String,Object> 获取ServletContext域中的数据
param Map<String,String> 获取请求参数的值
paramValues Map<String,String> 获取多个值
header Map<String,String> 获取请求头的信息
headerValues Map<String,String> 获取请求头的多个信息
cookie Map<String,Cookie> 获取当前请求的 Cookie信息
initParam Map<String,String> 获取在web.xml中配置的上下文参数

这里要区分EL表达式中的pageContext和JSP内置的pageContext

EL表达式中的pageContext可以获取JSP内置的九大对象

JSP内置的pageContext就是一个域对象

EL获取四个特定域中的属性

变量 类型 说明
pageScope Map<String,Object> 获取pageContext域中的数据
requestScope Map<String,Object> 获取Request域中的数据
sessionScope Map<String,Object> 获取Session 域中的数据
applicationScope Map<String,Object> 获取 ServletContext域中的数据

JSTL标签库

JSTL标签库:JSP Standard Tag Library JSP 标准标签库

作用

JSTL 是为了替换代码脚本(<% java代码 %>)。这样 jsp 页面变得更佳简洁

组成

JSTL由五个标签库组成

功能范围 URI 前缀
核心标签库(重点) http://java.sun.com/isp/jstl/core c
格式化 http://java.sun.com/jsp/jstl/fmt fmt
函数 http://java.sun.com/jsp/jstl/functions fn
数据库(不使用) http://java.sun.com/jsp/jstl/sql sql
XML(不使用) http://java.sun.com/jsp/jstl/xml x

前提准备

使用JSTL前需要导入两个包:taglibs-standard-impl-x.x.x.jartaglibs-standard-spec-x.x.x.jar

基本使用

这里演示core核心库的使用

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page  %><%--
  Created by IntelliJ IDEA.
  User: jinglong
  Date: 2022/9/8
  Time: 9:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <c:set scope="request" var="User" value="666"/>
  </body>
</html>
  • <c:set>可以向域中保存数据
  • 等价 域对象.setAttribute(key,value);
  1. scope 属性设置保存到哪个域
  2. page 表示 PageContext 域(默认值)
  3. var 属性设置 key 的值
  4. value 属性设置值
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page  %><%--
  Created by IntelliJ IDEA.
  User: jinglong
  Date: 2022/9/8
  Time: 9:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <c:set scope="request" var="User" value="666"/>

    <c:if test="${ 10 > 2 }">
      <h1>10 > 2 为真</h1>
    </c:if>
  
  </body>
</html>
  • if 标签用来做 if 判断。
  1. test 属性表示判断的条件(用 EL 表达式输出)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page  %><%--
  Created by IntelliJ IDEA.
  User: jinglong
  Date: 2022/9/8
  Time: 9:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
      
      <c:set scope="request" var="money" value="1000"/>
      <c:choose>
        <c:when test="${money>=888}">
          余额充足
        </c:when>
        <c:when test="${money<888}">
          余额不足
        </c:when>
      </c:choose>
  
    </body>
</html>
  • switch...case...default很像
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page  %><%--
  Created by IntelliJ IDEA.
  User: jinglong
  Date: 2022/9/8
  Time: 9:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
      
    <h1>第1种遍历方式:普通循环</h1>
      <%--
      1.遍历 1 到 5,
      2. 输出 begin 属性设置开始的索引 end 属性设置结束的索引
      3. var 属性表示循环的变量(也是当前正在遍历到的数据)
      4. 等价 for (int i = 1; i <= 5; i++) {}
      5. 在默认情况下, i 每次会递增1。但也可设置步长step
      --%>
    <c:forEach begin="1" end="5" var="i">
      <li>排名=${i}</li>
    </c:forEach>


    <h1>第2种遍历方式:遍历数组</h1>
    <%
      request.setAttribute("sports", new String[]{"打篮球", "乒乓球"});
    %>
    <%--
        <c:forEach items="${ requestScope.sports }" var="item"/>
        1. items 遍历的集合/数组
        2. var 遍历到的数据
        3. 等价 for (Object item: arr) {}
    --%>
    <c:forEach items="${requestScope.sports}" var="sport">
      运动名称= ${sport}<br/>
    </c:forEach>


    <h1>第3种遍历方式:遍历Map</h1>
    <%
      Map<String, Object> map = new HashMap<>();
      map.put("key1", "北京");
      map.put("key2", "上海");
      map.put("key3", "天津");
      request.setAttribute("cities", map);
    %>
    <%--
        1. items 遍历的map集合
        2. var 遍历到的数据
        3. entry.key 取出key
        4. entry.value 取出值
    --%>
    <c:forEach items="${requestScope.cities}" var="city">
      城市信息: ${city.key}
              ${city.value}<br/>
    </c:forEach>


    <h1>第4种遍历方式:遍历List</h1>
    <%
      List<String> person = new ArrayList<>();
      person.add("张三");
      person.add("李四");
      request.setAttribute("person", person);
    %>
    <%--
        items 表示遍历的集合
        var 表示遍历到的数据
        begin 表示遍历的开始索引值 ,从0开始计算
        end 表示结束的索引值
        step 属性表示遍历的步长值
        varStatus 属性表示当前遍历到的数据的状态,可以得到step,begin,end等属性值
    --%>
    <c:forEach items="${requestScope.person}" var="person">
      ${person}
    </c:forEach>
  </body>
</html>

总结

JSP三大脚本:声明脚本、表达式脚本、代码脚本

JSP有九大内置对象

JSP有四大域对象

EL表达式是为了替代JSP的表达式脚本

EL拥有11个隐含对象

JSTL是为了替代JSP的代码脚本