慕课网《JAVA遇见HTML——JSP篇 第四章 JSP内置对象(下)》学习笔记

课程链接:https://www.imooc.com/learn/166

4-1:什么是session

session表示客户端与服务器的一次对话。

具体到Web应用程序中,Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。

从上述定义中可以看到,session实际上是一个特定的时间概念。

 

什么是Session:

在服务器的内存中保存着不同用户的session。session和用户是一一对应的。

4-2:session对象

(1)

session对象是一个JSP内置对象。

session对象在第一个JSP页面被装载时自动创建,完成会话期管理。

从第一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,都被称为一个会话。

当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,(并且保存用户的状态)这就需要sessioin对象。

session对象是HttpSesstion类的实例。

(2)session对象常用方法如下:

long getCreationTime() 返回session创建时间(单位毫秒)。

public String getId() 返回session创建时JSP引擎为它设的唯一ID号。

public Object setAttribute( String name, Object value ) 使用指定名称将对象绑定到此会话。

public Object getAttribute( String name ) 返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null。

String[] getValueNames() 返回一个包含此session中所有可用的属性的数组。

int getMaxInactiveInterval() 返回两次请求间隔多长时间此session被取消(单位秒)

void setMaxInactiveInterval() 设置两次请求间隔多长时间此session被取消(单位秒)

(3)实例练习:

(3.a)

 

 

 

 

 

 

 

 

 

 只有关闭浏览器后,重新打开页面,改时间才会该改变。

 

 

(3.b)新建session_page2.jsp,看是否能取到username,以及session的ID与之前的是否相同。

 

 

 

 

 

 

 

 

 发现能取到username,并且session的ID与之前也是相同的。说明,这两个页面在同一个session中。

(3.c)String[] getValueNames() 返回一个包含此session中所有可用属性的数组。

 

 

 

 

 (3.c)int getMaxInactiveInterval() 返回两次请求间隔多长时间此session被取消(单位秒)

比如说你设置为10秒,那么你10秒后再打开这个页面时,这个页面就过期了,就会创建一个新的session。我因为之前出去了,关电脑了,所以ID会和之前的不一样。不过不影响我重新开始测试。

 

 

 

 

 可以看到,一分钟后,session的ID没变。

现在测试setMaxInactiveInterval():

 

 

10秒后,在session_page1.jsp的超链接点进去,会发现,session_page2.jsp里,session的ID变了,“username”也取不到了,保存的属性也没了。说明这已经是新的session了。

4-4:session的生命周期

session的生命周期

(1)创建:

当客户端第一次访问某个jsp或者Servlet的时候,服务器会为当前会话创建一个sessionId,每次客户端向服务端发送请求时,都会将此sessionId携带过去,服务端会对此sessionId进行校验和比对,来判断是否属于同一次对话。

(2)活动:

某次会话当中通过超链接打开的新页面属于同一次会话。

只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。

除非本次会话的所有页面都关闭后再重新访问某个jsp或者Servlet,将会创建新的对话。

注意事项:注意原有会话还存在,只是这个旧的sessionId仍然存在于服务端,只不过再也没有客户端会携带它然后交予服务端校验。创建新的会话并不意味着原有的旧的会话结束了,除非它已经超时,那么原有旧会话才会结束。

(3)销毁:

session的销毁只有三种方式:

(3.a)调用了session.invalidate() 方法。

(3.b)session过期(超时)

(3.c)服务器重启,则所有的session都销毁了。

实例演示:

(A)验证“”只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。”:

 

 

关闭session_page2.jsp,保留session_page1.jsp,然后双击浏览器图标,重新打开一个浏览器,输入session_page2.jsp的网址:

 

 

 

 

 可以发现,sessionID没有发生改变。

(B)验证:调用session.invalidate() 方法 来销毁会话:

 

