[Java Web]实验五 JSP基本语法与页面指令 打开counter.jsp转换后的源文件counter

您所在的位置:网站首页 jsp的隐藏注释可以在服务端用吗 [Java Web]实验五 JSP基本语法与页面指令 打开counter.jsp转换后的源文件counter

[Java Web]实验五 JSP基本语法与页面指令 打开counter.jsp转换后的源文件counter

2024-07-09 19:39| 来源: 网络整理| 查看: 265

目录

实验五  JSP基本语法与页面指令

一、实验目的

二、实验原理

三、实验内容与步骤

(一)输入并执行下面JSP页面,文件名为counter.jsp

【步骤1】该JSP页面包含哪些JSP语法元素。在浏览器中访问该页面,输出结果如何?多次刷新页面,结果如何?

【步骤2】打开counter.jsp转换后的源文件counter_jsp.java,对应的类文件在哪里?文件名是什么?

【步骤3】查看count变量是在哪里声明的?

【步骤4】将上面JSP页面中的一行改为,页面能否正常执行,它与上面页面有什么区别?

   (二)有下面expression.jsp页面:

你能找出其中的错误吗?你可试着执行该页面,看会出现什么结果?将其中错误修改过来,最后输出下面结果:

(三)运行下面persistent_counter.jsp页面,体会如何实现持久的计数器的?

(四)输入并运行下面的import_test.jsp页面:

(五) errorPage属性和isErrorPage属性的使用。

    【步骤1】下面的hello.jsp页面执行时将抛出一个异常,它指定了错误处理页面为errorHandler.jsp。

  【步骤2】下面的errorHandler.jsp是错误处理页面。

四、思考题

1. JSP语法元素有哪些?使用时应注意什么问题?

2. JSP页面的生命周期有哪几个阶段?

3. 如何理解JSP页面本质上是Servlet?

4. page指令有哪些常用的属性,各自的功能是什么?

实验五  JSP基本语法与页面指令 一、实验目的

1. 熟练掌握JSP的声明、表达式、小脚本和注释的使用;

2. 理解JSP页面(page)指令和动作的语法格式;

3. 理解JSP页面的生命周期。

4. 熟练掌握page指令的下面的属性:import、session、errorPage、isErrorPage、contentType、pageEncoding。

5. 理解page指令的下面的属性:language、extends、buffer、autoFlush、info。

二、实验原理

JSP有三个指令元素:page、include和taglib。这些指令元素是针对JSP引擎的,并不会产生任何看得见的输出。它们都包含在标签内。本实验主要学习page指令。

指令作用于整个JSP页面,包括静态包含的页面,但不包括动态包含的页面。可以在一个页面中包含多个指令,但其属性除import外只能在整个页面中出现一次。

指令可以放在页面的任何位置,但为了JSP程序的可读性,一般将指令放在页面的前面。

三、实验内容与步骤 (一)输入并执行下面JSP页面,文件名为counter.jsp Welcome! You are visitor number 【步骤1】该JSP页面包含哪些JSP语法元素。在浏览器中访问该页面,输出结果如何?多次刷新页面,结果如何?

注意:IDEA需要先启动Tomcat服务器,再运行jsp文件

JSP语法元素:

JSP指令用来设置整个JSP页面相关的属性:JSP声明语句用于定义变量和方法:JSP表达式将一个Java变量或表达式的计算结果输出到客户端的简化方式:

多次刷新页面,Welcome!You are visitor number后面的数字逐次加1

【步骤2】打开counter.jsp转换后的源文件counter_jsp.java,对应的类文件在哪里?文件名是什么?

1)C:\Users\28714\AppData\Local\JetBrains\IntelliJIdea2023.2\tomcat\fd519e8a-ddfc-4903-b1e2-fe3983169fc7\work\Catalina\localhost\ROOT\org\apache\jsp

对应的类文件在下图中框住的(using catalina_base:表示Tomcat实例运行时的根目录)路径下的work文件夹中可以找到

