简介:
JSP与PHP、ASP、ASP.NET等语言类似,运行在服务端的语言。
JSP(全称Java Server Pages)是由Sun Microsystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成``HTML
、XML
或其他格式文档的Web
网页的技术标准。
JSP技术是以Java
语言作为脚本语言的,JSP
网页为整个服务器端的Java
库单元提供了一个接口来服务于HTTP
的应用程序。
JSP文件后缀名为(*.jsp
)。
JSP开发的WEB应用可以跨平台使用,既可以运行在Linux上也能运行在Window上。
JSP全称Java Server Pages,是一种动态网页开发技术。
它使用JSP标签在HTML
网页中插入Java
代码。标签通常以<%
开头以%>
结束。
JSP是一种Java servlet
,主要用于实现Java web
应用程序的用户界面部分。网页开发者们通过结合HTML
代码、XHTML
代码、XML
元素以及嵌入JSP
操作和命令来编写JSP
。
JSP
通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
jsp标签作用:
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans
组件等,还可以在不同的网页中传递控制信息和共享信息。
为什么使用JSP?
JSP程序与CGI程序有着相似的功能,但和CGI程序相比,JSP程序有如下优势:
1)性能更加优越,因为JSP可以直接在HTML网页中动态嵌入元素而不需要单独引用CGI文件。
2)服务器调用的是已经编译好的JSP
文件,而不像CGI/Perl
那样必须先载入解释器和目标脚本。
3)JSP基于Java Servlets API
,因此,JSP拥有各种强大的企业级Java API
,包括JDBC,JNDI,EJB,JAXP
等等。
4)JSP页面可以与处理业务逻辑的servlets一起使用,这种模式被Java servlet 模板引擎所支持。
5)最后,JSP是Java EE不可或缺的一部分,是一个完整的企业级应用平台。这意味着JSP可以用最简单的方式来实现最复杂的应用。
JSP的优势 :
以下列出了使用JSP带来的其他好处:
1)与ASP相比:JSP有两大优势。首先,动态部分用Java
编写,而不是VB
或其他MS
专用语言,所以更加强大与易用。第二点就是JSP
易于移植到非MS
平台上。
2)与纯 Servlets相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。
3)与SSI相比:SSI无法使用表单数据、无法进行数据库链接。
4)与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。
5)与静态HTML相比:静态HTML不包含动态信息。
JSP 结构
网络服务器需要一个JSP
引擎,也就是一个容器来处理JSP
页面。容器负责截获对JSP
页面的请求。本教程使用内嵌JSP
容器的Apache
来支持JSP
开发。
JSP容器
与Web服务器
协同合作,为JSP
的正常运行提供必要的运行环境和其他服务,并且能够正确识别专属于JSP
网页的特殊元素。
下图显示了JSP容器和JSP文件在Web应用中所处的位置。
JSP处理
以下步骤表明了Web服务器是如何使用JSP来创建网页的:
1)就像其他普通的网页一样,您的浏览器发送一个HTTP
请求给服务器。
2)Web
服务器识别出这是一个对JSP
网页的请求,并且将该请求传递给JSP
引擎。通过使用URL
或者.jsp
文件来完成。
3)JSP
引擎从磁盘中载入JSP
文件,然后将它们转化为servlet
。这种转化只是简单地将所有模板文本改用println()
语句,并且将所有的JSP
元素转化成Java
代码。
4)JSP
引擎将servlet
编译成可执行类,并且将原始请求传递给servlet
引擎。
5)Web
服务器的某组件将会调用servlet
引擎,然后载入并执行servlet
类。在执行过程中,servlet
产生HTML
格式的输出并将其内嵌于HTTP response
中上交给Web
服务器。
6)Web
服务器以静态HTML
网页的形式将HTTP response
返回到您的浏览器中。
7)最终,Web
浏览器处理HTTP response
中动态产生的HTML
网页,就好像在处理静态网页一样。
一般情况下,JSP
引擎会检查JSP
文件对应的servlet
是否已经存在,并且检查JSP
文件的修改日期是否早于servlet
。如果JSP文件的修改日期早于对应的servlet
,那么容器就可以确定JSP
文件没有被修改过并且servlet
有效。这使得整个流程与其他脚本语言(比如PHP)相比要高效快捷一些。
总的来说,JSP
网页就是用另一种方式来编写servlet
而不用成为Java
编程高手。除了解释阶段外,JSP
网页几乎可以被当成一个普通的servlet
来对待。
JSP 生命周期
理解JSP
底层功能的关键就是去理解它们所遵守的生命周期。
JSP
生命周期就是从创建到销毁的整个过程,类似于servlet
生命周期,区别在于JSP
生命周期还包括将JSP
文件编译成servlet
。
以下是JSP生命周期中所走过的几个阶段:
- 编译阶段:
servlet容器编译jsp源文件,生成servlet类
2)初始化阶段:
加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
3)执行阶段:
调用与JSP对应的servlet实例的服务方法
4)销毁阶段:
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
很明显,JSP生命周期的四个主要阶段和servlet生命周期非常相似,下面给出图示:
-
JSP编译
当浏览器请求JSP
页面时,JSP
引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP
文件。
分三个小步骤:解析JSP文件。
将JSP文件转为servlet。
编译servlet。
2)JSP初始化
容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果您需要执行自定义的JSP初始化任务,复写jspInit()方法就行了,就像下面这样:
public void jspInit(){
// 初始化代码
}
一般来讲程序只初始化一次,servlet
也是如此。通常情况下您可以在jspInit()
方法中初始化数据库连接、打开文件和创建查询表。
3)JSP执行
这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。
当JSP
网页完成初始化后,JSP
引擎将会调用_jspService()
方法。
_jspService()
方法需要一个HttpServletRequest
对象和一个HttpServletResponse
对象作为它的参数,就像下面这样:
void _jspService(HttpServletRequest request,
HttpServletResponse response)
{
// 服务端处理代码
}
_jspService()
方法在每个request
中被调用一次并且负责产生与之相对应的response
,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。
4)JSP清理
JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切。
jspDestroy()方法在JSP中等价于servlet中的销毁方法。当您需要执行任何清理工作时复写jspDestroy()方法,比如释放数据库连接或者关闭文件夹等等。
jspDestroy()方法的格式如下:
public void jspDestroy()
{
// 清理代码
}
JSP 语法
脚本程序可以包含任意量的Java
语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
脚本程序的语法格式:
<% 代码片段 %>
或者,您也可以编写与其等价的XML语句,就像下面这样:
代码片段
任何文本、HTML标签、JSP元素必须写在脚本程序的外面。
中文编码问题
如果我们要在页面正常显示中文,我们需要在 JSP 文件头部添加以下代码:<>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
JSP声明
一个声明语句可以声明一个或多个变量、方法,供后面的Java
代码使用。在JSP
文件中,你必须先声明这些变量和方法然后才能使用它们。
<%! declaration; [ declaration; ]+ ... %>
或者,也可以编写与其等价的XML语句,就像下面这样:
代码片段
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
JSP表达式
一个JSP
表达式中包含的脚本语言表达式,先被转化成String
,然后插入到表达式出现的地方。
由于表达式的值会被转化成String
,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML
标签。
JSP表达式的语法格式:
<%= 表达式 %>
同样,您也可以编写与之等价的XML语句:
表达式
一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。
由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。
表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。
JSP注释
JSP注释主要有两个作用:为代码作注释以及将某段代码注释掉。
<%-- 注释的内容 --%>
JSP指令
JSP指令用来设置与整个JSP页面相关的属性。
JSP指令语法格式:
<%@ directive attribute="value" %>
这里有三种指令标签:
<%@ page ... %> 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include ... %> 包含其他文件
<%@ taglib ... %> 引入标签库的定义,可以是自定义标签
JSP行为
JSP行为标签使用XML语法结构来控制servlet引擎。它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等。
行为标签只有一种语法格式,它严格遵守XML标准:
JSP隐含对象
JSP指令
JSP指令用来设置整个JSP页面属性,如网页的编码方式和脚本语言。
<%@ directive attribute="value" %>
- page指令
Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
<%@ page attribute="value" %>
等价的XML格式:
- Include指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file="文件相对 url 地址" %>
- Taglib指令
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
Taglib指令的语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
JSP 动作元素
与JSP指令元素不同的是,JSP动作元素在请求处理阶段起作用。JSP动作元素是用XML语法写成的。
利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。
常见的属性
所有的动作要素都有两个属性:id属性和scope属性。
id属性:
id属性是动作元素的唯一标识,可以在JSP页面中引用。动作元素创建的id值可以通过PageContext来调用。
scope属性:
该属性用于识别动作元素的生命周期。 id属性和scope属性有直接关系,scope属性定义了相关联id对象的寿命。 scope属性有四个可能的值:(a) page
,(b)request
,(c)session
, 和 (d) application
。
jsp:useBean 动作用来加载一个将在JSP页面中使用的JavaBean。
jsp:plugin动作用来根据浏览器的类型,插入通过Java插件 运行Java Applet所必需的OBJECT或EMBED元素。
动作元素动态定义XML元素。动态是非常重要的,这就意味着XML元素在编译时是动态生成的而非静态。
模板数据
JSP 隐式对象
request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。
response对象
response对象是javax.servlet.http.HttpServletResponse类的实例。当服务器创建request对象时会同时创建用于响应这个客户端的response对象。
response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies,时间戳,HTTP状态码等等。