【JavaWeb学习】05:JSP技术

第五章:JSP技术


在这里插入图片描述

在动态网页开发中经常需要动态生成HTML页面内容,如果使用Servlet来实现需要调用大量输出语句(静态、动态内容相互混合),导致程序臃肿。为了解决Servlet出现的问题,Oracle公司推出了JSP技术(实现动、静态内容分离):

一、JSP概述

1.JSP概念:

JSP(Java Servlet Page)是建立在Servlet规范之上的动态网页开发技术,在JSP文件中HTML与Java代码共同存在。

注意:JSP页面中的HTML代码用于实现网页中静态内容显示,Java代码用于实现动态内容的显示。

JSP技术开发的Web应用程序是基于Java的,其可用一种简洁而快速的方法从Java程序生成Web页面,其主要特点如下:

  1. 跨平台性:当从一个平台移植到另一个平台时,JSP和JavaBean的代码并不需要重新编译(Java字节码与平台无关),一次编译到处运行(由Java的跨平台性影响)
  2. 业务代码分离:可将界面的开发、应用程序的开发相互分离(开发人员使用HTML设计页面、JSP标签与脚本动态生成页面内容;服务器端JSP引擎,负责解析JSP标签与脚本程序生成请求内容、并以HTML的形式返回)
  3. 组件重用:可使用JavaBean编写业务组件(使用JavaBean类封装业务处理代码 or 作为数据存储模型),在整个项目中or其他Java应用程序都可以重复使用该Javabean
  4. 预编译:在用户第1次通过浏览器访问JSP页面时,服务器对JSP页面代码进行编译(仅执行一次),编译后的代码将被保存用于下次用户的访问。(节省CPU资源、提高访问速度)

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

2.JSP运行原理

在这里插入图片描述

  1. step1:请求发送:客户端发出请求(访问JSP文件),JSP容器将JSP文件转换成一个Java源文件(Java Servlet源程序);在转换过程中如果发现JSP文件的异常,则中断并向服务端和客户端返回出错信息。
  2. step2:文件转换:若转换成功完成,则JSP容器将生成的Java源文件编译成相应的class字节码文件,该class就是一个Servlet(Servlet容器会像处理其他Servlet一样处理该class字节码文件)
  3. step3:实例创建:由Servlet容器加载转换后的Servlet类(class文件),创建一个该Servlet实例常驻内存中,并执行Servlet的jspInit()方法。(jspInit()方法在Servlet的整个生命周期中只执行一次)
  4. step4:处理请求:将执行jspService()`方法处理客户端请求,对于每一个请求JSP容器都会创建一个新线程进行处理
  5. step5:响应回传:当请求处理完成后响应对象由JSP容器接收,并以HTML格式的响应信息发送回客户端
  6. step6:资源回收:由于系统资源不足等情况JSP容器可能会以某种不确定的方式将Servlet从内存中移除,首先会调用jspDestroy()方法、然后Servlet实例会被加入垃圾收集处理

注意:HelloWorld转换后的源文件没有实现Servlet接口,但继承了HttpJspBase类(HttpServlet子类),故jsp文件就是一个Servlet

二、JSP语法

1.JSP脚本元素

JSP脚本是指嵌套在<%%>之间的一条 or 多条Java程序代码,通过JSP脚本元素可以将Java代码嵌入到HTML页面中。

注意:所有可执行的Java代码,都可通过JSP脚本来执行

在这里插入图片描述

(1)JSP Scriptlets`:

JSP Scriptlets是一段代码段,当需要使用Java实现复杂操作 or 控制时可使用,其语法格式如下:

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

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

(2)JSP声明语句:

JSP的声明语句用于声明变量和方法,嵌套在<%!%>之间,其语法格式如下:

<%! 定义的变量or方法 %>

注意:

  1. 在上述语法格式中,被声明的Java代码将被编译到Servlet的jspService()方法之外(在JSP声明语句中定义的都是成员方法、成员变量、静态方法、静态变量、静态代码块等)。
  2. 在JSP声明语句中声明的方法在整个JSP页面内有效,但是在方法内定义的变量只在该方法内有效。
  3. 在一个JSP页面中可以有多个JSP声明语句,单个声明中的Java语句可以是不完整的,但是多个声明组合后的结果必须是完整的Java语句。
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" text/html; charset=UTF-8">
		<title>JSP声明语句</title>
	</head>
		<%!	int a = 1, b = 2; //定义声明两个变量a, b %>
		<%! 
			//定义声明一个Print()方法
			public String print() {
				return "itcast";
			}
		%>
	<body>
		<% out.println(a + b); %>
		<% out.println(print());//调用print()方法输出其返回值 %>
	</body>
</html>

在这里插入图片描述

总结:JSP程序中使用了<%!%>对两个变量a、b以及print()方法的定义,<%%>主要用来进行内容的输出。

(3)JSP表达式:

