欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

理解JavaWeb中的JSP渲染技术

最编程 2024-08-11 08:26:39
...

目录


????一. 问题引出


???? 二. 基本介绍


????三. 运行原理


????四. 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");
%>

在其他页面或脚本块中,可以通过相应的域对象来获取这些数据: