JavaEE-03 JSP数据交互02

学习要点

  • application
  • pageContext
  • JSP对象作用域
  • cookie

application

作用

类似于系统的“全局变量”,用于在同一个服务器内的所有用于之间的数据共享,对于整个web服务器,application对象有且只有一个实例。

常用方法

方法名称

说  明

void setAttribute(String key,Object value)

以key/value的形式保存对象值

Object getAttribute(String key)

通过key获取对象值

String getRealPath(String path)

返回相对路径的真实路径

示例

如何实现网站的用户统计功能?

JavaEE-03 JSP数据交互02

关键代码

统计:

<%
Integer count = (Integer) application.getAttribute("count");
if (count != null) {
count += 1;
} else {
count = 1;
}
application.setAttribute("count", count);
%>

  

显示:

	<%
Integer i = (Integer) application.getAttribute("count");
out.print("统计访问量:目前有" + i + "个人访问过本网站。");
%>

  

上机练习

需求描述:实现网站计数器的功能,在网页中显示访问的人数统计。

JavaEE-03 JSP数据交互02

pageContext

作用

提供了在JSP运行时访问和其相关的环境信息的能力。通过pageContext对象可以访问和当前JSP页面相关联的所有作用域,以及页面属性。

常用方法

方法名称

说  明

ServletRequest  getRequest()

获得request对象

ServletResponse  getResponse()

获得response对象

HttpSession  getSession()

获得session对象

JspWriter  getOut()

获得out对象

void  setAttribute()

保存属性

Object  getAttribute()

获得属性

void  include()

请求指定的资源,并将目标资源的响应结果包含在调用页面的响应中。

JSP内置对象总结

内置对象

说明

out

用于向客户端输出数据。

request

用于处理客户端请求的数据信息。

response

用于响应客户端请求并向客户端输出信息。

session

用户记录会话状态的相关信息。

application

类似系统全局变量,用于实现web应用中的资源共享。

pageContext

用于访问和当前JSP页面相关联的所有域,以及页面属性。

page

表示当前页,类似java中的this。在JSP页面中使用较少。

config

用于存放JSP编译后的初始数据。在JSP页面中使用较少。

exception

表示JSP页面运行时产生的异常和错误信息,该对象只有在错误页面中才能使用。错误页面:page指令中isErrorPage=”true”的页面。

JSP内置对象的作用域

作用域

我们保存在内置对象中的信息,它的作用域是不同的。

JSP提供了四种作用域:page作用域、request作用域、session作用域、application作用域。

page作用域

指单一JSP页面范围,page作用域内的对象只能在创建该对象的页面中访问。在page作用域内使用pageContent对象的pageContext.setAttribute(String key,Object value)和pageContext.getAttribute(String key)方法来访问具有page作用域类型的对象。

page作用域内的对象在客户端每次请求JSP页面时创建,在服务器发送响应或请求转发到其他的页面或资源后失效。

pageContext对象本身属于page作用域,具有page作用的对象被绑定到pageContext对象中。

示例代码testOne.jsp:

<%
String name = "page";
pageContext.setAttribute("name",name);
%>
<strong>
testOne:<%=pageContext.getAttribute("name") %>
</strong>
<br/>
<%
pageContext.include("testTwo.jsp");
%>

  

示例代码testTwo.jsp:

<strong>
testTwo:<%=pageContext.getAttribute("name") %>
</strong>

  

测试结果:

JavaEE-03 JSP数据交互02

request作用域

request作用域内的对象则是与客户端的请求绑定在一起。该作用域的对象可以通过调用request对象的setAttribute(String key,Object value)和getAttribute(String key)方法进行存取。

request作用域内的对象在页面转发或者包含中同样有效:即调用RequestDispatcher的forward()方法转向的页面或者调用include()方法包含的页面,都可以访问request作用域内的对象。

注意:RequestDispatcher对象的include()方法与pageContext对象的include()方法实现相同的效果。

示例代码testOne.jsp:

String name = "request";
request.setAttribute("name", name);
request.getRequestDispatcher("testTwo.jsp").forward(request, response);

  

示例代码testTwo.jsp:

<strong>
testTwo:<%=request.getAttribute("name") %>
</strong>

  

测试结果:

JavaEE-03 JSP数据交互02

session作用域

JSP容器为每一次会话创建一个session对象。在会话有效期内,只要将数据绑定到session中,则该数据可以被本次会话的其他资源访问。

示例代码testOne.jsp:

<%
String req = "request";
String ses = "session";
  request.setAttribute("reqName ",req);
  session.setAttribute("sessionName ",ses);
  response.sendRedirect("testTwo.jsp");
%>

  

示例代码testTwo.jsp:

<strong>
request:<%= request.getAttribute("reqName") %><br/>
session:<%=session.getAttribute("sessionName") %>
</strong>

  

测试结果:

JavaEE-03 JSP数据交互02

application作用域

application对象的作用域是整个web应用程序。当服务器启动后,就会为web程序创建一个application对象,被所有用户共享,它的作用域最大。

application对象也是通过setAttribute(String key,Object value)和getAttribute(String key)方法进行存取数据。

示例代码testOne.jsp:

<%
String app = "application";
String ses = "session";
session.setAttribute("sesName",ses);
application.setAttribute("appName",app);
response.sendRedirect("testTwo.jsp");
%>

  