2)文件名:counter_jsp.class

【步骤3】查看count变量是在哪里声明的?

 

 

【步骤4】将上面JSP页面中的一行改为,页面能否正常执行,它与上面页面有什么区别?

能,区别是刷新页面Welcome!You are visitor number后面的数字不会变。

将 改为 会影响页面的执行和计数器的行为。

在原始的 JSP 页面中, 定义了一个实例变量 count。这个变量在 JSP 页面的整个生命周期内都存在,并且其值会在多个用户之间共享。这意味着如果有多个用户访问该页面,count 的值将会在所有用户之间共享和递增。

而当你将其更改为 ,count 变量变成了局部变量。这意味着每次页面被请求时,都会创建一个新的 count 变量,并将其初始化为 0。因此,每个用户的访问都会有一个独立的 count 变量,它们之间不会共享值。这会导致计数器失效,因为每次页面加载时 count 都会重置为 0。

总结来说,主要的区别在于变量的作用域和生命周期:

定义了一个实例变量,它在多个请求和多个用户之间共享和持久化。

定义了一个局部变量,它在每次请求时创建并初始化,对于每个用户都是独立的。

   (二)有下面expression.jsp页面: 你能找出其中的错误吗?你可试着执行该页面,看会出现什么结果?将其中错误修改过来,最后输出下面结果:

图6.1 expression.jsp的运行结果

能,会报错

a)在 这行中,aVector 这个变量并没有在前面的代码中声明和初始化。如果想使用一个 Vector 对象,需要先声明并初始化它。第一行缺少来导入Vector类。根据输出结果可以看出并没有使用aVector这个对象,可以直接移除这一行。

b)在 这行中,不能在表达式标签 中声明变量。应该在脚本标签 中声明变量。改为两行,第一行为,第二行为

c)在这行中,多了个分号。

d) 在 这行中,setLength 方法没有返回值,因此不能在表达式标签中使用。应该将其移动到脚本标签中。改为

修复后的代码如下:

(三)运行下面persistent_counter.jsp页面,体会如何实现持久的计数器的? Welcome! You are   th  visitor(s).

需要导入

这个 JSP 页面实现了一个持久的计数器。它使用了一个整数变量 count 来记录访问页面的次数,并将该计数器的值存储在一个名为 counter.db 的文件中。

当页面首次加载时,jspInit() 方法会被调用。在该方法中,代码尝试从 counter.db 文件中加载计数器的值。通过调用 getServletContext().getRealPath("/WEB-INF/counter.db") 获取文件的真实路径,然后使用文件输入流 (FileInputStream) 和数据输入流 (DataInputStream) 读取文件中存储的整数值,并将其赋值给 count 变量。

如果加载计数器值的过程中发生异常,会将错误信息记录到日志中。

在页面的主要内容部分,count 变量的值会递增,并输出到页面上,显示为 "Welcome! You are th visitor(s)。"

当服务器停止或 JSP 页面被销毁时,jspDestroy() 方法会被调用。在该方法中,代码将 count 变量的当前值存储回 counter.db 文件中。通过使用文件输出流 (FileOutputStream) 和数据输出流 (DataOutputStream),将 count 的值写入文件中。

如果在存储计数器值的过程中发生异常,会将错误信息记录到日志中。

这样,每次页面加载时,计数器的值都会递增并显示出来,而且在服务器重新启动或页面重新部署后,计数器的值会保持不变,实现了持久的计数器功能。

(四)输入并运行下面的import_test.jsp页面: page指令示例 使用page指令导入java.util.Date类

现在的时间是:

现在的时间是:

访问上述JSP页面,输出结果如下图所示:

图6.2 import_test.jsp页面的运行结果

可以看到页面中最后一行的中文显示为乱码,将下面代码加到JSP页面中:

重新访问页面,中文显示正常。这说明可以使用page指令的contentType属性指定页面输出使用的字符编码。默认情况下,JSP页面使用的字符集是iso-8859-1编码,如使用汉字编码应指定为gb2312或gbk。

