1.什么是session ?
(1)session 表示客户端与服务器的一次回话。
2)Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花的时间。
3)从上述定义中可以看到,session实际上是一个特定的时间概念。
2.session对象
(1)session对象指的是客户端与服务器的一次会话。
(2)从客户打开浏览器并链接到服务器开始, 直到客户关闭浏览器离开这个服务器结束,被称为一个回话它是HttpSession
类的实例.
(3)session 的应用:
当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象。
3.session对象的常用方法:
(1)String getId():获得session id。session id类似于Cookie的JSessionId,是服务器自动分配的;
(2)session.setAttribute(“String name”,”object value”):设置属性。
(3)session.getCreationTime():获得创建时间。
(4)session.getLastAccessedTime():获得最后访问时间。
(5)session.isNew():这个session是否是新的,即判断session id。
(6)session.invalidate():把session的属性设置全部清空。
7)session.getAttribute(String name):返回与此回话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null.
(8)session.getValueNames():返回一个包含此session种所有可用属性的数组。
9)session.setMaxInactiveInterval(5);手动销毁session的生命周期(设置为5秒过期).
10)int getMaxInactiveInterval():返回两次请求间隔多久时间此session被取消单位秒。
登录-注销页面:
(1)使用session.setAttribute()注册。
(2)使用session.getAttribute()判断是否已经注册。
(3)使用session.invalidate(); 注销;
3.session 的生命周期:
1.创建:当客户端第一次访问某个jsp或者servlet时候,服务器会为当前会话创建一个SessionId,每次客户端向服务器发送请求时,都会将此SessionId携带过去,服务端会对此SessionId进行校验。
2.活动:
①某次会话当中通过超链接打开的新页面属于同一次会话
②只要当前会话页面没有全部关闭,重新打开的浏览器窗口访问同一个项目资源时属于同一次会话
③除非本次会话的所有页面都关闭后在重新访问某个JSP或者servlet将会创建新的会话
注意:注意原有会话还存在,只是这个旧的Session仍然存在于服务端,只不过再也没有客户端会携带它然后交予服务端校验。
4。那几种情况可以销毁session(一般有3种情况)
(1)超时(一般服务器设置超时时间为30分钟)服务器会销毁session。
(2)点击控制台的红色按钮(stop)异常关闭服务器要销毁session。
(3)手动调用session 的invalidate方法session.invalidate();
注意:如果服务器正常关闭不会销毁session。
6.session的代码实例:
(1)实例1:
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = new Date(session.getCreationTime());
session.setAttribute("username","xingoo");
session.setAttribute("password","123");
session.setAttribute("age","26"); //設置Session生命期限
//session.setMaxInactiveInterval(2); %>
Session创建时间:<%=sdf.format(d) %><br>
Session的ID编号:<%=session.getId() %><br>
Session获取:<%=session.getAttribute("username") %><br>
Session中保存的屬性:<%
String[] names = session.getValueNames();
for(int i=0;i<names.length;i++){
out.println(names[i]+" ");
}
%><br>
<%
//session.invalidate();//执行销毁后,服务器直接就删除了会话的相关内容;
%>
(2)实例2:
<%@page import="org.apache.catalina.connector.Request"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<script type="text/javascript"> function on_submit(){
if(form1.username.value=="")
{
alert("用户名不能为空,请输入用户名!");
form1.username.focus();
return false; }
if(form1.userpassword.value=="")
{
alert("密码不能为空,请输入密码!");
form1.userpassword.focus();
return false
}
}
</script>
<%!
public String codeToString(String str){ //处理中文字符串的函数
String s=str;
try
{
byte tempB[]=s.getBytes("ISO-8859-1");
s=new String(tempB);
return s; }catch(Exception e)
{
return s;
} }
%>
<%
String username=request.getParameter("username");
String userpassword=request.getParameter("userpassword");
if(username!=null &userpassword!=null)
{
//如果用户名和密码都合法,则记下用户名,一般把用户和密码存在数据库中
//用数据库中的信息与提交的用户名和密码比较以进行用户合法性检查
session.setAttribute("username", codeToString(username));
response.sendRedirect("sessionUserLogin1.jsp");
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
</head>
<body>
<table aligin="center">
<form name="form1" method="post" action="dologin.jsp" onsubmit="return on_submit()">
<tr aligin="center">
<td>
用户登录
</td>
</tr>
<tr aligin="center">
<td>
请输入用户名:<input type="text" name="username" size="20">
</td>
</tr>
<tr aligin="center">
<td>
请输入密码: <input type="password" name="userpassword" size="20">
</td>
</tr>
<tr aligin="center">
<td>
<input type="submit" value="提交" name="B1">
<input type="reset" value="全部重写" name="B2">
</td>
</tr>
</form>
</table>
</body>
</html//index文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录成功</title>
</head>
<body> 用户登录成功!<br>
您的用户名是:<%=(String)session.getAttribute("username")%>
</body>
</html>
(3)实例3:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Session 内置对象</title>
</head>
<body>
<h1>session 测试</h1>>
<a href="index2.jsp" rel="external nofollow" >跳转到页面2</a>
<hr/>
session_id=<%=session.getId() %><%
//手动销毁 session
/* session.invalidate(); */
session.setMaxInactiveInterval(5);%>
</body>
</html>//index2.jsp 文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>我是页面2</title>
</head>
<body>
<h1>我是页面2</h1>session_id=<%=session.getId() %>
</body>
</html>
7.application 应用程序单列对象
(1)application 对象实现了用户间数据的共享,可存放全局变量。application 对象是ServletContext 类的实例。基本是javax.servlet.ServletContext类。
注意:有些Web服务器不直接支持使用application对象,必须用ServletContext类来声明application对象,再调用getServletContext()方法来获取当前页面的application对象。
(2)application 的生命周期:application开始与服务器,终止于服务器的关闭。
注意:一个Web应用程序启动后,将会自动创建一个application对象,而且在整个应用程序的运行过程中只有一个application对象,也即所有访问该网站的客户都共享一个application对象。
(3)application对象的作用范围:application对象是一个应用程序级的对象,它作用于当前Web应用程序,也即作用于当前网站,所有访问当前网站的客户都共享一个application对象。
具体来说:不管哪个客户来访问网站A,也不管客户访问网站A下哪个页面文件,都可以对网站A的application对象进行操作,因为,所有访问网站A的客户都共用一个application对象。
因此,当在application对象中存储数据后,所有访问网站A的客户都能够对其进行访问,实现了多客户之间的数据共享。
(4) ServletContext类:用于表示应用程序的上下文。
一个ServletContext类的对象表示一个Web应用程序的上下文。
具体来说:在Web服务器中,提供了一个Web应用程序的运行时环境,专门负责Web应用程序的部署、编译、运行以及生命周期的管理,通过ServletContext类,可以获取Web应用程序的运行时环境信息。
(5)常识:JSP引擎、Servlet引擎、JSP容器和Servlet容器,都是指Web服务器,Web服务器用于管理所有Web应用程序。
8.application对象的常用方法,如下所示:
方法 | 功能 |
---|---|
getInitParameter(String name) | 返回已命名的应用程序初始化参数值 |
Enumeration getAttributeNames() | 返回所有已定义的应用程序初始化参数名的枚举 |
getAttribute(String name) | 从application对象中获取指定对象名 |
setAttribute(String name, Object obj) | 保存一个对象信息,并指定给一个名称 |
removeAttribute(String name) | 从application对象中去掉指定名称的属性 |
getServletInfo() | 返回JSP引擎的相关信息(返回jsp(SERVLET)引擎名及版本号) |
getRealPath(String path) | 返回虚拟路径的真实路径 |
getContext(String URLPath) | 返回执行Web应用的application对象 |
getMajorVersion() | 返回服务器所支持的Servlet API最大版本号 |
getMinorVersion() | 返回服务器所支持的Servlet API最小版本号 |
getMineType(String file) | 返回指定文件的MIME类型 |
getResource(String path) | 返回指定资源的URL路径 |
getResourceAsStream(String path) | 返回指定资源的输入流 |
getRequestDispatcher(String URLPath) | 返回指定资源的RequestDispatcher对象 |
getServlet(String name) | 返回指定名称的Servlet |
getServlets() | 返回所有的Servlet,返回类型为枚举型 |
getServletNames() | 返回所有的Servlet名称,返回类型为枚举型 |
log(String msg) | 把指定信息写入到Servlet的日志文件中 |
log(String msg, Throwable throwable) | 把栈轨迹以及给出的Throwable异常的说明信息写入Servlet的日志文件 |
9.application的代码测试
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><%
application.setAttribute("username","王小花");
application.setAttribute("age","18");%><%=application.getServerInfo() %>
<a href="index.jsp?name=张三" rel="external nofollow" >前往首页</a><%
Enumeration em = application.getAttributeNames();while(em.hasMoreElements()){
out.println(em.nextElement()+"<br>");
}
%>//下面是文件(2)index 文件<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
*{
text-align:center; }</style>
</head>
<body>
<%session.setAttribute("username", "张三丰");
%><h1>通过 URL 链接 获取值</h1>
用户名是:<%=request.getParameter("name") %>
<hr>
<h1>通过application 获取值</h1>
用户名是:<%=application.getAttribute("username") %>
年龄是:<%=application.getAttribute("age") %><% out.println("<h1>望庐山瀑布</h1>");
out.println("日照香炉生紫烟,<br/>");
/*强制输出缓冲区里面的内容 */
out.flush();
/* 清空前面的缓冲区 */
out.clearBuffer();
out.println("遥看瀑布挂前川,<br/>");
out.println("飞流直下三千尺,<br/>");
out.println("疑似银河落九天,<br/>");/* out.close(); */
%>缓冲区大小=<%=out.getBufferSize() %><br/>缓冲区剩余大小=<%=out.getRemaining() %><br/></body>
</html>
(2)使用application对象实现网站计数器(常用)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.*"%>
<h1>application 计数器</h1>
<%
Integer number =(Integer)application.getAttribute("Count");
if(number==null){
number=new Integer(1);
application.setAttribute("Count",number);
}
if(session.isNew()==true){
number =new Integer(number.intValue()+1);
application.setAttribute("Count",number);
}%>
<p>你是第
<% int a=((Integer)pageContext.getAttribute("Count",PageContext.APPLICATION_SCOPE)).intValue();%>
<%=a %>
个访问本站的客户;</p>
10.session和application的区别:
(1) 两者的作用范围不同:
session对象是用户级的对象,而application对象是应用程序级的对象。
一个用户一个session对象,每个用户的session对象不同,在用户所访问网站的多个页面之间共享同一个session对象。
一个Web应用程序一个application对象,每个Web应用程序的application对象不同,但一个Web应用程序的多个用户之间共享同一个application对象。
在同一个网站下:
a. 每个用户的session对象不同
b.所用用户的application对象相同
在不同网站下:
a.每个用户的session对象不同
b. 每个用户的application对象不同
(2) 两者的生命周期不同:
session对象的生命周期:用户首次访问网站创建,用户离开该网站 (不一定要关闭浏览器) 消亡。
application对象的生命周期:启动Web服务器创建,关闭Web服务器销毁。
11.page对象:
(1)page对象代表JSP本身,只有在JSP页面内才是合法的。page对象本质上是包含当前Servlet接口引用的变量,有点像类中的this指针。
(2)page对象的常用方法,如下:
page.getClass()//获得page对象的类
page.hashCode()//获得page对象的hash码
page.toString()//将此page对象转换为String类对象
page.notify()//唤醒一个等待的进程
page.notifyAll()//唤醒所有等待的进程
page.wait()//使一个线程处于等待直到被唤醒
page.wait(long timeout)//使一个线程处于等待直到timeout或被唤醒
page.equals(object obj)//判断此object是否与指定的object对象相等
object clone() 克隆此object对象
void copy(object obj)把此object拷贝到指定的object对象中
(3)page代码实例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
out.println(page.toString());%>
</body>
</html>
12.pageContext全文对象
pageContext对象是javax.servlet.jsp.PageContext类的实例,主要表示的是一个JSP页面的上下文
(1)pageContext 对象提供了对JSP页面内所有的对象及名字空间的访问。
(2)pageContext 对象可以访问到本页所在的session,也可以本页面所在的application的某一属性值
(3)pageContext对象相当于页面中所有功能的集大成者
(4)pageContext 对象的本类名也叫pageContext.
13.pageContext全文对象的常用方法
方法 | 功能 |
---|---|
getRequest() | 获取当前页面中的request对象 |
getResponse() | 获取当前页面中的response对象 |
getPage() | 获取当前页面中的page对象 |
getSession() | 获取当前页面中的session对象 |
getOut() | 获取当前页面中的out对象 |
getException() | 获取当前页面中的exception对象 |
getServletConfig() | 获取当前页面中的config对象 |
getServletContext() | 获取当前页面中的application对象 |
setAttribute(String name) | 给指定的属性名设置属性值 |
getAttribute(String name) | 根据属性名找到相应的属性值 |
setAttribute(String name, Object obj, int scope) | 在给定的范围内设置相应的属性值 |
getAttribute(String name, int scope) | 在指定的范围内获取到相应的属性值 |
findAttribute(String name) | 寻找一个属性并返回,如果没有找到则返回一个null |
removeAttribute(String name) | 通过属性名删除掉某个属性 |
removeAttribute(String name, int scope) | 在指定的某个范围内删除某个属性 |
getAttributeScope(String scope) | 返回某属性的作用域 |
getAttributeNamesInScope(int scope) | 返回指定范围内的所有属性名的枚举 |
release() | 释放掉pageContext()所占的所有资源 |
forward(String relativeURLpath) | 使用当前页面重导到另一个页面 |
include(String relativeURLpath) | 使用当前位置包含的另一个页面 |
也就是说,只要有了pageContext对象,就能完成一切内置对象的功能;
补充:pageContext对象在实际JSP开发中一般很少使用,因为request和response等对象均为内置对象,如果通过pageContext来调用这些对象比较麻烦,都可以直接调用相关方法实现具体的功能。
使用函数:pageConext.setAttribute(“name”,”value”,int SCOPE);
1.设置page范围
pageConext.setAttribute(“name”,”xiazdong”,PageConext.PAGE_SCOPE);
2.设置request范围
pageConext.setAttribute(“name”,”xiazdong”,PageConext.REQUEST_SCOPE);
3.设置session范围
pageConext.setAttribute(“name”,”xiazdong”,PageConext.SESSION_SCOPE);
4.设置application范围
pageConext.setAttribute(“name”,”xiazdong”,PageConext.APPLICATION_SCOPE);
因此,只需要PageContext就能完成全部内置对象的操作;
14.pageContext全文对象的代码实例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//pageContext.include("index.jsp"); //获取到与index.jsp有关联的所有文件 //pageContext.forward("getPost.jsp"); %>
<%= pageContext.getSession().getAttribute("username") %>//index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
*{
text-align:center; }</style>
</head>
<body>
<%session.setAttribute("username", "张三丰");
%><h1>通过 URL 链接 获取值</h1>
用户名是:<%=request.getParameter("name") %>
<hr>
<h1>通过application 获取值</h1>
用户名是:<%=application.getAttribute("username") %>
年龄是:<%=application.getAttribute("age") %><% out.println("<h1>望庐山瀑布</h1>");
out.println("日照香炉生紫烟,<br/>");
/*强制输出缓冲区里面的内容 */
out.flush();
/* 清空前面的缓冲区 */
out.clearBuffer();
out.println("遥看瀑布挂前川,<br/>");
out.println("飞流直下三千尺,<br/>");
out.println("疑似银河落九天,<br/>");/* out.close(); */
%>缓冲区大小=<%=out.getBufferSize() %><br/>缓冲区剩余大小=<%=out.getRemaining() %><br/>//getPost.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>表单提交</title>
</head>
<body>
<h1>get</h1>
<form action="doLogin.jsp" name="loginForm"method="get">
<table>
<tr>
<td>账号:</td>
<td><input type="text" name="username" placeholder="请输入账号" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" placeholder="请输入密码" /></td>
</tr>
<tr>
<td><input type="submit" value="提交" /></td> </tr>
</table>
</form>
<h1>post</h1>
<form action="doLogin.jsp" name="loginForm"method="post">
<table>
<tr>
<td>账号:</td>
<td><input type="text" name="username" placeholder="请输入账号" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" placeholder="请输入密码" /></td>
</tr>
<tr>
<td><input type="submit" value="提交" /></td> </tr>
</table>
</form>
15.exception 异常对象
exception 对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个jsp页面要应用此对象,就必须把isErrorPage 设为true,否则无法编译。他实际上是java.lang.Throwable的对象,常用方法如下:
(1)String getMessage() 返回描述异常的信息
(2)String toString()返回关于异常的简短描述信息
(3)void printStackTrace() 显示异常及其栈轨迹
(4)Throwable fillinStackTrace()重写异常的执行栈轨迹
15.2 exception 异常对象的实例代码:
16.Config 对象
config对象主要用于取得服务器的配置信息。当一个Servlet初始化时,容器把某些信息通过config对象传递给这个Servlet。此信息包括Servlet初始化时所需要用到的参数(通过属性名和属性值构成)以及服务器的有关信息。
Config 对象的常用方法有:
方法 | 功能 |
---|---|
getServletContext() | 获取Servlet上下文 |
getInitParameter(String name) | 返回初始化参数的值 |
getInitParameterNames() | 返回包含了Servlet初始化所需要的所有参数,返回类型是枚举型 |
getServletName() | 获取Servlet服务器名 |