Java Web之第6章JSP

JSP(Java Servlet Pages)是一种基于Java的动态页面开发技术,它将HTML与Java代码结合,实现页面的静态和动态内容显示。JSP的特点包括跨平台、业务代码与界面分离、组件重用和预编译。JSP运行原理涉及请求/响应模式,包括转换成Servlet、编译、执行等步骤。JSP基本语法包括脚本元素(Scriptlets、声明语句、表达式)和指令(如page指令和include指令)。此外,JSP还提供了多个隐式对象,如out对象和pageContext对象,以及动作元素,如jsp:include和jsp:forward,用于控制页面行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6.1 JSP概述

JSP:全名是Java Servlet Pages,它是建立在Servlet规范之上的动态页面开发技术。在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用来实现网页中静态内容的显示,Java代码用来实现网页中动态内容的显示。为了与传统HTML有所区别,JSP文件的扩展名为.jsp

JSP技术所开发的Web应用程序是基于Java的,它可以用一种简捷而快速的方法从Java程序生成Web页面,使用上具有如下几点特征:

  • 跨平台:由于JSP是基于Java语言的,它可以使用Java API,所以它也是跨平台的,可以应用于不同的系统中,如Windows,Linux等。当从一个平台移植到另一个平台时,JSP和JavaBean的代码并不需要重新编译,这时因为Java的字节码是与平台无关的,这也应验了Java语言“一次编译,到处运行”的特点

  • 业务代码相分离:在使用JSP技术开发Web应用时,可以将页面的开发与应用程序分离开开发人员使用HTML来设计界面,使用JSP标签和脚本来动态生成页面上的内容。在服务器端,JSP引擎(或容器,本书中指Tomcat)负责解析JSP标签和脚本程序,生成所请求的内容,并将执行结果以HTML页面的形式返回到浏览器

  • 组建重用:JSP中可以使用JavaBean编写业务组建,也就是使用一个JavaBean类封装业务处理代码或者作为一个数据存储模型,在JSP页面中,甚至在整个项目中,都可以重复使用这个JavaBean。同时,JavaBean也可以应用到其他Java应用程序中

  • 预编译:预编译就是在用户第1次通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅执行一次编译。编译好的代码将被保存,在用户下一次访问时,会直接执行编译好的代码。这样不仅节约了服务器的CPU资源,还大大地提升了客户端访问速度

JSP只是在原来的HTML文件中加入了一些具有Java特点的代码,这些代码具有其独有的特点,称为JSP的语法元素

JavaBean推荐文章:https://www.runoob.com/jsp/jsp-javabean.html

6.1.3 JSP运行原理

JSP的工作模式是请求/响应模式,客户端首先发出HTTP请求,JSP程序收到请求后进行处理并返回处理结果。在一个JSP文件第1次被请求时,JSP引擎(容器)把该JSP文件转换成为一个Servlet,而这个引擎本身也是一个Servlet

在这里插入图片描述

JSP的运行过程具体如下:

(1)客户端发出请求,请求访问JSP文件

(2)JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果发现JSP文件中存在任何语法错误,则中断转换过程,并向服务器和客户端返回出错信息
(3)如果转换成功,则JSP容器将生成的Java源文件编译成响应的字节码文件*.class。该class文件就是一个Servlet,Servlet容器会像处理其他Servlet一样来处理它

(4)由Servlet容器加载转换后Servlet类(class文件)创建一个该Servlet(JSP页面的转换结果)实例,并执行Servlet的jsplnit()方法。jsplnit()方法在Servlet的整个生命周期中只会执行一次
(5)执行jspService()方法来处理客户端的请求。对于每一个请求,JSP容器会创建一个新的线程来处理它。如果多个客户端同时请求该JSP文件,则JSP容器也会创建多个线程,使得每一个客户端请求都对应一个线程。JSP运行过程中采用的这种多线程的执行方式可以极大地降低对系统资源的需求,提高系统的并发量并缩短响应时间。注意:由于(4)步生成的Servlet是常驻内存的,所以响应速度非常快

(6)如果JSP文件被修改了,则服务器将根据设置决定是否对该文件重新编译。如果需要重新编译,则使用重新编译后的结果取代内存中常驻的Servlet,并继续上述处理过程

(7)虽然JSP效率很高,但在第1次调用的时候往往由于需要转换和编译,所以会产生一些轻微的延迟。此外,由于系统资源不足等原因,JSP容器可能以某种不确定的方式将Servlet从内存中移除,发生这种情况时首先会调用jspDestroy()方法,然后Servlet实例会被加入"垃圾收集"处理

(8)当请求处理完成后,响应对象由JSP容器接收,并将HTML格式的响应信息发送回客户端

了解JSP的运行原理后,完全可以利用其中的一些步骤来做一些工作,如:可以在jsplnit()中进行一些初始化工作(建立数据库的连接,建立网络连接,从配置文件中获取一些参数等),可以在jspDestrou()中释放响应的资源

6.2 JSP基本语法

