《Java Web程序设计任务教程》简要复盘:第六章 JSP技术
作者:氯磷Rolin
目录:
- 第一章:网页开发基础(无)
- 第二章:Java Web概述
- 第三章:Servlet基础
- 第四章:请求与响应
- 第五章:会话及其会话技术
- 第六章:JSP技术
- 第七章:EL表达式和JSTL
- 第八章:Servlet的高级特性
- 第九章:JDBC
- 第十章:数据库连接池与DBUtils工具
- 第十一章:JSP开发模型
- 第十二章:文件的上传和下载
第六章 JSP技术
在动态网页的开发中,经常需要动态生成HTML内容,如果使用Servlet来实现HTML页面的更新,需要调用大量的输出语句,使静态和动态内容混合在一起,导致程序非常臃肿。
为了克服这些缺点,Oracle(SUN)公司推出了JSP技术。
什么是JSP
- JSP全名Java Server Pages,它用于简捷而快速的生成Web界面
- 因为Servlet展示信息不方便,所以引入了JSP技术
- JSP本质上是一个Servlet!!
- JSP就是在HTML页面的基础上嵌入了Java代码
- JSP也拥有java的众多特征,例如:跨平台性,业务代码相分离,组件重用,预编译等
JSP的运行原理
- 原理图
- JSP的具体运行过程
- 客户端发出请求给JSP容器(Tomcat),请求访问JSP文件
- JSP容器将JSP文件转换成一个Java Servlet源文件,如果出错则会输出错误信息
- JSP容器再将Java Servlet源文件编译成相应的*.class字节码文件
- 由Tomcat加载*.class文件,创建一个Servlet实例,并且调用jspInit()方法进行初始化
- 执行jspService()方法处理客户端的请求。和Servlet一样,多个客户端同时请求该JSP文件则JSP容器也会创建多个线程来处理它们。
- 如果JSP文件被修改了,则根据设置服务器将决定是否对该文件进行重新编译。
- 由于第一次调用时需要转换和编译,往往会产生一些延迟或卡顿
- 当请求处理完成后,响应对象由JSP容器接收,并将HTML格式的响应信息发送回客户端
- 由于系统资源不足或其他原因,JSP容器可能会以某种不确定的方式将编译好的Servlet移出内存,此时Servlet会先调用jspDestroy()方法,然后该实例会被加入垃圾回收系统处理
虽然JSP类不实现Servlet接口,但是继承自HttpJspBase类
由于HttpJspBase类是HttpServlet的一个子类,由此JSP编译生成的java类实质上就是一个Servlet
JSP的基本语法
JSP文件中可以嵌套很多内容,例如JSP的脚本元素和注释等,这些内容的编写需要遵循一定的语法规范
- JSP脚本元素
JSP脚本元素是指嵌套在
<%
和%>
之间的Java程序代码。通过JSP脚本元素可以将Java代码嵌入到HTML页面中,所有可执行的Java代码都可以通过JSP脚本来执行
- JSP脚本元素主要包括如下三种类型:
- JSP Scriptlets
- JSP 声明语句
- JSP 表达式
- JSP脚本元素语法:
标签 | 语法 | 用途 |
---|---|---|
程序代码标签(JSP Scriptlets) | <% 此处输入Java程序代码 %> |
编写Java程序代码,但不可以定义代码,此时在编译后这段代码是放在jspService()里的 |
JSP声明语句 | <%! 变量或方法的声明 %> |
声明JSP内所使用的成员方法、成员变量、静态方法、静态变量、静态代码块等 在其声明的方法在整个JSP页面都有效,此时在编译后这段代码是放在jspService()外的 |
JSP表达式 | <%=变量%> |
用于将程序数据输出到客户端,即将java中的变量或者表达式的值输出到页面上 |
JSP注释 | <%-- 注释信息 --%> |
Tomcat在编译JSP页面时会自动忽略JSP注释内容,不会将注释信息发送到客户端。而在JSP页面编写的HTML注释会被发送到客户端 |
JSP指令
JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。
为了设置JSP页面的一些信息,Sun公司提供了JSP指令。JSP2.0中定义了page、include等指令,每种指令都定义了各自的属性。
page指令
page指令称为页面指令,用来定义JSP页面的全局属性,该配置会作用域整个页面。
page指令的属性可以定义MIME类型、定义需要导入的包、错误页的指定等。
- page指令的语法格式如下:
<%@page 属性1=“属性值1” 属性2=“属性值2”%>
- page指令的常用属性:
属性名称 | 取值范围 | 描述 |
---|---|---|
language | java | 指明解释该JSP文件时采用的语言,默认为Java |
import | 任何包名和类名 | 指明在JSP页面翻译成Servlet时导入的包或类。是唯一一个可以多次引用的指令属性 |
session | true\false | 指明该JSP内是否内置Session对象,默认为true |
isErrorPage | true\false | 指定该页面是否为错误处理页面,如果为true,则说明内置Exception对象的exception,可以直接使用 |
errorPage | 某个JSP页面的相对路径 | 指定一个错误页面,如果该JSP抛出一个未被捕捉的异常,则转到该属性指定的页面 |
contentType | 有效的文档类型 | 客户端浏览器根据该属性判断文档类型 |
pageEnCoding | 当前页面 | 指定页面编码格式 |
- page指令的其他属性:
属性名称 | 描述 |
---|---|
extends | 指定JSP页面产生的Servlet继承的父类 |
buffer | 指定缓冲区的大小,默认是8KB。如果为none,则表示不设置缓冲区。(此属性要和autoFlush一起使用) |
autoFlush | 指定输出缓冲区即将溢出时,是否强制输出缓冲区的内容。可以设置为true或false(默认为true) |
isThreadSafe | 指定JSP是否支持多线程。可以设置为true或false,若为true,则表示该页面可以处理多个用户的请求;如果为false,则此JSP一次只能处理一个页面的用户请求。 |
info | 设置JSP页面的相关信息。可以使用servlet.getServletInfo()方法获取到JSP页面中的文本信息 |
isELIgnored | 指定JSP文件是否支持EL表达式 |
除了import属性外,其他的属性都只能出现一次,否则会编译失败。
page指令的属性名称都是区分大小写的
include指令
include指令是文件加载指令,用于在JSP中插入一个包含文件或代码的文件,这个包含的过程是静态包含。
它把文件插入后与原来的JSP文件合并成一个新的JSP页面(注意:如果被插入的内容发送改变,则包含这个页面的JSP文件就需要重新编译)。
- 具体语法:
<%@ include file="head.html"%>
- 属性
include指令只有一个file属性,该属性用来指定插入到JSP页面目标位置的文件资源。
插入文件的路径一般不以/
开头,而是使用相对路径 - 示例:在一个网站所有链接都插入同一个导航栏
在一个空白的HTML页面中直接使用include指令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试页面</title>
<link href="${pageContext.request.contextPath}/css/usercenter.css" type="text/css" rel="stylesheet"/>
<link rel="icon" type="image/ico" sizes=&