访问session_page1.jsp:

 

 

 

 

 报错了,原因是执行session.invalidate() 之后,该session已经被销毁了,所以下文中调用session.getAttribute(“username")会报错。

把session.invalidate();移到页面最后:

 

 

 

刷新页面:

 

 

 发现ID变了,说明在页面加载完之后,其实session已经被销毁了,所以刷新后,又是新的一个session,所以ID改变了。

(C)session销毁方法之:session过期(超时)

Tomcat默认session超时时间为30分钟。

设置session超时有两种方式:

(C.1)session.setMaxInactiveInterval(时间) //单位是秒

(C.2)在web.xml里配置

<session-config>

  <session-timeout>

    10

  </session-timeout>

</session-config> //单位是分钟

 

 重启服务器。

 

 

 

 一分钟后,刷新页面,ID变了。说明原对象已经被销毁了。

4-6:application对象

application对象:

application对象实现了用户间数据的共享,可存放全局变量。

application开始于服务器的启动,终止于服务器的关闭。

在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。(这一点,非常像Java中的静态的属性,他属于类,而不属于对象,同样,application对象,它是属于整个服务器,它不属于具体某个项目。)

在任何地方对application对象属性的操作,都将影响到其他用户对此的访问。

服务器的启动和关闭,决定了application对象的生命。

appliction对象是ServletContext类的实例。

application对象:

常用方法如下:

public void setAttribute( String name, Object value ) 使用指定名称将对象绑定到此会话。

public Object getAttribute( String name ) 返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null。

Enumeration getAttributeNames() 返回所有可用属性名的枚举。

String getServerInfo() 返回JSP(servlet)引擎名及版本号。

实例练习:

 

 

 

 

4-8:page对象

page对象就是指向当前JSP页面本身,有点像类中的this指针(表示当前对象本身),它是java.lang.Object类的实例。常用方法如下:(说白了,和Object类的方法是一致的。)

class getClass() 返回此Object的类。

int hashCode() 返回此Object的hash码。

boolean equals( Object obj ) 判断此Object是否与指定的Object对象相等。

void copy( Object obj ) 把此Object拷贝到指定的Object对象中。

Object clone() 克隆此Object对象。

String toString() 把此Object对象转换成String类的对象。

void notify() 唤醒一个等待的线程。

void notifyAll() 唤醒所有等待的线程。

void wait( int timeout ) 使一个线程处于等待直到timeout结束或被唤醒。

void wait() 使一个线程处于等待直到被唤醒。

实例练习:

 

 

 

 @71aaef8e表示当前对象的hashCode。org.apache.jsp.page_jsp意思是:在org.apache.jsp包下,类名为page_jsp。

双击ctrl,搜索page_jsp,打开文件夹,

 

 

 

 可以看到,是在org.apache.jsp包下,类名为page_jsp.java。

 

 类名为:jsp页面文件名后加_jsp。

4-9:pageContext对象和config对象

pageContext对象提供了对JSP页面内所有的对象及名字空间的访问。

pageContext对象可以访问到本页所在的session,也可以取本页面所在的application的某一属性值。

pageContext对象相当于页面中所有功能的集大成者(即有很高的访问权限)。

pageContext对象的本类名也叫pageContext。

pageContext对象

常用方法如下:

JspWriter getOut() 返回当前客户端响应被使用的JspWriter流(out)。

HttpSession getSession() 返回当前页中的HttpSession对象(session)。

Object getPage() 返回当前页的Object对象(page)。

ServletRequest getRequest() 返回当前页的ServletRequest对象(request)。

ServletResponse getResponse() 返回当前页的ServletResponse对象(response)。

void setAttribute( String name, Object attribute ) 设置属性及属性值。

Object getAttribute( String name, int scope ) 在指定范围内取属性的值。

int getAttributeScope( String name ) 返回某属性的作用范围。

void forward( String relativeUrlPath ) 使当前页面重导(也就是跳转)到另一页面。

void include( String relativeUrlPath ) 在当前位置包含另一文件。

实例练习:

(1)HttpSession getSession() 返回当前页中的HttpSession对象(session)。

 

 

 

 先访问session_page1.jsp,再访问pageContext.jsp:

 

 

 

 (2)void forward( String relativeUrlPath ) 使当前页面重导到另一页面。

 

 

 

 (3)void include( String relativeUrlPath ) 在当前位置包含另一文件。

 

 

 

 

 

config对象:

config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象),常用方法如下:

ServletContext getServletContext() 返回含有服务器相关信息的ServletContext对象。

String getInitParameter( String name ) 返回初始化参数的值。

Enumeration getInitParameterNames() 返回Servlet初始化所需所有参数的枚举。

4-10:exception对象

exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。它实际上是java.lang.Throwable的对象(是Throwable接口的实现),常用方法如下:

String getMessage() 返回描述异常的消息。

String toString() 返回关于异常的简短描述信息。

void printStackTrace() 显示异常及其栈轨迹。

Throwable fillInStackTrace() 重写异常的执行栈轨迹。

实例练习:

 

 

 

 

 

备注: ArithmeticException,算数异常。

4-11:阶段项目----实现用户登录

实现用户登录小例子:

没有使用数据库。用户名admin,密码admin,登录成功使用服务器内部转发到login_success.jsp页面,并且提示登录成功的用户名。如果登录失败则请求重定向到login_failure.jsp页面。

(1)先做一个登录页面,login.jsp:

 

 

 目前效果:(不用管图中的map3这是在开发别的项目时浏览器记住的用户名密码)

 

 

 (2)新增doLogin.jsp,用于处理提交的表单:

 

 

修改login.jsp:

(3)新增 login_success.jsp 以及 login_failure.jsp:

 

 

 

 

 

(4)测试:

(4.1)先输入正确的用户名密码,效果:

 

 

 地址栏是doLogin.jsp,是处理请求的jsp页面,说明是请求转发。

(4.2)输入不正确的用户名和密码,效果:

 

 

 地址栏地址变了,显示的是login_failure.jsp,说明是请求重定向。

(5)继续开发:

 

 

 

 

 

 效果:

 

posted on 2019-11-03 17:24  平凡力量  阅读(208)  评论(0编辑  收藏  举报