Web基础知识(9)- JSP (一) | JSP 简介、JSP 生命周期、JSP 程序、JSP 语法

注:开始阅读 JSP 系列文章之前,读者应该已经掌握了 Java 基础知识和 Java Servlet。另外,本系列文章中的所有实例都是使用 IntelliJ IDEA + Apache Maven 配置和编译的,所以还需要对 IntelliJ IDEA 和 Apache Maven 有基本的了解。

1. JSP 简介

    JSP(Java Server Pages)是一种动态网页开发技术。JSP 文件就是在传统的 HTML 文件中插入 Java 代码和 JSP 标签,后缀名为.jsp,代码标签 <% %>。

    JSP 是 Servlet 的扩展,我们可以在 JSP 中使用 Servlet 的所有功能。另外,JSP 还提供了一些其他功能,例如 EL 表达式、自定义标签等。

    JSP 依赖于 Servlet,用户访问 JSP 页面时,JSP 代码会被翻译成 Servlet 代码,最终,以字符串的形式向外输出 HTML 代码。所以,JSP 只是在 Servlet 的基础上做了进一步封装。

    1) JSP 的由来

        1997 年,Sun 公司推出了 Servlet。

        由于当时的 Java Web 层体系结构中只有 Servlet,所以接收用户请求、处理业务逻辑、生成 HTML 代码等都在 Servlet 中完成。Servlet 不能像 PHP、ASP 等语言镶嵌 HTML 代码,因此输出 HTML 比较困难,且部署过程复杂。

        为了克服 Servlet 的这些弱点,1999 年初,Sun 公司推出了 JSP。在生成 HTML 代码方面 JSP 比 Servlet 方便许多,而且不需要特殊部署,只需要复制到服务器下面即可运行。简而言之,JSP 就是为了简化 Servlet 工作而出现的替代品。

        JSP 包括很多技术,包括 Java Bean、自定义标签(Custom Tags)、EL 表达式(Expression Language)、JSTL 标准标签类库(Java Standard Tag Library)等。这些强大成熟的技术使得 JSP 在视图层(View)具有很大的优势。

    2) JSP 具有以下特点

        (1) JSP 具有 Servlet 的所有优点,例如 JSP 文件跨平台,即一次编写,处处运行;
        (2) JSP 比 Servlet 更易于维护,JSP 将业务逻辑与网页设计分离,Web 开发人员可以更注重于网页设计,Java 开发人员可以更注重于逻辑处理;
        (3) JSP 基于Java Servlets API,JSP拥有各种强大的企业级 Java API,包括 JDBC,JNDI,EJB,JAXP 等等;
        (4) JSP 页面可以与处理业务逻辑的 Servlet 一起使用,这种模式被 Java Servlet 模板引擎所支持;
        (5) JSP 是Java EE不可或缺的一部分,是一个完整的企业级应用平台。这意味着 JSP 可以用最简单的方式来实现最复杂的应用。

 

2. JSP 生命周期

    JSP 生命周期定义了 JSP 从创建到销毁的整个过程。这类似于 Servlet 生命周期,不同的是,JSP 需要先被编译成 Servlet。

    JSP 生命周期阶段如下:

        编译 -> 初始化 -> 执行 -> 销毁

    1) JSP 编译

        当浏览器请求 JSP 时,JSP 容器会首先检查是否需要编译页面。如果该页面从未被编译过,或者自上次编译以来对其进行了修改,则编译该页面。

        JSP 本质是 Servlet,因此 JSP 容器就是 Servlet 容器。

        编译过程包括 3 个步骤:

            (1) 解析 JSP:JSP 容器解析 JSP 文件,查看是否有语法错误;
            (2) 翻译 JSP:JSP 容器把 JSP 文件翻译为 Servlet 类;
            (3) 编译 Servlet;

    2) JSP 初始化

        当容器加载 JSP 时,它将在处理任何请求之前调用 jspInit() 方法。如果您需要自定义 JSP 的初始化内容,可以重写 jspInit() 方法。

            public void jspInit(){
                //
            }

        一般情况下,程序只初始化一次。与 Servlet init 方法一样,我们通常在 jspInit() 方法中初始化数据库连接、打开文件。

    3) JSP 执行

        此阶段表示了 JSP 生命周期中所有与请求相关的交互行为,直到被销毁。

        JSP 页面完成初始化后,JSP 将会调用 _jspService() 方法。

        _jspService() 以 HttpServletRequest 对象和 HttpServletResponse 对象作为方法参数,如下所示:

            void _jspService(HttpServletRequest request, HttpServletResponse response) {
                //
            }

        JSP 的 _jspService() 方法根据 request 来生成相应的 response,并且它还负责生成对 HTTP 方法的响应,即 GET、POST、DELETE 等。

    4) JSP 销毁

        JSP 生命周期的销毁阶段表示从容器中删除 JSP。

        jspDestroy() 方法等效于 Servlet 中的 destroy() 方法。如果您需要自定义 JSP 的销毁内容,可以重写,格式如下:

            public void jspDestroy() {
                //
            }

        通常我们在 jspDestroy() 方法中释放数据库连接、关闭打开的文件。 


3. JSP 程序

    在 “Web基础知识(2)- Java Servlet (二)”  里基于 IDEA + Maven 创建的 WebBasic 项目中,自动创建了 src/main/webapp/index.jsp,内容如下:

        <html>
        <body>
        <h2>Hello World!</h2>
        </body>
        </html>

    这个 index.jsp 是没有 JSP 标签的 HTML 文件,修改如下:

 1         <%@ page contentType="text/html;charset=UTF-8" language="java"%>
 2         <%@ page import="java.util.Date, java.text.SimpleDateFormat" %>
 3         <html>
 4         <head>
 5             <title>Index</title>
 6         </head>
 7         <body>
 8             <%-- JSP 声明语句 --%>
 9             <%!
10                 // 重写 jspInit()
11                 public void jspInit(){
12                     super.jspInit();
13                     System.out.println("JSP init()");
14                 }
15 
16                 // 重写 jspDestroy()
17                 public void jspDestroy() {
18                     super.jspDestroy();
19                     System.out.println("JSP destroy()");
20                 }
21             %>
22 
23             <%-- JSP 脚本 --%>
24             <!-- Header Title -->
25             <h3><% out.print("Index Page"); %></h3>
26 
27             <%!
28                 // JSP 声明语句
29                 private int a=11;
30                 private int getNum(int a,int b){
31                     return a+b;
32                 }
33             %>
34 
35             <%-- JSP 表达式 --%>
36             <p>getNum(3,5) 的返回值:<%=getNum(3,5)%></p>
37 
38             <%
39                 Date date = new Date();
40                 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
41                 String nowTime = dateFormat.format(date);
42             %>
43             <%-- 获取当前时间 --%>
44             <p>当前时间为:<%=nowTime %></p>
45 
46         </body>
47         </html>


    代码解释:

        <%@ page contentType="text/html;charset=UTF-8" language="java"%> 指定该网页类型为 text/html,网页字符编码为 UTF-8,language="java" 指定该网页编程语言为 Java。

        <%@ page import="java.util.Date, java.text.SimpleDateFormat" %> 类似于Servlet 中 import 类。

        <head>、<title> 和 <body> 都是 HTML 标签,用于静态网页,他们包含的内容都将直接传递给客户端,也就是 Web 浏览器。

        <%! %> 是 JSP 声明语句,用于声明一个或多个变量、方法,以供后面的 Java 代码使用。

        <% out.print("Index Page"); %> 是 JSP 脚本,等价于 <%="Index Page" %>。

        <%= %> 是 JSP 表达式,用于打印变量和方法的返回值。

        <%-- --%> 是隐藏注释,在浏览器的源码里无法看到它。

        <!-- --> 是HMTL注释,在浏览器的源码里可以看到它。


