JSP 简述与基础语法

目录

  • JSP
    • 1. 引入 JSP
    • 2. JSP 工作原理
    • 3. JSP 脚本和注释
      • a. 脚本
      • b. 注释
        • > 注释作用范围
    • 4. JSP 指令
      • a. page 指令
        • i. 异常处理页面
        • ii. 指令页面
      • b. include 指令(静态包含)
      • c. taglib 指令(动态包含)
        • i. 导入 Jar 包
        • ii. 通过 taglib 指令引入
    • 5. JSP 内置对象
      • a. JSP 常用内置对象
      • b. JSP 四大域的应用场景
    • 6. JSP 动作标签
      • a. 动态包含
      • b. 静态包含和动态包含区别
      • c. 请求转发 & 参数传递


JSP

  • 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。为了弥补 Servlet 的缺陷,Sun 公司在 Servlet 的基础上推出了 JSP(Java Server Pages)。
  • JSP 是简化 Servlet 编写的一种技术,它将 Java 代码和 HTML 语句混合在同一个文件中编写,页面动态资源使用 Java 代码,页面静态资源使用 HTML 标签。
  • 简单来说:可以在 HTML 标签中嵌套 Java 代码
  • 作用:简化书写,展示动态页面

1. 引入 JSP

  • 动态展示当前时间 demo.jsp:
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>${NAME}</title>
</head>
<body>
<%
    Date date = new Date();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
    String currentTime = simpleDateFormat.format(date);
%>
<h3><% out.write(currentTime);%></h3>
</body>
</html>
  • 访问 http://localhost:8080/webappPractice2/demo.jsp,页面显示当前时间。

2. JSP 工作原理

  • JSP 本质上是一个 Servlet。
    JSP 简述与基础语法_第1张图片

  • index_jsp.class 继承自 org.apache.jasper.runtime.HttpJspBase,而 HttpJspBase 则继承自 HttpServlet。

  • JSP 底层是由 out.write() 方法输出的:
    JSP 简述与基础语法_第2张图片

  • 内置对象 out 的类型是 JspWriter,JspWriter 相当于一个带缓存功能的 printWriter,它不是直接将数据输出到页面,而是将数据刷新到response的缓冲区后再输出。在 JSP 响应内容,使用 out,否则会出现后文中 Response 在页面之前输出内容的问题。详见:JSP 简介、
    Response.getWriter().write() 与 JSP 中 out.print() 有什么区别?

  • Tomcat 服务器动态加载 JSP 编译后的 .class 文件,通过 out.write 输出到浏览器端,浏览器端接收到的数据本质是 HTML + CSS + JavaScript。

3. JSP 脚本和注释

a. 脚本

  • JSP 通过脚本方式来定义 Java 代码。一共有 3 种方法:
  1. <% 代码 %>
    脚本片段,生成在 service 方法中,每次请求的时候都会执行。
  2. <%! 代码 %>
    声明片段,在 Java 代码中声明成员,放在 JSP 生成 Java 文件中的成员位置(可以用在全局中)。
  3. <%= 代码 %>
    输出脚本片段,相当于 out.print("代码") 方法,输出到 JSP 页面。注意不能分开 <%=

out.print()out.write() 的区别:

  • out.print() 支持一切类型输出;
  • out.write() 仅支持字符类型输出,如果传递的是整型,则会按 ASCII 码表转换成字符类型输出。

b. 注释

  • JSP 中一共支持 3 种注释方法:
  1. HTML 注释:
  2. JSP 特有的注释:
    <%-- 可以注释所有注释 --%>
  3. Java 注释(JSP 脚本内使用)
    // 单行
    /* 多行 */
    /**文档 */

> 注释作用范围

  • 安全性:JSP 注释最高,HTML 注释最低。
注释 JSP 源码 Java 源码 HTML 源码
HTML 可见 可见 可见
Java 可见 可见 不可见
JSP 可见 不可见 不可见

4. JSP 指令

  • 作用:用于配置 JSP 页面,导入资源文件。
  • 格式:<%@ 指令名称 属性名1="属性值1" 属性名2="属性值2" ... %>
  • 三大指令:
    1. page:配置 JSP 页面;
    2. include:页面包含(静态);
    3. taglib:导入资源文件。

a. page 指令

  • 设置格式<%@ page contentType="text/html;charset=UTF-8" language="java" %>
    • contentType 相当于 response.setContentType(); 设置响应体的 MIME 类型和编码方式;
    • language:目前仅支持 Java 语言。
  • import 导入 Jar 包<%@ page import="java.util.Date" %>
    • errorPage 当前页面报错后,跳转指定错误提示页面;
    • isErrorPage 声明当前 JSP 页面是一个异常处理页面,打开异常开关
      • false:(默认)
      • true:可以操作 Exception 异常对象

i. 异常处理页面

  • 相当于替代 HTTP Status 500 页面。
  • 500.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>500</title>
</head>
<body>
<h4>服务器繁忙,请稍后重试....</h4>
<%
    // 获取错误信息,发送开发人员,进行处理。。。
    out.print(exception.getMessage());
%>
</body>
</html>

ii. 指令页面

  • 1/0 导致了 Exception:
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="500.jsp" %>
<html>
<head>
    <title>demo2</title>
</head>
<body>
<h3>page指令</h3>
<%
    new Date();
    new SimpleDateFormat();
    Integer age = 1 / 0;
%>
</body>
</ht  ml>

b. include 指令(静态包含)

