🎄欢迎来到@边境矢梦°的csdn博文,本文主要讲解Java web中渲染技术 Jsp 的相关知识🎄
🌈我是边境矢梦°,一个正在为秋招和算法竞赛做准备的学生🌈
🎆喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路🎆
Ps: 月亮越亮说明知识点越重要 (重要性或者难度越大)🌑🌒🌓🌔🌕
目录
🌒一. 问题引出
🌒 二. 基本介绍
🌕三. 运行原理
🌓四. page指令
🌔五. jsp的三种常用脚本
🌓六. jsp注释
🌔七. jsp内置对象
🌔八. jsp域对象
🌓九. jsp请求转发标签
🌓十. EL表达式
🌓十一. JSTL
一. 问题引出
由于HTML只能将静态内容输出, 由浏览器来解析打印, 但是如果页面里面的数据不是静态的是动态的, 那么我们就需要把代码写在servlet里面, 写在servlet里面代码很麻烦
html
servlet
引出jsp
jsp=html+java 片段+标签+javascript+css
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello, jsp</title>
</head>
<body>
<h1>JSP, 计算器</h1>
<%
int i = 20;
int j = 70;
int res = i + j;
out.println(i + " + " + j + " = " + res);
%>
</body>
</html>
二. 基本介绍
- JSP 全称是 Java Server Pages,Java 的服务器页面
- JSP 这门技术的最大的特点在于,写 JSP 就像在写 HTML
- 相比 html 而言,html 只能为用户提供静态数据,而 JSP 技术允许在页面中嵌套 java 代码, 为用户提供动态数据
- 相比 Servlet 而言,Servlet 很难对数据进行排版,而 jsp 除了可以用 java 代码产生动态数据的同时,也很容易对数据进行排版。
- jsp 技术基于 Servlet, 你可以理解成 JSP 就是对 Servlet 的包装.
- 会使用 JSP 的程序员, 再使用 thymeleaf 是非常容易的事情, 几乎是无缝接轨.
三. 运行原理
-
客户端发送请求:用户在浏览器中输入 URL 或点击链接,向服务器发送 HTTP 请求。
-
服务器接收请求:Web 服务器(如 Apache Tomcat)接收到 HTTP 请求。
-
JSP 编译:服务器将 JSP 文件传递给 JSP 引擎进行处理。JSP 引擎将 JSP 文件编译为 Servlet (Java文件)。
-
Servlet 运行:生成的 Servlet 代码通过 Java 编译器进行编译,生成字节码文件。
-
Servlet 实例化:Servlet 容器(如 Servlet 容器)根据需要实例化 Servlet,一般是通过调用无参构造函数来创建 Servlet 实例。
-
请求处理:Servlet 实例接收到来自客户端的请求,并执行相应的 Java 代码。
-
动态内容生成:Servlet 可以使用 Java 代码来生成动态内容,包括生成 HTML、XML、JSON 等响应。
-
响应发送:Servlet 将生成的动态内容作为响应发送给客户端。
-
客户端渲染:浏览器接收到响应,并将响应内容进行解析和渲染,最终在用户的浏览器中显示出动态生成的页面。
JSP 的运行原理可以概括为将 JSP 文件编译成 Java Servlet,然后由 Servlet 容器加载、实例化和运行生成的 Servlet。通过在 JSP 文件中嵌入 Java 代码,可以实现与数据库的交互、条件判断、循环处理等逻辑,生成动态的 Web 内容并发送给客户端浏览器。这使得 JSP 成为了创建动态 Web 应用程序的强大工具。
注意 :
四. page指令
在 JSP 中,可以使用<%@ page %>
指令来设置页面的相关属性和配置。<%@ page %>
指令通常位于 JSP 文件的顶部,以下是一些常用的属性和配置:
-
contentType
:设置响应的内容类型,例如:<%@ page contentType="text/html;charset=UTF-8" %>
-
pageEncoding
:设置当前页面的字符编码,例如:<%@ page pageEncoding="UTF-8" %>
-
import
:引入 Java 类的包或类,例如:<%@ page import="java.util.List" %>
-
session
:设置是否启用会话,例如:<%@ page session="true" %>
-
buffer
:设置页面的输出缓冲区大小,例如:<%@ page buffer="8kb" %>
-
autoFlush
:设置是否自动刷新缓冲区,例如:<%@ page autoFlush="true" %>
-
isThreadSafe
:设置页面是否是线程安全的,例如:<%@ page isThreadSafe="true" %>
-
errorPage
:设置错误处理页面,当页面抛出异常时跳转到指定的错误处理页面,例如:<%@ page errorPage="error.jsp" %>
-
isErrorPage
:设置当前页面是否是错误处理页面,例如:<%@ page isErrorPage="true" %>
-
extends
:指定生成的 Servlet 的继承关系,例如:<%@ page extends="com.example.MyServlet" %>
<%@ page %>
指令用于在 JSP 编译时设置页面属性和配置,可以影响生成的 Servlet 的行为和功能。
五. jsp的三种常用脚本
在 JSP(JavaServer Pages)中,有三种常用的脚本用于插入代码和实现动态功能:
-
声明脚本(Declaration):使用
<%! %>
标签将 Java 代码插入到 JSP 中。声明脚本用于定义全局的变量、方法或类,这些内容会被编译到 Servlet 类中,并在整个 JSP 页面中可见。<%! int num = 10; public void displayMessage() { System.out.println("Hello, World!"); } %>
-
表达式脚本(Expression):使用
<%= %>
标签将表达式结果输出到 JSP 页面。表达式脚本用于在页面中显示变量、方法返回值等内容。<p>Number: <%= num %></p> <p>Current time: <%= new java.util.Date() %></p>
-
脚本let(Scriptlet):使用
<% %>
标签将 Java 代码插入到 JSP 中。脚本let用于执行任意的 Java 代码块,可以包含条件语句、循环语句等。<% if (num > 0) { %> <p>The number is positive.</p> <% } else { %> <p>The number is negative.</p> <% } %>
这些脚本可以混合使用,以便实现更复杂的逻辑和动态内容。注意,声明脚本不会直接在页面中显示内容,但可以定义全局变量和方法供其他脚本使用。而表达式脚本和脚本let可以在页面中直接显示或执行相应的代码逻辑。请根据需要选择合适的脚本类型来实现所需的功能。
六. jsp注释
在 JSP(JavaServer Pages)中,有两种注释方式可以使用:
-
HTML 注释:使用
<!-- -->
标签进行注释,注释内容不会被发送到客户端。<!-- 这是一个 HTML 注释 -->
-
Java 注释:使用
//
或/* */
进行注释,注释内容在 JSP 页面被转化成 Servlet 时会被编译器忽略。<%-- 这是一个 JSP 注释 --%> // 特别的一种 <% // 这是一个单行的 JSP 注释 %> <% /* 这是一个多行的 JSP 注释 */ %>
HTML 注释是常规的 HTML 注释方式,用于注释掉 HTML 代码。Java 注释则用于注释掉嵌入在 <% %>
标记中的 Java 代码,可以使用单行注释 //
或多行注释 /* */
。
在 JSP 中使用注释可以起到以下作用:
- 解释代码的作用和目的
- 临时禁用或排除某些代码段
- 提供开发文档和注释
注释可以提高代码的可读性和可维护性,并且在开发过程中有助于团队成员之间的交流和理解。
七. jsp内置对象
JSP(JavaServer Pages)中内置了一些对象,这些对象可以在 JSP 页面中直接使用,以实现不同的功能和访问与 Web 应用程序相关的信息。以下是一些常见的 JSP 内置对象:
-
request: 代表客户端的请求,用于获取客户端提交的数据和设置请求属性。
-
response: 代表服务器对客户端的响应,用于设置响应头信息、输出内容到客户端等操作。
-
out: 用于在 JSP 页面中输出内容到客户端,等效于
response.getWriter()
方法。 -
session: 代表客户端与服务器之间的会话,用于存储和获取会话相关的数据。
-
application: 代表整个 Web 应用程序的上下文,用于在应用程序级别共享数据。
-
pageContext: 代表 JSP 页面的上下文,包含了其他内置对象的引用,用于访问其他内置对象。
-
page: 代表当前 JSP 页面的实例,可以用于执行页面重定向、包含其他页面等操作。(this)
-
exception: 用于处理异常情况,表示当前页面抛出的异常对象。
这些内置对象可通过 JSP 页面中的脚本或表达式直接调用,例如:
<!-- 获取请求参数 -->
<%
String username = request.getParameter("username");
%>
<!-- 输出内容到客户端 -->
<%
out.println("Hello, World!");
%>
<!-- 设置会话属性 -->
<%
session.setAttribute("name", "John");
%>
请注意,这些内置对象在 JSP 开发中非常常用,并提供了许多便捷的方法和属性用于处理 Web 应用程序的不同方面。
举例子 : 当请求的 URL 为 example.com/myPage.jsp?username=John
时,我们可以通过以下示例演示每个对象的使用:
request 对象:
<%
// 获取请求参数
String username = request.getParameter("username");
%>
response 对象:
<%
// 设置响应头信息
response.setContentType("text/html");
// 输出内容到客户端
PrintWriter out = response.getWriter();
out.println("<h1>Hello, World!</h1>");
out.close();
%>
out 对象:
<%
// 输出内容到客户端
out.println("Hello, World!");
%>
session 对象:
<%
// 存储和获取会话属性
session.setAttribute("name", "John");
String name = (String) session.getAttribute("name");
%>
application 对象:
<%
// 在应用程序级别共享数据
application.setAttribute("count", 10);
int count = (int) application.getAttribute("count");
%>
pageContext 对象:
<%
// 使用 pageContext 获取其他内置对象的引用
request.setAttribute("message", "Hello, World!");
String message = (String) pageContext.getRequest().getAttribute("message");
%>
page 对象:
<%!
// 执行页面重定向
response.sendRedirect("anotherPage.jsp");
%>
exception 对象:
<%
try {
// 产生异常
int result = 10 / 0;
} catch (Exception e) {
// 处理异常
out.println("An error occurred: " + e.getMessage());
}
%>
这些示例展示了如何使用每个内置对象来实现不同的功能,包括获取请求参数、设置响应头信息、输出内容、存储会话属性、共享应用程序级别的数据、获取其他内置对象的引用、执行页面重定向、处理异常等操作。
八. jsp域对象
在 JSP(JavaServer Pages)中,域对象是一种用于在不同的作用域内共享数据的机制。JSP 提供了四个不同的域对象,每个对象有不同的作用域范围。以下是 JSP 的四个域对象:
-
pageContext 域:它是最广泛的作用域,覆盖了整个 JSP 页面。在同一个页面中,不同的脚本块之间可以通过 pageContext 域对象共享数据。
-
request 域:它代表了客户端的请求,其作用范围是在同一个请求中的所有页面和资源之间共享数据。例如,当用户提交一个表单时,在表单的处理页面中可以通过 request 域传递表单数据给其他页面。
-
session 域:它代表了客户端和服务器之间的会话,其作用范围是一个用户的整个会话期间,即从用户第一次访问网站到关闭浏览器的整个过程。session 域对象可以用于在不同的页面之间存储和获取用户特定的信息。
-
application 域:它代表了整个 Web 应用程序的上下文,其作用范围是在整个应用程序的所有页面和资源之间共享数据。application 域对象通常用于存储全局配置信息或全局数据,可以被多个用户和会话访问。
这些域对象可以通过在 JSP 页面中使用内置对象(如 pageContext
、request
、session
、application
)来访问和操作。例如:
<!-- 在 pageContext 域中存储数据 -->
<%
pageContext.setAttribute("message", "Hello, World!");
%>
<!-- 在 request 域中存储数据 -->
<%
request.setAttribute("username", "John");
%>
<!-- 在 session 域中存储数据 -->
<%
session.setAttribute("cart", shoppingCart);
%>
<!-- 在 application 域中存储数据 -->
<%
application.setAttribute("version", "1.0");
%>
在其他页面或脚本块中,可以通过相应的域对象来获取这些数据:
<!-- 从 pageContext 域中获取数据 -->
<%
String message = (String) pageContext.getAttribute("message");
%>
<!-- 从 request 域中获取数据 -->
<%
String username = (String) request.getAttribute("username");
%>
<!-- 从 session 域中获取数据 -->
<%
ShoppingCart cart = (ShoppingCart) session.getAttribute("cart");
%>
<!-- 从 application 域中获取数据 -->
<%
String version = (String) application.getAttribute("version");
%>
这些域对象提供了不同的作用域范围,使得开发者可以方便地在不同的页面和作用域中共享数据,实现更灵活和高效的应用程序开发。
九. jsp请求转发标签
在 JSP(JavaServer Pages)中,可以使用 <jsp:forward>
标签来进行请求转发。该标签用于将请求转发到另一个 JSP 页面、Servlet 或其他资源,并在转发过程中将控制权传递给目标资源。以下是 <jsp:forward>
标签的语法:
<jsp:forward page="target.jsp" />
其中,page
属性指定了要转发到的目标页面或资源的路径。路径可以是相对路径或绝对路径。
下面是一个示例,演示如何在 JSP 中使用 <jsp:forward>
标签进行请求转发:
<!-- index.jsp -->
<html>
<head>
<title>Index Page</title>
</head>
<body>
<h1>Welcome to Index Page</h1>
<%-- 请求转发到 target.jsp --%>
<jsp:forward page="target.jsp" />
</body>
</html>
<!-- target.jsp -->
<html>
<head>
<title>Target Page</title>
</head>
<body>
<h1>Welcome to Target Page</h1>
<%-- 在 target.jsp 中展示一些内容 --%>
<p>This is the target page.</p>
</body>
</html>
在上述示例中,当请求访问 index.jsp
页面时,会执行 <jsp:forward>
标签中指定的请求转发操作,将请求发送到 target.jsp
页面。浏览器会显示 target.jsp
页面的内容。
需要注意的是,使用 <jsp:forward>
标签进行请求转发时,控制权会完全交给目标页面,并且客户端并不知道请求已经被转发,因为浏览器只会接收到目标页面的响应。
十. EL表达式
EL(Expression Language,表达式语言)是一种用于在 JavaEE 技术中访问和操作数据的简洁而强大的语言。EL 提供了一种简化表达式的方式,使得在 JSP、JSF、Servlet、Spring 等技术中可以更方便地访问和处理数据。
EL 表达式以 ${}
的形式包裹在文本和脚本之间,可以用于以下几个方面:
-
访问变量和属性:EL 可以用于访问 Java 对象中的属性、数组、集合等。例如,
${user.name}
将访问一个名为 “user” 的变量或属性中的 “name” 属性。 -
执行方法调用:EL 可以调用对象中的方法,并传递参数。例如,
${userService.getUserList()}
可以调用一个名为 “userService” 的对象中的 “getUserList()” 方法。 -
操作集合和映射:EL 可以用于遍历集合或映射中的元素。例如,
${listUsers}
可以用于遍历名为 “listUsers” 的 List 集合,并获取每个用户对象。 -
运算符和逻辑表达式:EL 支持常见的算术、逻辑和比较运算符,例如
${x + y}
、${age > 18}
等。
以下是一些常见的 EL 表达式示例:
<!-- 访问变量和属性 -->
<p>Welcome, ${user.name}</p>
<!-- 执行方法调用 -->
<p>The current time is ${java.time.LocalDateTime.now()}</p>
<!-- 遍历集合 -->
<ul>
<c:forEach items="${listUsers}" var="user">
<li>${user.name}</li>
</c:forEach>
</ul>
<!-- 运算符和逻辑表达式 -->
<p>${x + y}</p>
<p>${age > 18}</p>
需要注意的是,EL 表达式通常与 JSP 的标准标签库(JSTL)结合使用,以获得更强大的数据操作和控制流。在 JSP 中,可以通过引入 JSTL 的标签库声明来使用 EL 表达式:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
通过使用 EL 表达式,可以简化和提高代码的可读性,使得在 JSP 和其他 JavaEE 技术中进行数据操作更加方便和灵活。
十一. JSTL
JSTL(JavaServer Pages Standard Tag Library)是一个由 Java 社区开发的标准标签库,为 JSP 页面提供了一系列可重用的标签和函数,使得在 JSP 中进行逻辑处理和数据操作更加方便和简单。
JSTL 包含了多个模块,其中核心模块是最常用的,包含了基本的控制流标签、循环标签、条件标签和格式化标签。以下是 JSTL 的一些常用功能模块及其对应的 URI:
-
Core 核心模块:提供了基本的控制流标签、条件判断、循环处理和格式化等功能。URI 为
http://java.sun.com/jsp/jstl/core
。 -
Format 格式化模块:提供了日期、时间和数字的格式化标签和函数。URI 为
http://java.sun.com/jsp/jstl/fmt
。 -
XML XML 模块:提供了处理 XML 数据的标签和函数。URI 为
http://java.sun.com/jsp/jstl/xml
。 -
SQL SQL 模块:提供了对数据库进行 SQL 查询和操作的标签和函数。URI 为
http://java.sun.com/jsp/jstl/sql
。 -
Functions 函数模块:提供了一组常用的函数以进行字符串操作、日期计算、逻辑运算等。URI 为
http://java.sun.com/jsp/jstl/functions
。
要在 JSP 中使用 JSTL 标签,需要在 JSP 页面中引入 JSTL 的标签库声明,例如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
然后就可以在 JSP 页面中使用 JSTL 的标签了,例如使用 c:if
条件标签:
<c:if test="${condition}">
<!-- 根据条件显示内容 -->
</c:if>
还可以使用 fmt:formatDate
进行日期格式化:
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd" />
JSTL 中的标签和函数提供了强大的功能,可以简化 JSP 页面中的逻辑处理和数据操作,使得代码更具可读性和可维护性。可以根据具体需求选择合适的 JSTL 模块,并根据模块的 URI 引入相应的标签库声明,以便在 JSP 页面中使用对应的标签和函数。