4. JSP 语法


    1) JSP 脚本

        在 JSP 中,可以使用 JSP 脚本写入 Java 代码。

        JSP 脚本可以包含任意数量的 Java 语句,变量、方法和表达式。JSP 脚本会把包含的内容插入到 Servlet 的 service() 方法中。

        JSP 脚本语法如下:

            <% Java语句 %>

        等效于

            <jsp:scriptlet>
                Java语句
            </jsp:scriptlet>

        任何文本、HTML 标签和 JSP 元素(声明,表达式等)都必须在脚本程序之外。

    2) JSP 声明语句

        JSP 声明语句用于声明一个或多个变量、方法,以供后面的 Java 代码使用。您必须先对变量和方法进行声明,才能使用它们。

        JSP 声明语法如下:

            <%! 声明语句 %>

        等效于

            <jsp:declaration>
                声明语句
            </jsp:declaration>

        示例

            <%! int num = 0; %>
            <%! Circle a = new Circle(2.0); %>
            <%!
                public void show () {
                }
            %>
            
        JSP 脚本和声明的区别:

            (1) JSP 脚本只能声明变量,不能声明方法。JSP 声明语句可以声明变量和方法。
            (2) JSP 脚本会把包含的内容转译插入到 Servlet 的 service() 方法中,也就是 <% %> 中定义的变量是局部变量。这也是 JSP 脚本不能声明方法的原因,因为 Java 不允许方法中嵌套方法。
            (3) JSP 声明会把包含的内容添加到 Servlet 类中(在任何方法之外),也就是 <%! %> 中定义的变量是成员变量,方法是成员方法。

    3) JSP 表达式

        JSP 表达式可以把变量或者表达式输出到网页上,不需要 out.print() 就能输出数据。

        JSP 表达式语法如下:

            <%= 表达式 %>

        等效于

            <jsp:expression>
                表达式
            </jsp:expression>
        
        可以将 <%=表达式 %> 理解为 <% out.println(表达式) %> 的简写方式。这里需要注意,JSP 表达式不能以分号结尾。

    4) JSP 注释

        注释可以提高代码的可读性,让他人能够更加轻松地了解代码,从而提高团队合作开发的效率。

        (1) HTML 注释

            由于 JSP 文件中可以包含 HTML 标记,所以 HTML 中的注释同样可以在 JSP 文件中使用。HTML 注释语法如下:

                <!-- 注释内容 -->

            HTML 注释中的内容是不会在客户端浏览器中显示的,但可以通过 HTML 源代码看到这些注释内容。

        (2) 带有 JSP 表达式的注释

            在 HTML 注释中还可以嵌入 JSP 表达式,格式如下:

                <!--HTML 注释内容<%=JSP 表达式%>-->

            包含该注释语句的 JSP 页面被请求后,服务器能够自动识别并执行注释中的 JSP 表达式,对于注释中的其他内容则不做任何操作。

            当服务器将执行结果返回给客户端浏览器后,注释的内容也不会在浏览器中显示。

            当我们查看 HTML 源代码时,只能查看到 JSP 表达式执行后的结果,并不能看到原来的 JSP 表达式。
            
            示例:

                <% String name = "admin"; %>
                <!--当前登录用户为:<%=name%>-->
                <h1>欢迎您的到来,<%=name %></h1>

                访问该 JSP 页面,客户端浏览器中会输出以下内容:
                
                    欢迎您的到来,admin

        (3) 隐藏注释

            无论是普通的 HTML 注释还是带有 JSP 表达式的注释,虽然都不能在客户端浏览器中显示,但是它们却都存在于 HTML 源代码中,客户端可以通过 HTML 源代码看到被注释的内容,所以严格来说,这两种注释其实并不安全。

            隐藏注释的内容,不会显示在客户端的任何位置(包括 HTML 源代码),安全性较高,其注释格式如下:

                <%-- 注释内容 --%>

            示例:

                <%
                    Date date = new Date();
                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String nowTime = dateFormat.format(date);
                %>
                <%--获取当前时间 --%>
                <h1>当前时间为:<%=nowTime %></h1>

                访问该 JSP 页面,客户端浏览器中会输出以下内容:

                    当前时间为:2021-06-17 10:46:29

        (4) JSP 脚本(Scriptlet)中的注释

            脚本程序中包含的是一段 Java 代码,所以在脚本程序中的注释与在 Java 中的注释是相同的。

            a) 单行注释

                单行注释的格式如下:
                
                    // 注释内容

                符号 “//” 后面的内容为注释的内容,服务器对该内容不进行任何操作。由于脚本程序的代码在客户端通过查看源代码是不可见的,因此在脚本程序中通过该方法注释的内容也是不可见的。

                示例:

                    <%
                        int count=6;    // 定义一个计数变量
                    %>
                    计数变量 count:<%=count%>

                    访问该 JSP 页面,客户端浏览器中会输出以下内容:

                        计数变量 count:6

            b) 多行注释

                多行注释是通过 “/* ... */” 符号进行标记的,它们必须成对出现,在它们之间的注释内容可以换行。注释格式如下:
                    
                    /*
                        注释内容1
                        注释内容2
                    */

                与单行注释一样,在 “/* ... */” 之间注释的所有内容,服务器都不会做任何处理,即使被注释的内容是 JSP 表达式或其他脚本程序也不例外。

                多行注释的开始标记和结束标记可以不在同一个脚本程序中同时出现。

                示例:

                    <%
                        String name = "www.test.com";
                        /* if ("www.test.com".equals(name)) { %>
                            <h1>JSP 示例</h1>
                    <% }
                        */%>
                    <h1><%=name %></h1>

                    访问该 JSP 页面,客户端浏览器中会输出以下内容:

                        www.test.com  

            c) 文档注释

                文档注释的内容会被 Javadoc 文档工具在生成文档时读取,文档是对代码结构和功能的描述。注释格式如下:

                    /**
                        提示信息1
                        提示信息2
                    */

                文档注释与多行注释很相似,但它是以“/**”符号作为其开始标记的,而不是“/*”。与多行注释一样,被注释的所有内容,服务器不会做任何处理。

                示例:
                
                    <%!
                        /**
                            @作者:WebBasic
                            @网址:www.test.com
                        */
                        public String sayHello(String who) {
                            return "您好:" + who;
                        } %>
                    <h1><% out.println(sayHello("WebBasic")); %></h1>

                    访问该 JSP 页面,客户端浏览器中会输出以下内容:

                        您好:WebBasic         


posted @ 2022-03-19 20:03  垄山小站  阅读(346)  评论(0)    收藏  举报