示例代码testTwo.jsp:

<strong>
session:<%=session.getAttribute("sesName") %><br/>
application:<%=application.getAttribute("appName") %>
</strong>

  

测试结果:

JavaEE-03 JSP数据交互02

cookie

概念

cookie最早由Netscape公司发明:Cookie 是 Web 服务器向用户的浏览器发送的一段 ASCII 码文本。一旦收到 Cookie,浏览器会把 Cookie 的信息片断以"名 / 值"对 (name-value pairs) 的形式储存保存在本地。

主要用于:特定对象追踪,统计网页浏览次数,记录用户登录信息,推荐个性化服务等等。不要将敏感信息保存在cookie中。

JSP中使用cookie

1、创建cookie对象

Cookie cookie = new  Cookie(String key,Stringvalue);

注:Cookie类位于javax.servlet.http。key表示cookie名称,value表示当前key名称对应的值。

cookie对象常用方法

方法名称

说明

void setMaxAge(int expiry)

设置cookie的有效期,以秒为单位。

  1. expiry=0,表示删除cookie
  2. expiry为负数或者不设:表示cookie会在当前窗口关闭后失效。

void setValue(String value)

在cookie创建后,对cookie进行赋值

String getName()

获取cookie的名称

String getValue()

获取cookie的值

String getMaxAge()

获取cookie的有效时间,以秒为单位

2、写入cookie

response.addCookie(cookie);

  

示例addCookie.jsp:写入cookie

response.addCookie(new Cookie("username","andy"));
response.addCookie(new Cookie("passowrd","888888"));
response.sendRedirect("lookCookie.jsp");

  

3、读取cookie

通过request对象的getCookies()方法返回HTTP请求中的cookie对象数组。

示例lookCookie.jsp:读出写入示例addCookie.jsp中的cookie

	Cookie[] cookies = request.getCookies();
String user="";
String pwd = "";
if(cookies!=null){
for(inti=0;i<cookies.length;i++){
if(cookies[i].getName().equals("username"))
user = cookies[i].getValue();
elseif(cookies[i].getName().equals("password"))
pwd = cookies[i].getValue();
}
}
out.print("用户名:"+user+" ,密码: "+pwd);

  

上机练习

需求描述:验证sessionid是否以cookie的形式存储在客户端。

实现思路:创建session,然后从cookie中读取sessionid,对比两个sessionid是否相同。

思考:转发是否可以向客户端写入cookie?

上机练习

  • 需求描述
  1. 用户第一次登录时需要输入用户名和密码
  2. 在5分钟内,无需再次登录则直接显示欢迎页面
  • 实现思路
  1. 用户登录后,创建cookie保存用户信息
  2. 设置cookie的有效期为5分钟
  3. 在登录页循环遍历cookie数组,判断是否存在指定名称的cookie,若存在则直接跳转至欢迎页面。
  • 参考代码

登录页面代码:

<%
Cookie[] cookies=request.getCookies();
String uname="";
if(cookies!=null){
for(int i=0;i<cookies.length;i++){
if(cookies[i].getName().equals("uname")){
response.sendRedirect("welcome.jsp");
}
}
}
%> <form action="dologin.jsp" method="post">
<p>
账号:<input type="text" name="uname">
</p>
<p>
密码:<input type="password" name="upwd">
</p>
<p>
<input type="submit" value="登录">
</p>
</form>

  

登录信息处理页代码

<%
//解决post乱码
request.setCharacterEncoding("UTF-8");
//获取账号和密码
String uname = request.getParameter("uname");
String upwd = request.getParameter("upwd"); //登录业务逻辑
if("admin".equals(uname)&&"123".equals(upwd)){
//登录成功 //用户名写入cookie
Cookie unameCookie=new Cookie("uname",uname);
unameCookie.setMaxAge(5*60);//设置有效时间
response.addCookie(unameCookie); response.sendRedirect("welcome.jsp");//重定向 }else{
//登录失败
response.sendRedirect("login.jsp");
}
%>

  

欢迎页面代码

<body>
<h1>欢迎登录!</h1>
</body>

  

Session和Cookie的比较

session

cookie

在服务器端保存用户信息

在客户端保存用户信息

session中保存的是Object类型

cookie保存的是 String类型

随会话的结束而将其存储的数据销毁

cookie可以长期保存在客户端

保存重要的信息

保存不重要的用户信息

上机练习:实现新闻发布系统的显示新闻主题列表

需求描述

管理员单击“编辑主题”超链接后,进入主题列表页,主题列表页内容从数据库中读取出来。

JavaEE-03 JSP数据交互02

上机练习:实现新闻发布系统的添加主题功能

需求描述

管理员单击“添加主题”超链接后,进入添加主题页面

输入主题名称,单击保存按钮实现主题的添加。

JavaEE-03 JSP数据交互02

提示

  • 访问数据库查询该主题是否已经存在
  • 主题已经存在则返回主题发布页面
  • 主题不存在则保存主题到数据库中
  • 输出是否保存成功提示,并跳转回主题列表显示
上一篇:JSP/Servlet开发——第二章 JSP数据交互(一)


下一篇:JSP/Servlet开发——第二章 JSP数据交互(二)