1 简介
什么是Java Server Pages?
JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
2.JSP工作流程
· 与一般的页面一样,浏览器向Web服务器发送HTTP请求。
· Web服务器识别HTTP请求是针对JSP页面,并将其转发给JSP引擎。这可以通过使用以.jsp(而不是.html结尾)的URL或JSP页面完成。
· JSP引擎从磁盘加载JSP页面并将其转换为servlet内容。这个转换非常简单,所有模板文本都转换为out.write()语句,并将所有JSP元素转换为Java代码。此代码实现页面的相应动态行为。
· JSP引擎将servlet编译为可执行类,并将原始请求转发到servlet引擎。
· Servlet引擎的Web服务器加载Servlet类并执行它。在执行期间,servlet生成HTML格式的输出。HTTP响应中的servlet引擎将输出传递给Web服务器。
· Web服务器根据HTTP响应将静态HTML内容转发到浏览器。
· 最后,Web浏览器处理HTTP响应中动态生成的HTML页面,就像它是静态页面一样。
3. JSP生命周期
以下是JSP遵循的过程 -
1. 编译
2. 初始化
3. 执行
4. 清理
JSP生命周期的四个主要阶段与Servlet生命周期非常相似。
3.1 JSP编译
当浏览器请求JSP时,JSP引擎首先检查是否需要编译页面。
如果页面从未被编译,或者JSP从上一次编译以来JSP文件代码已被修改
那么JSP引擎将会编译页面。
编译过程包括三个步骤 -
· 解析JSP
· 将JSP转换为servlet
· 编译servlet
3.2 JSP初始化
当容器加载JSP时,它会在处理任何请求之前调用jspInit()方法。
public void jspInit(){
// Initialization code...
}
通常,初始化仅执行一次,并且与servlet的init()方法一样
2.3 JSP执行
JSP生命周期的这个阶段表示所有与请求的交互,直到JSP被销毁为止。
每当浏览器请求JSP并且页面已被加载和初始化时,
JSP引擎将调用JSP中的_jspService()方法。
_jspService()方法以HttpServletRequest和HttpServletResponse为参数,如下所示:
void _jspService(HttpServletRequest request, HttpServletResponse response) {
// Service handling code...
}
根据请求调用JSP的_jspService()方法。它负责生成请求的响应,此方法还负责生成对所有七种HTTP方法的响应,即GET,POST,DELETE等。
2.4.JSP清理
JSP生命周期的清理阶段表示当JSP被容器从使用中移除时。
jspDestroy()方法是等效于servlet的destroy方法的JSP方法。
jspDestroy()方法具有以下形式 –
public void jspDestroy() {
// Your cleanup code goes here.
}
2. JSP指令
JSP中有三种类型的指令标签 –
序号 | 指令 | 说明 |
1 | <%@ page ... %> | 定义页面相关属性,如脚本语言,错误页面和缓冲要求。 |
2 | <%@ include ... %> | 在编译阶段包括文件。 |
3 | <%@ taglib ... %> | 声明页面中使用的包含自定义操作的标签库 |
2.1 page指令
JSP中的page指令用于向容器提供与当前JSP页面相关的指令。可以在JSP页面的任何位置使用page指令进行编码。
按照惯例,page指令被编码在JSP页面的顶部。
<%@ page attribute = "value" %>
contentType属性
contentType属性设置JSP页面和生成的响应页面的字符编码。 默认内容类型为:text/html,它是HTML页面的标准内容类型。
以下语句指示向浏览器生成的页面呈现为HTML –
<%@ page contentType = "text/html" %>
还可以指定响应的字符编码。
例如,如果要指定返回浏览器的结果页面使用:UTF-8,则可以使用以下page指令
<%@ page contentType = "text/html:charset=UTF-8" %>
language属性
language属性指示在JSP页面脚本编写中使用的编程语言。
例如,由于通常我们使用Java作为脚本语言,因此language选项可设置成如下:
<%@ page language = "java" %>
2.2 include指令
include指令用于在编译阶段包括一个文件。这个指令告诉容器在编译阶段将其他外部文件的内容合并到当前JSP文件中。
可在JSP页面的任何位置使用include指令进行编码。
本指令的一般用法形式如下:
<%@ include file = "relative url" >
例如,一般的jsp文件头设置语言,字符集编码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
2.3 taglib指令
taglib指令声明JSP页面使用一组自定义标签,标识库的位置,并提供了在JSP页面中标识自定义标签的方法。
taglib指令遵循下面给出的语法 –
<%@ taglib uri="uri" prefix = "prefixOfTag" >
这里,uri属性值解析为容器理解的位置,并且prefix属性通知容器什么位置的标记是自定义操作。
例如:使用JSTL:需要导入标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
3. JSP动作
3.1 jsp:include
此动作允许将文件插入到正在生成的页面中。语法如下所示 –
<jsp:include page = "relative URL"/>
与在将JSP页面转换为servlet时将文件插入的include指令不同,此动作在请求页面时插入该文件。
<%page include file="header.jsp"> 和 <jsp:include page="header.jsp">区别
两者显示的页面是相同的,只是客户端请求访问该jsp生成的对应java代码不同
<%page include file="header.jsp">调用这个的jsp文件在客户端访问时只会生成一个servlet_jsp.java文件,将两者合二为一,通常用于头部导航条
<jsp:include page="header.jsp">则分别会生成servlet_jsp.java和header_jsp.java文件