【JavaWeb】渲染技术Jsp

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

目录


🌒一. 问题引出


🌒 二. 基本介绍


🌕三. 运行原理


🌓四. 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 应用程序的强大工具。


注意 :


所以jsp原来还是servlet, 只是那些麻烦的, 不好看的代码被底层实现了, 你只需要面向简单的容易的方式进行编程即可, 也是面向对象的编程思维

四. 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 四大域对象注意事项和细节

       1. 域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数 据的存储范围

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

九. 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 页面中使用对应的标签和函数。


相关文章
|
2月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
84 0
|
3月前
|
存储 前端开发 Java
JavaWeb基础6——Request,Response,JSP&MVC
Request继承体系、获取请求头行体的方法、IDEA使用模板创建Servlet、请求参数中文乱码解决、请求转发、Respones重定向、Response响应字节字符数据、JSP、EL 表达式、JSTL标签、MVC模式和三层架构
JavaWeb基础6——Request,Response,JSP&MVC
|
4月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
46 3
|
6月前
|
自然语言处理 前端开发 Java
Servlet与JSP:Java Web开发的基石技术详解
【6月更文挑战第23天】Java Web的Servlet与JSP是动态网页的核心。Servlet是服务器端的Java应用,处理HTTP请求并响应;JSP则是结合HTML与Java代码的页面,用于动态内容生成。Servlet通过生命周期方法如`init()`、`service()`和`destroy()`工作,而JSP在执行时编译成Servlet。两者在MVC架构中分工,Servlet处理逻辑,JSP展示数据。尽管有Spring MVC等框架,Servlet和JSP仍是理解Web开发基础的关键。
117 12
|
6月前
|
缓存 小程序 前端开发
Java服务器端技术探秘:Servlet与JSP的核心原理
【6月更文挑战第23天】Java Web开发中的Servlet和JSP详解:Servlet是服务器端的Java小程序,处理HTTP请求并响应。生命周期含初始化、服务和销毁。创建Servlet示例代码展示了`doGet()`方法的覆盖。JSP则侧重视图,动态HTML生成,通过JSP脚本元素、声明和表达式嵌入Java代码。Servlet常作为控制器,JSP处理视图,遵循MVC模式。优化策略涉及缓存、分页和安全措施。这些技术是Java服务器端开发的基础。
69 9
|
6月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
【6月更文挑战第23天】Java Web开发中,Servlet和JSP是构建动态Web应用的基础。Servlet处理逻辑,JSP专注展示。示例展示了Servlet如何通过`request.setAttribute`传递数据给JSP渲染。JSP自定义标签提升页面功能,如创建`WelcomeTag`显示欢迎消息。Servlet过滤器,如`CacheControlFilter`,用于预处理数据或调整响应头。这些集成和扩展技术增强了应用效率、安全性和可维护性,是Java服务器端开发的关键。
75 7
|
6月前
|
存储 设计模式 搜索推荐
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
47 1
|
6月前
|
XML 前端开发 Java
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(上)
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(上)
38 0
|
6月前
|
SQL druid Java
javaweb案例实训之基于jsp和servlet的用户管理开发[增删改查及登录注销]
javaweb案例实训之基于jsp和servlet的用户管理开发[增删改查及登录注销]
49 0
|
6月前
|
SQL 数据可视化 数据库
基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
33 0