JSP表达式(expression)用于将程序数据输出到客户端,将要输出的变量 or 表达式直接封装在以<%=开头和以%>结尾的标记中:

<%= expression %>

注意:

  1. <%=%>标记之间插入的是表达式,不能插入语句。
  2. 在上述语法格式中,JSP表达式中的变量 or 表达式的计算结果将被转换成一个字符串,然后插入到JSP页面输出结果的相应位置
2.JSP注释
<%-- 注释信息 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" text/html; charset=UTF-8">
		<title>JSP注释</title>
	</head>
	<body>
		<!-- 这个是HTML注释 -->
		<%-- 这个是JSP注释 --%>
	</body>
</html>

在这里插入图片描述

查看网页页面的源文件:

在这里插入图片描述

从源文件中可以看出,JSP的注释信息没有显示出来,而只显示除了HTML注释。

总结:在Tomcat编译JSP文件时,会将HTML注释当成普通文本发送到客户端,而JSP页面格式为<%-- 注释信息 --%>的内容会忽略,但由于HTML注释也是一种注释故最后的HTML页面中不会显示任何内容。

三、JSP指令

为了设置JSP页面中的一些信息,Sun公司提供了JSP指令:

1.page指令

在JSP页面中经常需要对页面的某些特性(页面的编码方式、JSP页面采用的语言)进行描述,这时可以通过page指令来实现:

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

在上面的语法格式中,page用于声明指令名称,属性用来指定JSP页面的某些特性,如下:

属性名称取值范围描述
languagejava指明解释该JSP文件时采用的语言,默认为Java
import任何包名、类名指定在JSP页面翻译成的Servlet源文件中导入的包 or 类
sessiontrue、false指明该JSP是否内置Session对象(默认为true)
isErrorPagetrue、false指明该页面是否为错误页面(默认为false),内置一个Exception对象的exception
errorPage某个JSP页面的相对路径指定一个错误页面errorPage
contentType有效的文档类型客户端浏览器根据该属性判断文档类型
pageEnCoding当前页面指定页面编码格式

注意:

  1. import是唯一可以声明多次的page指令属性,一个import属性可以引用多个类(中间用英文逗号隔开)
  2. JSP引擎自动导入以下4个包:java.lang.*、javax.servelet.*、javax.servlet.jsp.*、javax.servlet.http.*
2.include指令

在实际开发时,有时需要在JSP页面静态包含一个文件,例如HTML文件、文本文件等,这时可以通过include指令来实现:

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

注意:file属性用于指定插入到JSP页面目标位置的文件资源,插入文件的路径一般不以/开头,而必须使用相对路径

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<title>欢迎你</title>
	</head>
	<body>
		欢迎你,现在的时间是:
		<%@ include file = "6-3_date.jsp" %>
	</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<title>date</title>
	</head>
	<body>
		<% out.println(new java.util.Date().toLocaleString()); %>
	</body>
</html>

在这里插入图片描述

注意:

  1. 被引入的文件必须遵循JSP语法,其内容一般包含静态HTML、JSP脚本元素 及 JSP指令等
  2. 除了指令元素之外,被引入的文件中的其他元素都被转换成相应的Java源代码,然后插入当前JSP页面翻译成的Servlet源文件中(插入位置与include指令在当前JSP页面中的位置保持一致)

四、JSP隐式对象

在JSP页面中有一些对象需要频繁使用,为了简化web应用的开发JSP2.0规范中提供了9个隐式(内置)对象,由JSP默认创建可直接使用。

隐式对象
out
request
response
config
session
application
page
pageContext
exception
1.out对象

