2.JSP(全称Java Server Pages)是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。
5.JSP开发的WEB应用可以跨平台使用,既可以运行在 Linux 上也能运行在 Windows 上.
cJSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
d.JSP标签有多种功能,比如 访问数据库 、 记录用户选择信息 、 访问JavaBeans组件 等,还可以 在不同的网页中传递控制信息和共享信息 。
3.jsp原理
JSP 结构
网络服务器需要一个 JSP 引擎,也就是一个容器来处理 JSP 页面。容器负责截获对 JSP 页面的请求。本教程使用内嵌 JSP 容器的 Apache 来支持 JSP 开发。
JSP 容器与 Web 服务器协同合作,为JSP的正常运行提供必要的运行环境和其他服务,并且能够正确识别专属于 JSP 网页的特殊元素。
下图显示了 JSP 容器和 JSP 文件在 Web 应用中所处的位置。
JSP 处理
以下步骤表明了 Web 服务器是如何使用JSP来创建网页的:
就像其他普通的网页一样,您的浏览器发送一个 HTTP 请求给服务器。
Web 服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎。通过使用 URL或者 .jsp 文件来完成。
JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet。这种转化只是简单地将所有模板文本改用 println() 语句,并且将所有的 JSP 元素转化成 Java 代码。
JSP 引擎将 Servlet 编译成可执行类,并且将原始请求传递给 Servlet 引擎。
Web 服务器的某组件将会调用 Servlet 引擎,然后载入并执行 Servlet 类。在执行过程中,Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。
Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到您的浏览器中。
最终,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容器编译servlet源文件,生成servlet类
初始化阶段: 加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
执行阶段: 调用与JSP对应的servlet实例的服务方法
销毁阶段: 调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
很明显,JSP生命周期的四个主要阶段和servlet生命周期非常相似,下面给出图示:
JSP编译
当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。
编译的过程包括三个步骤:
解析JSP文件。——> 将JSP文件转为servlet ——> 编译servlet。
JSP初始化
容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果您需要执行自定义的JSP初始化任务,复写jspInit()方法就行了,就像下面这样:
public void jspInit (){
// 初始化代码
}
一般来讲程序只初始化一次,servlet也是如此。通常情况下您可以在jspInit()方法中初始化数据库连接、打开文件和创建查询表。
JSP执行
这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。
当JSP网页完成初始化后,JSP引擎将会调用_jspService()方法。
_jspService()方法需要一个HttpServletRequest对象和一个HttpServletResponse对象作为它的参数,就像下面这样:
void _jspService ( HttpServletRequest request ,
HttpServletResponse response )
{
// 服务端处理代码
}
_jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。
JSP清理
JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切。
jspDestroy()方法在JSP中等价于servlet中的销毁方法。当您需要执行任何清理工作时复写jspDestroy()方法,比如释放数据库连接或者关闭文件夹等等。
jspDestroy()方法的格式如下:
public void jspDestroy ()
{
// 清理代码
}
实例
JSP生命周期代码实例如下所示:
<%@ page language = "java" contentType = "text/html; charset=UTF-8"
pageEncoding = "UTF-8" %>
life.jsp
<%!
private int initVar = 0 ;
private int serviceVar = 0 ;
private int destroyVar = 0 ;
%>
<%!
public void jspInit (){
initVar ++;
System . out . println ( "jspInit(): JSP被初始化了" + initVar + "次" );
}
public void jspDestroy (){
destroyVar ++;
System . out . println ( "jspDestroy(): JSP被销毁了" + destroyVar + "次" );
}
%>
<%
serviceVar ++;
System . out . println ( "_jspService(): JSP共响应了" + serviceVar + "次请求" );
String content1 = "初始化次数 : " + initVar ;
String content2 = "响应客户请求次数 : " + serviceVar ;
String content3 = "销毁次数 : " + destroyVar ;
%>
菜鸟教程 JSP 测试实例
<%= content1 %>
<%= content2 %>
<%= content3 %>
浏览器打开该页面,输出结果为:
4.jsp语法
<% 代码片段 %> --插入java代码,脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的
<%!expression %> --jsp声明,一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。
<%=表达式%> --jsp表达式,
一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。
由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。
表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。
<%-- 注释 --%> --jsp
不同情况下使用注释的语法规则:
语法
描述
<%-- 注释 --%>
JSP注释,注释内容不会被发送至浏览器甚至不会被编译
HTML注释,通过浏览器查看网页源代码时可以看见注释内容
<\%
代表静态 <%常量
%\>
代表静态 %> 常量
\'
在属性中使用的单引号
\"
在属性中使用的双引号
5.jsp指令
JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。
语法格式如下:
<%@ 指令 属性 = "value" %>
指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开。
JSP中的三种指令标签:
指令
描述
<%@ page ... %>
定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include ... %>
包含其他文件
<%@ taglib ... %>
引入标签库的定义
Page指令
Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
Page指令的语法格式:
<%@ page attribute = "value" %>
等价的XML格式:
attribute = "value" />
属性
下表列出与Page指令相关的属性:
属性
描述
buffer
指定out对象使用缓冲区的大小
autoFlush
控制out对象的 缓存区
contentType
指定当前JSP页面的MIME类型和字符编码
errorPage
指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage
指定当前页面是否可以作为另一个JSP页面的错误处理页面
extends
指定servlet从哪一个类继承
import
导入要使用的Java类
info
定义JSP页面的描述信息
isThreadSafe
指定对JSP页面的访问是否为线程安全
language
定义JSP页面所用的脚本语言,默认是Java
session
指定JSP页面是否使用session
isELIgnored
指定是否执行EL表达式
isScriptingEnabled
确定脚本元素能否被使用
Include指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file = "文件相对 url 地址" %>
include 指令中的文件名实际上是一个相对的 URL 地址。
如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。
等价的XML语法:
file = "文件相对 url 地址" />
Taglib指令
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
Taglib指令的语法:
<%@ taglib uri = "uri" prefix = "prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。
等价的XML语法:
uri = "uri" prefix = "prefixOfTag" />
6.jsp动作元素
动作元素具体教程
与JSP指令元素不同的是,JSP动作元素 在请求处理阶段起作用 。JSP动作元素 是用XML语法写成的 。
利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。
动作元素只有一种语法,它符合XML标准:
attribute = "value" />
动作元素基本上都是预定义的函数,JSP规范定义了一系列的标准动作,它用JSP作为前缀,可用的标准动作元素如下:
语法
描述
jsp:include
在页面被请求的时候引入一个文件。
jsp:useBean
寻找或者实例化一个JavaBean。
jsp:setProperty
设置JavaBean的属性。
jsp:getProperty
输出某个JavaBean的属性。
jsp:forward
把请求转到一个新的页面。
jsp:plugin
根据浏览器类型为Java插件生成OBJECT或EMBED标记。
jsp:element
定义动态XML元素
jsp:attribute
设置动态定义的XML元素属性。
jsp:body
设置动态定义的XML元素内容。
jsp:text
在JSP页面和文档中使用写入文本的模板
常见的属性
所有的动作要素都有两个属性:id属性和scope属性。
id属性: id属性是动作元素的唯一标识,可以在JSP页面中引用。动作元素创建的id值可以通过PageContext来调用。
scope属性: 该属性用于识别动作元素的生命周期。 id属性和scope属性有直接关系,scope属性定义了相关联id对象的寿命。 scope属性有四个可能的值: (a) page, (b)request, (c)session, 和 (d) application。
7.jsp隐式对象
JSP 隐式对象
JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。
JSP所支持的九大隐式对象:
对象
描述
request
HttpServletRequest 类的实例
response
HttpServletResponse 类的实例
out
JspWriter 类的实例,用于把结果输出至网页上
session
HttpSession 类的实例
application
ServletContext 类的实例,与应用上下文有关
config
ServletConfig 类的实例
pageContext
PageContext 类的实例,提供对JSP页面所有对象以及命名空间的访问
page
类似于Java类中的this关键字
Exception
Exception 类的对象,代表发生错误的JSP页面中对应的异常对象
request对象
request对象是javax.servlet.http.HttpServletRequest 类的实例。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。
request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。
response对象
response对象是javax.servlet.http.HttpServletResponse类的实例。当服务器创建request对象时会同时创建用于响应这个客户端的response对象。
response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies,时间戳,HTTP状态码等等。
out对象
out对象是 javax.servlet.jsp.JspWriter 类的实例,用来在response对象中写入内容。
最初的JspWriter类对象根据页面是否有缓存来进行不同的实例化操作。可以在page指令中使用buffered='false'属性来轻松关闭缓存。
JspWriter类包含了大部分java.io.PrintWriter类中的方法。不过,JspWriter新增了一些专为处理缓存而设计的方法。还有就是,JspWriter类会抛出IOExceptions异常,而PrintWriter不会。
下表列出了我们将会用来输出boolean,char,int,double,String,object等类型数据的重要方法:
方法
描述
out.print(dataType dt)
输出Type类型的值
out.println(dataType dt)
输出Type类型的值然后换行
out.flush()
刷新输出流
session对象
session对象是 javax.servlet.http.HttpSession 类的实例。和Java Servlets中的session对象有一样的行为。
session对象用来跟踪在各个客户端请求间的会话。
application对象
application对象直接包装了servlet的ServletContext类的对象,是javax.servlet.ServletContext 类的实例。
这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。
通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。
config对象
config对象是 javax.servlet.ServletConfig 类的实例,直接包装了servlet的ServletConfig类的对象。
这个对象允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等。
以下是config对象的使用方法,不是很重要,所以不常用:
config . getServletName ();
它返回包含在元素中的servlet名字,注意,元素在 WEB-INF\web.xml 文件中定义。
pageContext 对象
pageContext对象是javax.servlet.jsp.PageContext 类的实例,用来代表整个JSP页面。
这个对象主要用来访问页面信息,同时过滤掉大部分实现细节。
这个对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象可以通过访问这个对象的属性来导出。
pageContext对象也包含了传给JSP页面的指令信息,包括缓存信息,ErrorPage URL,页面scope等。
PageContext类定义了一些字段,包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。它也提供了40余种方法,有一半继承自javax.servlet.jsp.JspContext 类。
其中一个重要的方法就是removeArribute(),它可接受一个或两个参数。比如,pageContext.removeArribute("attrName")移除四个scope中相关属性,但是下面这种方法只移除特定scope中的相关属性:
pageContext . removeAttribute ( "attrName" , PAGE_SCOPE );
page 对象
这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表。
page 对象就是this对象的同义词。
exception 对象
exception 对象包装了从先前页面中抛出的异常信息。它通常被用来产生对出错条件的适当响
8.客户端请求和服务器响应
HttpServletRequest类
request对象是javax.servlet.http.HttpServletRequest类的实例。每当客户端请求一个页面时,JSP引擎就会产生一个新的对象来代表这个请求。
request对象提供了一系列方法来获取HTTP信息头,包括表单数据,cookies,HTTP方法等等。
接下来将会介绍一些在JSP编程中常用的获取HTTP信息头的方法。详细内容请见下表:jsp客户端请求
HttpServletResponse类
response 对象是 javax.servlet.http.HttpServletResponse 类的一个实例。就像服务器会创建request对象一样,它也会创建一个客户端响应。
response对象定义了处理创建HTTP信息头的接口。通过使用这个对象,开发者们可以添加新的cookie或时间戳,还有HTTP状态码等等。
下表列出了用来设置HTTP响应头的方法,这些方法由HttpServletResponse 类提供:jsp服务器响应
9.jsp表单处理
我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理。浏览器中使用 GET 和 POST 方法向服务器提交数据。
GET 方法
GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔。如下所示:
http : //www.runoob.com/hello?key1=value1&key2=value2
GET方法是浏览器默认传递参数的方法,一些敏感信息,如密码等建议不使用GET方法。
用get时,传输数据的大小有限制 (注意不是参数的个数有限制),最大为1024字节。
POST 方法
一些敏感信息,如密码等我们可以通过POST方法传递,POST提交数据是隐式的。
POST提交数据是不可见的,GET是通过在url里面传递的(可以看一下你浏览器的地址栏)。
JSP使用getParameter()来获得传递的参数,getInputStream()方法用来处理客户端的二进制数据流的请求。
JSP 读取表单数据
getParameter(): 使用 request.getParameter() 方法来获取表单参数的值。
getParameterValues(): 获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkbox类型
getParameterNames(): 该方法可以取得所有变量的名称,该方法返回一个Emumeration。
getInputStream(): 调用此方法来读取来自客户端的二进制数据流。
使用URL的 GET 方法实例
以下是一个简单的URL,并使用GET方法来传递URL中的参数:
http : //localhost:8080/testjsp/main.jsp?name=菜鸟教程&url=http://ww.runoob.com
testjsp 为项目地址。
以下是 main.jsp 文件的JSP程序用于处理客户端提交的表单数据,我们使用getParameter()方法来获取提交的数据:
<%@ page language = "java" contentType = "text/html; charset=UTF-8"
pageEncoding = "UTF-8" %>
<%@ page import = "java.io.*,java.util.*" %>
charset = "utf-8" >
菜鸟教程(runoob.com)
使用 GET 方法读取数据
站点名:
<%= request . getParameter ( "name" ) %>
网址:
<%= request . getParameter ( "url" ) %>
接下来我们通过浏览器访问 http://localhost:8080/testjsp/main.jsp?name=菜鸟教程&url=http://ww.runoob.com 输出结果如下所示:
使用表单的 GET 方法实例
以下是一个简单的 HTML 表单,该表单通过GET方法将客户端数据提交 到 main.jsp 文件中:
charset = "utf-8" >
菜鸟教程(runoob.com)
将以上HTML代码保存到test.htm文件中。 将该文件放置于当前jsp项目的 WebContent 目录下(与 main.jsp 同一个目录)。
通过访问 http://localhost:8080/testjsp/test.html 提交表单数据到 main.jsp 文件,演示 Gif 图如下所示:
在 "站点名" 与 "网址" 两个表单中填入信息,并点击 "提交" 按钮,它将输出结果。
使用表单的 POST 方法实例
接下来让我们使用POST方法来传递表单数据,修改main.jsp与Hello.htm文件代码,如下所示:
main.jsp文件代码:
<%@ page language = "java" contentType = "text/html; charset=UTF-8"
pageEncoding = "UTF-8" %>
<%@ page import = "java.io.*,java.util.*" %>
charset = "utf-8" >
菜鸟教程(runoob.com)
使用 POST 方法读取数据
站点名:
<%
// 解决中文乱码的问题
String name = new String (( request . getParameter ( "name" )). getBytes ( "ISO-8859-1" ), "UTF-8" );
%>
<%= name%>
网址:
<%= request . getParameter ( "url" ) %>
代码中我们使用 new String((request.getParameter("name")).getBytes("ISO-8859-1"),"UTF-8") 来转换编码,防止中文乱码的发生。
以下是test.htm修改后的代码:
charset = "utf-8" >
菜鸟教程(runoob.com)
通过访问 http://localhost:8080/testjsp/test.html 提交表单数据到 main.jsp 文件,演示 Gif 图如下所示:
传递 Checkbox 数据到JSP程序
复选框 checkbox 可以传递一个甚至多个数据。
以下是一个简单的HTML代码,并将代码保存在test.htm文件中:
charset = "utf-8" >
菜鸟教程(runoob.com)
以上代码在浏览器访问如下所示:
以下为main.jsp文件代码,用于处理复选框数据:
<%@ page language = "java" contentType = "text/html; charset=UTF-8"
pageEncoding = "UTF-8" %>
<%@ page import = "java.io.*,java.util.*" %>
charset = "utf-8" >
菜鸟教程(runoob.com)
从复选框中读取数据
Google 是否选中:
<%= request . getParameter ( "google" ) %>
菜鸟教程是否选中:
<%= request . getParameter ( "runoob" ) %>
淘宝是否选中:
<%= request . getParameter ( "taobao" ) %>
通过访问 http://localhost:8080/testjsp/test.html 提交表单数据到 main.jsp 文件,演示 Gif 图如下所示:
读取所有表单参数
以下我们将使用 HttpServletRequest 的 getParameterNames() 来读取所有表单参数,该方法可以取得所有变量的名称,该方法返回一个枚举。
一旦我们有了一个 Enumeration(枚举),我们就可以调用 hasMoreElements() 方法来确定是否还有元素,以及使用nextElement()方法来获得每个参数的名称。
<%@ page language = "java" contentType = "text/html; charset=UTF-8"
pageEncoding = "UTF-8" %>
<%@ page import = "java.io.*,java.util.*" %>
charset = "utf-8" >
菜鸟教程(runoob.com)
读取所有表单参数
width = "100%" border = "1" align = "center" >
bgcolor = "#949494" >
参数名 参数值
<%
Enumeration paramNames = request . getParameterNames ();
while ( paramNames . hasMoreElements ()) {
String paramName = ( String ) paramNames . nextElement ();
out . print ( "" + paramName + " \n");
String paramValue = request . getParameter ( paramName );
out . println ( " " + paramValue + " \n" );
}
%>
以下是test.htm文件的内容:
charset = "utf-8" >
菜鸟教程(runoob.com)
现在我们通过浏览器访问 test.htm 文件提交数据,输出结果如下:
通过访问 http://localhost:8080/testjsp/test.html 提交表单数据到 main.jsp 文件,演示 Gif 图如下所示:
你可以尝试使用以上的JSP代码读取其它对象,如文本框,单选按钮或下拉框等等其他形式的数据
10.jsp过滤器
JSP 和 Servlet 中的过滤器都是 Java 类。
过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
可以将一个或多个过滤器附加到一个 Servlet 或一组 Servlet。过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。
过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
在客户端的请求访问后端资源之前,拦截这些请求。
在服务器的响应发送回客户端之前,处理这些响应。
根据规范建议的各种类型的过滤器:
身份验证过滤器(Authentication Filters)。
数据压缩过滤器(Data compression Filters)。
加密过滤器(Encryption Filters)。
触发资源访问事件过滤器。
图像转换过滤器(Image Conversion Filters)。
日志记录和审核过滤器(Logging and Auditing Filters)。
MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。
标记化过滤器(Tokenizing Filters)。
XSL/T 过滤器(XSL/T Filters),转换 XML 内容。
过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明,然后映射到您的应用程序的部署描述符中的 Servlet 名称或 URL 模式。
当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例。
Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。
过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法:
序号
方法 & 描述
1
public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。
2
public void init(FilterConfig filterConfig) web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
3
public void destroy() Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。
11.jsp其他功能
功能
详细介绍
文件上传
点击打开链接
日期处理
点击打开链接
页面重定向
点击打开链接
点击量统计
点击打开链接
自动刷新
点击打开链接
发送邮件
点击打开链接
标准标签库
点击打开链接
连接数据库
点击打开链接
javabean
点击打开链接
12.jsp session
JSP Session
HTTP是无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息。
有三种方法来维持客户端与服务器的会话:
Cookies
网络服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求。
这可能不是一种有效的方式,因为很多时候浏览器并不一定支持cookie,所以我们不建议使用这种方法来维持会话。
隐藏表单域
一个网络服务器可以发送一个隐藏的HTML表单域和一个唯一的session ID,就像下面这样:
type = "hidden" name = "sessionid" value = "12345" >
这个条目意味着,当表单被提交时,指定的名称和值将会自动包含在GET或POST数据中。每当浏览器发送一个请求,session_id的值就可以用来保存不同浏览器的轨迹。
这种方式可能是一种有效的方式,但点击标签中的超链接时不会产生表单提交事件,因此隐藏表单域也不支持通用会话跟踪。
重写URL
您可以在每个URL后面添加一些额外的数据来区分会话,服务器能够根据这些数据来关联session标识符。
举例来说,http://w3cschool.cc/file.htm;sessionid=12345, session标识符为sessionid=12345,服务器可以用这个数据来识别客户端。
相比而言,重写URL是更好的方式来,就算浏览器不支持cookies也能工作,但缺点是您必须为每个URL动态指定session ID,就算这是个简单的HTML页面。
session对象
除了以上几种方法外,JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。
默认情况下,JSP允许会话跟踪,一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需要显式地关掉它,通过将page指令中session属性值设为false来实现,就像下面这样:
<%@ page session = "false" %>
JSP引擎将隐含的session对象暴露给开发者。由于提供了session对象,开发者就可以方便地存储或检索数据。
下表列出了session对象的一些重要方法:
S.N.
方法 & 描述
1
public Object getAttribute(String name)
返回session对象中与指定名称绑定的对象,如果不存在则返回null
2
public Enumeration getAttributeNames()
返回session对象中所有的对象名称
3
public long getCreationTime()
返回session对象被创建的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起
4
public String getId()
返回session对象的ID
5
public long getLastAccessedTime()
返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起
6
public int getMaxInactiveInterval()
返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开
7
public void invalidate()
将session无效化,解绑任何与该session绑定的对象
8
public boolean isNew()
返回是否为一个新的客户端,或者客户端是否拒绝加入session
9
public void removeAttribute(String name)
移除session中指定名称的对象
10
public void setAttribute(String name, Object value)
使用指定的名称和值来产生一个对象并绑定到session中
11
public void setMaxInactiveInterval(int interval)
用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效
JSP Session应用
这个例子描述了如何使用HttpSession对象来获取创建时间和最后一次访问时间。我们将会为request对象关联一个新的session对象,如果这个对象尚未存在的话。
<%@ page language = "java" contentType = "text/html; charset=UTF-8"
pageEncoding = "UTF-8" %>
<%@ page import = "java.io.*,java.util.*" %>
<%
// 获取session创建时间
Date createTime = new Date ( session . getCreationTime ());
// 获取最后访问页面的时间
Date lastAccessTime = new Date ( session . getLastAccessedTime ());
String title = "再次访问菜鸟教程实例" ;
Integer visitCount = new Integer ( 0 );
String visitCountKey = new String ( "visitCount" );
String userIDKey = new String ( "userID" );
String userID = new String ( "ABCD" );
// 检测网页是否由新的访问用户
if ( session . isNew ()){
title = "访问菜鸟教程实例" ;
session . setAttribute ( userIDKey , userID );
session . setAttribute ( visitCountKey , visitCount );
} else {
visitCount = ( Integer ) session . getAttribute ( visitCountKey );
visitCount += 1 ;
userID = ( String ) session . getAttribute ( userIDKey );
session . setAttribute ( visitCountKey , visitCount );
}
%>
Session 跟踪
Session 跟踪
border = "1" align = "center" >
bgcolor = "#949494" >
Session 信息
值
id
<% out . print ( session . getId ()); %>
创建时间
<% out . print ( createTime ); %>
最后访问时间
<% out . print ( lastAccessTime ); %>
用户 ID
<% out . print ( userID ); %>
访问次数
<% out . print ( visitCount ); %>
试着访问 http://localhost:8080/testjsp/main.jsp ,第一次运行时将会得到如下结果:
再次访问,将会得到如下结果:
删除Session数据
当处理完一个用户的会话数据后,您可以有如下选择:
移除一个特定的属性: 调用public void removeAttribute(String name) 方法来移除指定的属性。
删除整个会话: 调用public void invalidate() 方法来使整个session无效。
设置会话有效期: 调用 public void setMaxInactiveInterval(int interval) 方法来设置session超时。
登出用户: 支持servlet2.4版本的服务器,可以调用 logout()方法来登出用户,并且使所有相关的session无效。
配置web.xml文件: 如果使用的是Tomcat,可以向下面这样配置web.xml文件:
15
超时以分钟为单位,Tomcat中的默认的超时时间是30分钟。
Servlet中的getMaxInactiveInterval( ) 方法以秒为单位返回超时时间。如果在web.xml中配置的是15分钟,则getMaxInactiveInterval( ) 方法将会返回900。
13. Servlet教程: servlet详细教程