(五) errorPage属性和isErrorPage属性的使用。     【步骤1】下面的hello.jsp页面执行时将抛出一个异常,它指定了错误处理页面为errorHandler.jsp。 Hello,   【步骤2】下面的errorHandler.jsp是错误处理页面。 请求不能被处理: 请重试!

用下面的URL访问hello.jsp页面,就会产生下面结果:

  http://localhost:8080/bookstore/hello.jsp

图6.3 errorHandler.jsp页面的运行结果

这说明没有提供name参数,hello.jsp页面中抛出RuntimeException异常,所以调用错误页面。

如果使用下面URL访问 hello.jsp页面,将产生下面正常的页面:

  http://localhost:8080/bookstore/hello.jsp?name=Mary

图6.4 hello.jsp页面的运行结果

注意:如果请求参数值使用汉字,仍然产生乱码,例如:

  http://localhost:8080/bookstore/hello.jsp?name=欧阳清风

这是因为请求参数默认使用iso-8859-1编码传递,如果要正确显示中文,应将请求参数编码转换为gb2312编码。

按下面方法修改hello.jsp页面,将请求参数值编码转换为汉字编码。

Hello, 四、思考题 1. JSP语法元素有哪些?使用时应注意什么问题?

JSP(JavaServer Pages)的语法元素主要有以下几类:

a)脚本元素:包括表达式()、程序码片段(,可以包含内置类)、声明(,用于定义成员变量和方法)以及注释(,用于输出和隐藏注释)。

b)指令元素:主要有page、include和taglib三个指令。page指令用于定义页面依赖属性,如脚本语言、错误页面、缓存需求等;include指令用于在JSP页面中包含其他文件;taglib指令用于定义页面中使用的标签库。

c)动作元素:包括jsp:include、jsp:forward、jsp:param等,用于在页面中包含其他资源、转发请求、添加请求参数等。

在使用JSP语法元素时,需要注意以下几点:

a)脚本元素中的代码是在服务器端执行的,因此需要注意代码的安全性和性能。例如,应避免在脚本元素中直接操作数据库或使用大量消耗资源的操作。

指令元素和动作元素都是在页面编译时解析的,因此它们的属性必须是编译时可知的。例如,不能在page指令中使用运行时才能确定的变量。

b)JSP页面在首次执行时会被编译为servlet,因此JSP页面的生命周期与servlet的生命周期相似。这意味着JSP页面中的变量和方法具有与servlet相同的作用域和生命周期。

c)JSP表达式的结果会被自动转换为字符串并写入到输出流中。因此,在使用JSP表达式时需要注意其返回值的类型和格式。

d)在JSP页面中使用Java代码时需要注意代码的规范和可读性,以避免出现维护困难的问题。

2. JSP页面的生命周期有哪几个阶段?

JSP页面的生命周期可以粗略地划分为三个阶段,分别是初始化阶段、执行阶段和销毁阶段。更具体地说,可以细分为七个阶段,包括解析(预处理)阶段、编译阶段、类加载阶段、实例化阶段、初始化阶段、请求处理阶段和销毁阶段。

1)解析(预处理)阶段:当客户端向服务器发出请求时,JSP文件首先会被转到servlet容器里,然后在servlet容器里被解析,转换为Servlet源文件(.java文件)。

2)编译阶段:在servlet容器里编译servlet源文件(.java文件),生成servlet类(.class文件)。

3)类加载阶段:类加载器加载类文件,容器会检查servlet类是否比jsp文件旧(确保JSP文件被修改)。

4)实例化阶段:servlet容器创建servlet的一个实例。

5)初始化阶段:调用servlet的init()方法进行初始化。

6)请求处理阶段:对于到达服务器的每个请求,servlet容器都会创建一个新的线程来处理该请求。这个线程调用servlet的service()方法,并传递一个ServletRequest和ServletResponse对象。service()方法通过检查HTTP请求类型(GET、POST等),将请求分派给适当的处理方法(doGet()、doPost()等)。