JSP脚本元素:是指嵌套在<%和%>之中的一条或多条Java程序代码。通过JSP脚本元素可以将Java代码嵌入HTML页面中,所有可执行的Java代码,都可以通过JSP脚本来执行

JSP脚本元素主要包含如下3种类型:

(1)JSP Scriptlets

(2)JSP 声明语句

(3)JSP 表达式

1.JSP Scriptlets:是一段代码段。当需要使用Java实现一些复杂操作或控制时,可以使用它。JSP Scriptlets的格式如下:

<% java 代码(变量,方法,表达式等)%>

在JSP Scriptlets中声明的变量是JSP页面的局部变量,调用JSP Scriptlets时,会为局部变量分配内存空间,调用结束后,释放局部变量占有的内存空间

2.JSP 声明语句:用于声明变量和方法,它以"<%!开始,以%>结束,其语法格式如下:

<%!
	定义的变量或方法等
%>

在上述语法格式中,被声明的Java代码将被编译到Servlet的_jspService()方法之外,即在JSP声明语句中定义的都是成员方法,成员变量,静态方法,静态变量,静态代码块等。在JSP声明语句中声明的方法在整个JSP页面内有效,但是在方法内定义的变量只能在该方法有效。当声明的方法被调用时,会为方法内定的变量分配内存,而调用结束后立刻会释放所占的内存

在一个JSP页面中可以有多个JSP声明语句,单个声明中的Java语句可以是不完整的,但是多个声明组合后的结果必须是完整的Java语句

注意

<%!和%>里面定义的属性是成员属性,相当于类的属性,方法相当于全局方法,也相当于类里面的方法,但是它是不可以进行输出的,因为它只是进行方法的定义和属性定义

<%和%>可以进行属性的定义,可以输出内容,但是它不可以进行方法的定义。因为这对标签里面的内容是在此JSP被编译为Servlet的时候,放在_jspService()方法里面的,这个方法就是服务器向客户端输出内容的地方,它本身就是一个方法。所以,如果它里面定义方法的化,那么就相当于是在类的方法里面嵌套定义了方法,这在Java里面是不允许的。但是,可以在里面定义自己的私有变量,因为方法里面也可以定义变量,也可以调用方法,唯独不可以在定义方法

总之,<%!和%>是用来定义成员变量属性和方法的,<%和%>主要是用来输出内容的,因此,如果涉及到了成员变量的操作,那么就应该使用<%!和%>,而如果涉及到输出内容,就使用<%和%>

3.JSP 表达式:用于将程序数据输出到客户端,它将要输出的变量或者表达式直接封装在以<%=开头和以%>结尾标记中,其基本语法如下:

<%= expression %>

在上述语法格式中,JSP表达式中的变量或表达式的计算结果将被转换成一个字符串,然后插入到JSP页面输出结果的相应位置处,注意<%=和%>标记之间插入的是表达式,不能插入语句。<%=是一个完整的符号,<%和=之间不能有空格,且JSP表达式中的变量或表达式后面不能有分号

JSP注释方式基本格式如下:

<%--  注释信息  --%>

注意Tomacat在将JSP页面编译成Servlet程序时,会忽略JSP页面中被注释的内容,不会将注释信息发送到客户端

JSP基本语法推荐文章:https://www.cnblogs.com/huangdabing/p/9185410.html

6.3 JSP指令

为了设置JSP页面中的一些信息,Sun公司提供了JSP指令。每种指令都定义了各自的属性

6.3.1 page指令

在JSP页面中,经常需要对页面的某些特性进行描述,例如,页面的编码方式,JSP页面采用的语言等,这时,可以通过page指令来实现。page指令的具体语法格式如下:

<%@ page 属性名1="属性值1" 属性值2="属性值2"  ...%>

在上面的语法格式中,page用于声明指令名称,属性用来指定JSP页面的某些特性。page指令提供了一系列与JSP页面相关的属性,常用的属性如下:language,import,session,isErrorPage,errorPage,contentType,pageEnCoding等

注意除了import属性外,其他的属性都只能出现一次,否则会编译失败。page指令的属性名称都是区分大小写的,page指令对整个页面都有效,而与其书写的位置无关,但是习惯上把page指令卸载JSP页面的最前面

page指令推荐文章:https://www.yiibai.com/jsp/page_directive.html

6.3.1 include指令

在实际开发时,有时需要在JSP页面静态包含一个文件,例如HTML文件,文本文件等,这是,可以通过include指令来实现。include指令的具体语法格式如下:

<%@ include file="被包含的文件地址"%>

include指令只有一个flie属性,该属性用来指定插入到JSP页面目标位置的文件资源。需要注意的是,插入文件的路径一般不以“/”开头,而是使用相对路径

使用include指令使用需要注意如下问题:

(1)被引入的文件必须遵守JSP语法,其中的内容可以包含静态HTML,JSP脚本元素和JSP指令等普通JSP页面所具有的一切内容