JSP 简述与基础语法_第3张图片

  • demo.jsp.java 包含头部信息,即合并输出了开发中的两个文件:top.jsp、demo.jsp。
  • top.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>top.jsptitle>
head>
<body>
<div style="border: skyblue dashed 5px;height: 100px">头部div>
body>
html>
  • 访问 http://localhost:8080/webappPractice2/top.jsp,页面显示:
    JSP 简述与基础语法_第4张图片
  • 调用 <%@include file=""%> 获得 top.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo3title>
head>
<body>
<%@include file="top.jsp"%>
<div style="border: red solid 5px;height: 400px">我是include静态包含,主体..div>
body>
html>
  • 访问 http://localhost:8080/webappPractice2/demo.jsp,页面显示:
    JSP 简述与基础语法_第5张图片

c. taglib 指令(动态包含)

  • 导入 Apache 提供的 JSTL 标准标签库的步骤:

i. 导入 Jar 包

JSP 简述与基础语法_第6张图片

  • CSDN 下载地址:https://download.csdn.net/download/Regino/12352801

ii. 通过 taglib 指令引入

  • JSP 文件首行添加:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  • URI(Uniform Resource Identifier, 通一资源标志符),表示的是 web 上每一种可用的资源,如 HTML 文档、图像、视频片段、程序等,这些资源都由一个 URI 进行定位的。
  • URL 是 URI 的一个子集。它是 Uniform Resource Locator 的缩写,译为 “统一资源定位符”。通俗地说,URL 是 Internet 上描述信息资源的字符串,主要用在各种 WWW 客户程序和服务器程序上。采用 URL 可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。 URL 是 URI 概念的一种实现方式。

5. JSP 内置对象

  • 作用:在 JSP 页面中不需要获取和创建,可以直接使用的对象。
  • JSP 中一共有 9 个内置对象:
变量名 真实类型 作用
pageContext PageContext 当前页面中共享数据(域对象)
request HttpServletRequest 一次请求中共享数据(域对象)
session HttpSession 一次会话中共享数据(域对象)
application ServletContext 整个 web 应用共享数据(域对象)
response HttpServletResponse 响应对象
page(相当于类中的 this) Object 当前页面(Servlet)对象
out JSPWriter 输出对象
config ServletConfig Servlet 配置对象
exception Throwable 异常对象(默认关闭,需要手动开启,与 isErrorPage类似)

a. JSP 常用内置对象

  1. pageContext
    (1)当前页面的域对象
    (2)获取其他 8 个内置对象
  2. request
    (1)接收用户请求(参数)
    (2)一次请求中域对象
  3. response
    (1)设置响应(包含字节流、字符流)
  4. out
    (1)专门在 JSP 中处理字符流:
    print(); // 可以输出一切类型
    write(); // 只能输出字符类型

b. JSP 四大域的应用场景

  • PageContext:这个域是在当前 JSP 页面上共享数据。这个域往往是用于 JSTL 标签库。
  • Request 域:一次请求内去共享数据。如果某个数据仅用于本次请求的时候即可使用 Request 域。 以后一般都是 Servlet 存储数据的时候使用,然后转发给 JSP。
  • Session 域:一次会话中共享数据,一般用于存储登陆者信息。
  • ServletContext:服务器启动的时候存在,服务器关闭的时候销毁。 一般没有使用该域的场景,因为该域共享数据的生命周期太长了,非常消耗内存。统计页面访问次数可用监听器。

6. JSP 动作标签

  • 作用:简化 JSP 页面编码。
  • 常用动作标签:
    • :动态页面包含(之前介绍的 <%@include file="top.jsp"%> 是静态页面包含)。
      相当于 request.getRequestDispatcher().include(request,response);
    • :请求转发(页面跳转)。
      相当于 request.getRequestDispatcher().forword(request,response);
    • :参数传递(forward 的子标签)
      使用 request.getAttribute() 获取 request 域的数据
      使用 request.getParameter() 获取参数(不常用)

a. 动态包含

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo6title>
head>
<body>
<jsp:include page="top.jsp">jsp:include>
<div style="border: green solid 5px;height: 400px">jsp的动态包含,主体div>
body>
html>

JSP 简述与基础语法_第7张图片

  • top.jsp、demo.jsp 分别输出为两个 Java 文件,编译后也互不关联,最后合并到 response 输出。

b. 静态包含和动态包含区别

  • 在开发中,推荐使用静态包含,以提升访问性能。
  • 注意:不能出现重名的变量。

c. 请求转发 & 参数传递

  • &
  • a.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>a</title>
</head>
<body>
<%
    System.out.println("a.jsp执行了");
    request.setAttribute("username", "request域存值了");
%>
<jsp:forward page="b.jsp">
    <jsp:param name="name" value="jack"></jsp:param>
    <jsp:param name="age" value="18"></jsp:param>
</jsp:forward>
</body>
</html>
  • b.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>b</title>
</head>
<body>
<%
    System.out.println("b.jsp执行了");

    // request域传递
    System.out.println(request.getAttribute("username"));

    // param标签传递
    System.out.println(request.getParameter("name"));
    System.out.println(request.getParameter("age"));
%>
</body>
</html>
  • 访问 http://localhost:8080/webappPractice2/a.jsp,页面显示:
    JSP 简述与基础语法_第8张图片
  • 控制台显示:
    JSP 简述与基础语法_第9张图片

原文链接:https://qwert.blog.csdn.net/article/details/105672636

你可能感兴趣的:(Java,Web)