在JSP页面中需要向客户端发送文本内容,可以使用out对象(为`javax.servlet.jsp.JspWriter类的实例对象)实现。

out对象的作用与ServletResponse.getWriter()方法返回的PrintWriter对象相似,都是向客户端发送文本形式的实体内容。

注意:不同的是out对象的类型为JspWriter,相当于一种带缓存功能的PrintWriter

在这里插入图片描述

从图中可以看出,在JSP页面中通过out隐式对象写入数据相当于将数据插入到JSPWriter对象的缓冲区中,如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<title>Insert title here</title>
	</head>
	<body>
		<%
			out.println("first line<br />");
			response.getWriter().println("second line<br />");
		%>
	</body>
</html>

在这里插入图片描述

描述:尽管out.println()语句位于response.getWriter().println()之前,但其输出的内容却在后面。

总结:

  1. 由此可以知,out对象通过print语句写入数据后,直到整个JSP页面结束out对象中输入缓冲区的数据才真正写入到Servlet引擎提供的缓冲区中。
  2. Servlet引擎按照缓冲区中的数据存放顺序输出内容

有时开发者希望out对象可以直接将数据写入Servlet引擎提供的缓冲区,这时可以使用page指令中的buffer属性实现:

point1:使用page指令设置out对象的缓冲区大小

<%@ page language="java" contentType="text/html; charset=UTF-8" buffer="0kb"%>
<!DOCTYPE html>
<html>
	<head>
		<title>Insert title here</title>
	</head>
	<body>
		<%
			out.println("first line<br />");
			response.getWriter().println("second line<br />");
		%>
	</body>
</html>

在这里插入图片描述

在设置完buffer="0kb"属性之后,out对象中的数据直接写入到了Servlet引擎提供的缓冲区中

2.pageContext对象

在JSP页面中使用pageContext对象可以获取JSP的其他8个隐式对象,代表着当前JSP页面的运行环境

pageContext对象获取隐式对象的方法如下:

在这里插入图片描述

pageContext对象不仅能够获取其他隐式对象,还能提供存储数据的功能(通过操作属性来实现):

方法说明
void setAttribute(String name, Object value, int scope)用于设置pageContext对象属性
void getAttribute(String name, int scope)用于获取pageContext对象属性
void removeAttribute(String name, int scope)从指定范围内删除名为name的属性
void removeAttribute(String name, Object value, int scope)删除所有范围内名为name的属性
void findAttribute(String name)从4个域对象中查找名为name的属性

注意:使用findAttribute()方法查找名为name的属性时,会按照page、request、session和application的顺序依次进行查找,null

3.exception对象

在JSP页面中处理异常信息时可以通过exception对象来实现,用于封装JSP中抛出的异常信息。

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

<%@ page language="java" contentType="text/html; charset=UTF-8" errorPage="error.jsp"%>
<!DOCTYPE html>
<html>
	<head>
		<title>exception object test</title>
	</head>
	<body>
		<% 
			int a = 3;
			int b = 0;
		%>
		输出结果为:<%= (a / b)%>
	</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
	<head>
		<title>error page</title>
	</head>
	<body>
		<%=exception.getMessage() %>
	</body>
</html>

在这里插入图片描述

五、JSP动作

JSP动作元素用来控制JSP的行为,执行一些常用的JSP页面动作。

通过动作元素可以实现使用多行Java代码能够实现的效果,如包含页面文件、实现请求转发等

1.<jsp:include>动作元素

为了将其他资源的输出内容插入到当前JSP页面中,JSP技术提供了<jsp:include>动作元素,具体语法格式如下:

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

<jsp:include>包含的原理是将被包含的页面编译处理后,将其结果包含在页面中

在浏览器第1次请求一个(使用<jsp:include>包含其他页面的)页面时:

  1. web容器会先编译被包含的页面,然后将处理后返回的结果包含在页面中。
  2. 之后编译包含页面,最后将两个页面组合的结果回应给浏览器。
(1)<jsp:include>的基本使用:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<title>include</title>
	</head>
	<body>
		<%Thread.sleep(5000); %>
		included.jsp内的中文<br />
	</body>
</html>
<!DOCTYPE html>
<html>
	<head>
		<title>dynamicInclude page</title>
	</head>
	<body>
		dynamicInclude内的中文
		<br />
		<jsp:include page="6-10_included.jsp" flush="true" />
	</body>
</html>

在这里插入图片描述

结果分析:浏览器访问dynamicInclude.jsp页面时,首先输入了页面中的内容后等待了5s才显示了included.jsp页面中的内容。这说明被引用的资源在当前jsp页面输出内容后才会被调用

注意:Tomcat调用被引入的资源included.jsp时,并没有将当前JSP页面中已输出的内容刷新到客户端。

(2)include指令与<jsp:include>标签的区别:

include指令与<jsp:include>标签都能够包含一个文件,但他们之间有很大区别

  • diff1:引入资源与JSP文件是否独立:

<jsp:include>标签中要引入的资源和当前JSP页面是两个彼此独立的执行实体(被动态引入的资源必须能够被web容器独立执行)。

include指令只能引入JSP格式的文件,被引入文件与当前JSP文件需要共同合并才能翻译成一个Servlet文件。

  • diff2:包含的时间不同、内容不同:

<jsp:include>标签中引入的资源是在运行时才包含的,而且只包含运行结果。

include指令引入的资源是在编译时期包含的,包含的是源代码。

  • diff3:被包含的页面不能改变响应状态码 or 设置设置响应头:

<jsp:include>标签运行原理与RequestDispatcher.include()方法类似,即被包含的页面不能改变响应状态码 or 设置响应头

include指令没有上述限制。

2.<jsp:forward>动作元素

<jsp:forward>动作元素将当前请求转发到其他web资源(HTML页面、JSP页面和Servlet等),具体语法格式如下:

<jsp:forward page="relativeURL" />
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<title>forward page</title>
	</head>
	<body>
		<jsp:forward page="6-13_welcome.jsp"/>
	</body>
</html>
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<title>welcome page</title>
	</head>
	<body>
		您好,欢迎进入首页当前访问时间是:
		<%
			out.print(new Date());
		%>
	</body>
</html>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值