7)销毁阶段:当服务器不再需要servlet时(例如,当服务器关闭或servlet需要从服务中移除时),servlet容器会调用servlet的destroy()方法,释放servlet占用的资源。

这些就是JSP页面生命周期的各个阶段。需要注意的是,这个生命周期是在服务器端进行的,与客户端的浏览器无关。

3. 如何理解JSP页面本质上是Servlet?

JSP页面本质上是Servlet,是因为JSP页面在服务器端执行时,会被转换为一个对应的Servlet类。这个Servlet类会处理所有的页面请求,并生成相应的HTML响应。

具体来说,当客户端向服务器请求一个JSP页面时,服务器会首先检查该页面是否已经被编译过。如果没有被编译过,服务器会将JSP页面转化为一个Java源文件,然后编译这个源文件生成一个对应的Servlet类。这个Servlet类会被加载到内存中,并实例化成为一个Servlet对象。当有新的请求到达时,服务器会调用该Servlet对象的service方法来处理请求,并生成响应。

因此,从本质上来说,JSP页面其实就是一种特殊的Servlet,它们之间的主要区别在于JSP页面使用了一种更易于理解和维护的HTML-like的标记语言来编写页面逻辑和动态内容,而Servlet则使用纯Java代码来实现相同的功能。这种分离使得开发人员能够更容易地将表示层和业务逻辑层分离,提高了代码的可维护性和重用性。

4. page指令有哪些常用的属性,各自的功能是什么?

page指令是JSP页面中的一种指令元素,用于定义JSP页面的全局属性。page指令具有多个属性,以下是其中一些常用的属性及其功能:

1)language属性:指定在页面中使用的脚本语言。默认情况下,该属性的值为"java"。目前只支持Java语言,不过不排除将来可能会支持其他语言。

2)contentType属性:用于设置响应的MIME类型和字符编码。该属性告诉浏览器响应的内容类型和字符集。例如,contentType="text/html; charset=UTF-8" 表示响应的内容类型为HTML,并使用UTF-8编码。

3)import属性:用于导入在JSP页面中使用的Java类。可以导入多个类,使用逗号或通配符分隔。导入的类可以在JSP页面中的脚本元素中直接使用。

4)session属性:指定JSP页面是否支持HTTP会话。如果设置为false,则页面中的session对象将无法使用。默认为true,表示支持会话。

5)buffer属性:指定输出流的缓冲区大小。可以设置为none(无缓冲区)或特定的缓冲区大小(以KB为单位)。默认值为8KB。当缓冲区满时,可以自动刷新缓冲区或将缓冲区的内容发送到客户端。

6)autoFlush属性:指定当缓冲区满时是否自动刷新缓冲区。如果设置为true(默认值),则当缓冲区满时会自动刷新缓冲区;如果设置为false,则需要在适当的时候手动刷新缓冲区,否则可能会出现溢出异常。

7)errorPage属性:指定当JSP页面发生异常时转向的错误处理页面。可以设置为相对路径或绝对路径。当页面发生异常时,会将异常对象传递给错误处理页面进行处理。

8)isErrorPage属性:指示当前页面是否为错误处理页面。如果设置为true,则表示当前页面用于处理其他页面的错误,并且可以使用exception对象来获取异常信息。默认为false。

9)extends属性:指定JSP页面继承的父类。通常不需要设置该属性,因为JSP容器会自动提供适当的父类。如果设置了该属性,可能会影响JSP页面的编译能力。

10)info属性:用于设置JSP页面的相关信息,如作者、版本等。这些信息可以通过Servlet.getServletInfo()方法获取。

这些属性可以在JSP页面的page指令中定义,以控制页面的行为和外观。需要注意的是,除了这些属性之外,page指令还支持其他一些属性和元素,可以根据具体的需求选择适当的属性和元素来使用。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3