(2)除指令元素之外,被引入的文件中其他元素都被转换成相应的Java源代码,然后插入当前JSP页面所翻译成的Servlet源文件中,插入位置与include指令在当前JSP页面中的位置保持一致

(3)file属性值的设置必须使用相对路径,如果以“/”开头,表示相对当前Web应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。需要注意的是,这里的file属性指定的相对路径是相对于文件(file),而不是相对于页面(page)

JSP指令推荐文章:http://c.biancheng.net/view/1458.html

6.4 JSP隐式对象

在JSP页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦。为了简化Web应用程序的开发,JSP2.0规范中提供了9个隐式(内置)对象,它们是JSP默认创建的,可以直接在JSP页面中使用。具体如下:

名称类型描述
outjavax.servlet.jsp.JspWriter用于页面输出
requestjavax.servlet.http.HttpServletRequest得到用户请求信息
respomsejavax.servlet.http.HttpServletResponse服务器向客户端的回应信息
configjavax.servlet.ServletConfig服务器配置,可以取得初始化参数
sessionjavax.servlet.http.HttpSession用来保存用户的信息
applicationjavax.servlet.ServletContext所有用户的共享信息
pagejava.lang.Object指当前页面转换后的Servlet类的实例
pageContextjavax.servlet.jsp.PageContextJSP的页面容器
exceptionjava.lang.Throwable表示JSP页面所发送的异常,在错误页中才起作用

JSP隐式对象推荐文章:https://www.yiibai.com/jsp/jsp_implicit_objects.html

6.4.2 out对象

out对象用于向客户端发送文本内容。是javax.servlet.jsp.JspWriter类的实例对象

out对象与Servlet引擎提供的缓冲区之间的工作关系:
在这里插入图片描述
多学一招:使用page指令设置out对象的缓冲区大小,可以通过page指令中操作缓冲区的buffer属性来实现。

注意当写入到out对象中的内容充满了out对象的缓冲区时,out对象中输入缓冲区的数据也会真正写入到Servlet引擎提供的缓冲区中

6.4.3 pageContext对象

在JSP页面中,使用pageContext对象可以获取JSP的其他8个隐式对象

pageContext对象是javax.servlet.ServletContext类的实例对象,它代表当前JSP页面的运行环境,并提供了一系列用于获取其他隐式对象的方法,还提供了存储数据的功能pageContext对象存储数据是通过操作属性来实现的

pageContext对象推荐文章:https://www.cnblogs.com/nickup/p/9004594.html

6.4.4 exception对象

exception对象用于处理一些异常信息;

exception对象是Java.lang.Exception类的实例对象,它用于封装JSP中抛出的异常信息

注意exception对象只有在错误处理页面才可以使用,即page指令中指定了属性<%@ page isErrorPage=“true”%>的页面

6.5 JSP动作元素

JSP动作元素用来控制JSP的行为,执行一些常用的JSP页面动作。通过动作元素可以实现使用多行Java代码能够实现的效果,如包含页面文件,实现请求转发等

在这里插入图片描述

6.5.1 jsp:include动作元素

在JSP页面中,为了把其他资源的输出内容插入到当前JSP页面的输出内容中,JSP提供了jsp:include动作元素,格式如下:

<jsp:include page="relativeURL" flush="true|false" />

在上述语法格式中,page属性用于指定被引入资源的相对路径;flush属性用于指定是否将当前页面的输出内容刷新到客户端,默认情况下,flush属性的值为false

jsp:include包含的原理是将被包含其他页面编译处理后将结果包含在页面中。当浏览器第一次请求一个使用jsp:include包含其他页面的页面时,Web容器首先会编译被包含的页面,然后将编译处理后的返回结果包含在页面中,之后编译包含页面,最后将两个页面组合的结果回应给浏览器

注意include指令和jsp:include标签都能包含一个文件,但是它们有很大区别:

(1)jsp:include标签中要引入的资源和当前JSP页面是两个彼此独立的执行实体,即被动态引入的资源必须能够被Web容器独立执行。而includ指令只能引入循环JSP格式的文件,被引入文件与当前JSP文件需要共同合并才能翻译成一个Servlet源文件

(2)jsp:include标签中引入的资源是在运行时才包含的,而且只包含运行结果。而include指令引入的资源是在编译期间包含的,包含的是源代码

(3)jsp:include标签运行原理与RequestDispatcher.include()方法类似,即被包含的页面不能改变响应状态码或者设置响应头,而include指令没有这方面的限制

6.5.2 jsp:forward动作元素

jsp:forward:动作元素将当前请求转发到其他Web资源(HTML页面,JSP页面和Servlet等),在执行请求转发之后的当前页面将不再执行,而是执行该元素指定的目标页面。其具体语法格式如下:

<jsp:forward page="relativeURL" />

在上述语法中,page属性用于指定请求转发到的资源的相对路径,该路径是相当于当前JSP页面的URL

全文推荐文章:https://www.cnblogs.com/zhangyinhua/p/7637399.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值