• 1. JAVA WEB开发实战经典第3章:状态管理与作用域对象Java Web程序设计
  • 2. 本章目标Java Web状态管理 1.作用域对象 2.案例3.
  • 3. HTTPHTTP协议是个无状态的协议。 在HTTP协议中,客户端打开一个连接,并发送请求到服务器,服务器响应请求到客户端,最后关闭连接。在关闭连接之后Web服务器不会保存这次请求响应过程的任何状态信息。 在Web程序开发中,保持状态可以在多个请求和响应之间实现复杂的应用逻辑 两种用于保持HTTP连接状态的技术Cookie和Session
  • 4. CookieCookie是什么 Cookie是Web服务器保存在客户端上的一个文本文件。也即程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据了。 Cookie的作用 解决浏览器用户与Web服务器之间无状态通信的问题,也即保存用户的数据
  • 5. Cookie的典型应用实现“记住我”的功能
  • 6. Cookie的典型应用记录用户访问动作
  • 7. Cookie的作用浏 览 器服 务 器购买Servlet支付ServletSet cookie name=“洗衣机”Set cookie name=“洗衣机”name=“洗衣机”IE缓冲cookie name=“洗衣机”cookie name=“洗衣机”
  • 8. 设置Cookie创建Cookie对象 Cookie cookie=new Cookie(String name,String value); 设置cookie的名称和值 设置Cookie的有效期 cookie.setMaxAge(secondtime); secondtime以秒为单位 设置cookie失效,则可以把时间设置为0 将cookie发送到客户端保存 response.addCookie(cookie);
  • 9. 读取Cookie获取cookie数组 Cookie cookies[]=request.getCookies(); 获取cookie数组 获取cookie名 mycookie.getName(); 获取cookie值 mycookie.getValue()
  • 10. 范例:实现“记住我”功能编写设置Cookie页面GetCookieServlet.java 获取cookie 编写表单:提供用户名、密码、和提交按钮 将用户名和密码框中value属性的属性值设置为通过cookie获取的值,即:cookie.getValue() 编写设置Cookie页面SetCookieServlet.java 设置cookie
  • 11. 范例:实现“记住我”功能getCookieServlet.java
  • 12. 范例 :实现“记住我”功能setCookieServlet.java
  • 13. 使用Cookie的注意事项浏览器一般只允许存放300个cookie,每个站点最多存放20个cookie,每个cookie大小限制为4KB Cookie在个人硬盘上所保存的文本信息是以明文格式进行保存的,没有任何加密措施 如果将Cookie发送到浏览器,默认情况下是一个会话级别的,也即存储在浏览器内存中,用户退出浏览器后也被删除。 若希望能保存Cookie,需要调用setMaxAge()方法来设置cookie保存的最大有效期,即可将Cookie保存到客户端的硬盘上
  • 14. 会话管理---Session在Web应用运行过程中,通常把客户端浏览器与服务器的一次连接过程称为一个Session会话。 实现数据共享 Session技术 session是服务器端技术,利用该技术,服务器在运行时可以为每个浏览器用户创建一个其独享的session对象,用户在访问浏览器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中其他web资源时,其他web资源再从用户各自的session中取出数据为用户服务
  • 15. 会话管理---SessionSession和cookie的区别 cookie是把用户的数据写给用户浏览器 session是把用户数据写在服务器 Session对象由服务器创建,可以调用request对象的getSession方法得到session对象
  • 16. Session API创建session 通过request对象的getSession()方法创建session public HttpSession getSession() 返回的是一个HttpSession对象 通过HttpSession对象可以设置session的值、取得session的值 session.setAttribute(“name”,”value”);//设置session的值 session.getAttirbute(“name”);//取得指定名称的session值 public java.lang.String getId() //获得session的id号public void invalidate() //使得session失效public boolean isNew() //判断session是否是第一次创建
  • 17. HttpSession接口——普通方法常用方法 public String getId();:返回session对象的ID public long getCreationTime();:返回会话创建时间,时间为从1970年1月1日午夜到现在的毫秒数。 public long getLastAccessTime();:返回会话最后访问时间 public boolean isNew();:返回是否是新建的会话,是则返回true public ServletContext getServletContext():返回该对象所属的ServletContext对象
  • 18. session超时与失效会话超时 在web.xml文件设置会话超时时间 10 时间以分钟为单位,时间为0或小于0的值表示会话永不过期 针对web应用中所有的会话对象 设置最大有效时间 public void setMaxInactiveInterval(int interval):设置会话失效前,客户的两个请求之间最大间隔的秒数,负数为永不过期。 public int getMaxInactiveInterval( ):返回会话最大的间隔时间。 针对当前会话对象有效。
  • 19. session超时与失效会话失效 在执行完某种操作后使会话立即失效 public void invalidate(); 使会话失效并解除绑定到其上的任何对象。
  • 20. 范例:使用session方法
  • 21. HttpSession接口——session存储数据(session属性范围)session属性范围 public void setAttribute(String name,Object value):将一个指定名称的值存储到session对象中。 public Object getAttribute(String name):返回session范围中保存的name属性的值。 public Enumeration getAttributeNames();:返回session范围中保存的所有属性名,返回值是Enumeration类型 public void removeAttribute(String name);:从session范围中删除指定名称的属性。
  • 22. 范例:改进登录登录 步骤 编写login.html 编写LoginServlet.java:接收用户登录信息,判断信息是否正确,如果正确则重定向到欢迎页面,否则重定向到登录页面。 在web.xml文件中配置LoginServlet.java 编写IndexServlet.java,显示欢迎登录者的信息,提供“退出”超链接,当点击退出时,链接到logoutServlet.java 编写logoutServlet.java,重定向到login.html问题:利用已有知识不能实现在IndexServlet中显示登录者信息,需作用域对象解决
  • 23. 作用域对象使用作用域对象的目的是可以在不同的Servlet、JSP等Web组件之间进行数据的传送 作用域对象的主要作用是充当容器对象存放任何对象信息。 在Java Web编程中常见的作用域对象有HttpSession、 ServletContext和ServletRequest。 作用域对象的主要方法是保存和获取作用域对象中的数据, 保存信息方法public void setAttribute(String name,Obejct value) 获取信息方法public Object getAttribute(String name)。 返回所有属性名称public Enumeration getAttributeNames(); 移除指定名称属性public void removeAttribure(String name);
  • 24. 作用域对象会话对象-----HttpSession HttpSession对象在客户端发起一个新的会话时创建,在会话结束时销毁 其中保存的信息存在范围为整个会话中。 以下对象一般放在HttpSession对象中 在整个会话中经常需要使用的数据 进行客户端重定向时需要传递数据时解决登录范例中的问题
  • 25. 范例:改进登录登录 步骤 编写login.html 编写LoginServlet.java:接收用户登录信息,判断信息是否正确,如果正确则将登录信息保存在session作用域中并重定向到欢迎页面,否则重定向到登录页面。 在web.xml文件中配置LoginServlet.java 编写IndexServlet.java,获取session作用域中的对象并显示欢迎登录者的信息,提供“退出”超链接,当点击退出时,链接到logoutServlet.java 编写logoutServlet.java,注销session并重定向到login.html
  • 26. 作用域对象Web应用对象-----ServletContext 将web应用部署到服务器上,启动web服务器后,web容器为每个web应用创建一个表示web应用环境的对象也即ServletContext对象 web应用的基本信息存储在这个ServletContext对象中,所有web组件都可以访问此ServletContext对象,进而取得web应用的基本信息。 ServletContext对象在Web应用启动时创建,Web应用停止时销毁。 ServletContext对象对于一个Web应用来说是唯一的,其中保存的信息存在范围为整个Web应用。 ServletContext对象中一般存放一些Web应用中所有用户都要使用的数据
  • 27. 作用域对象Web应用对象-----ServletContext Web应用对象的类型 javax.servlet.ServletContext接口 Web应用对象的获取 直接使用从HttpServlet父类中继承的取得ServletContext对象的方法取得此对象 public ServletContext getServletContext()
  • 28. 作用域对象Web应用对象-----ServletContext 使用ServletContext对象存储数据—web应用作用域(作用范围) 将对象保存到ServletContext中 从ServletContext中获取指定名称的属性对象 将指定的属性从ServletContext中移除 取得所有属性的名称列表public void setAttribute(java.lang.String name, java.lang.Object object) public java.lang.Object getAttribute(java.lang.String name) public void removeAttribute(java.lang.String name)public java.util.Enumeration getServletNames()
  • 29. 作用域对象Web应用对象-----ServletContext 统计页面被访问次数
  • 30. 作用域对象请求对象-----ServletRequest 在客户端发起请求时创建,服务器向客户端做出响应时结束。 在ServletRequest作用域对象保存的信息存在范围为这次请求过程中 以下数据一般放在ServletRequest作用域对象中 在进行请求转发(服务器内部跳转)时
  • 31. 作用域对象请求对象-----HttpRequest 请求转发 Servlet先对客户端请求做一些预处理,然后把请求转发给其他Web组件来完成响应操作 属于服务器端跳转 跳转后浏览器地址栏地址为跳转前的地址 请求的数据可以带到下一个页面,属于同一个请求对象 属于无条件跳转,只要执行到了,立即执行跳转
  • 32. 作用域对象请求对象-----HttpRequest 将请求数据转到其他页面去处理 通过ServletRequest接口的getRequestDispatcher()方法获得RequestDispatcher对象 getRequestDispatcher(String path) path:指定了要转发到的资源路径 ——绝对路径:以/开头,即相对于当前应用的根目录 ——相对路径:不以/开头,相对于当前资源的所在的目录 使用RequestDispatcher对象调用forward()方法实现转发 forward(ServletRequest req,ServletResponse res); 将请求从一个资源转发到服务器上另一个资源(path)
  • 33. 作用域对象作用域对象的比较 ServletContext、HttpSession、ServletRequest对象的作用域依次变小,在能够满足要求的情况下,选择尽可能小的作用域对象使用。 从作用域对象中获得指定参数的信息,如果参数不存在则返回null。 ServletContext、HttpSession、ServletRequest对象参数独立,没有包含关系,即存放在作用域大的对象中的数据利用作用域小的对象无法获取。
  • 34. 作用域对象作用域对象的比较 范例 通过请求转发获取数据 通过重定向获取数据 通过超级链接获取数据