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) |
返回相对路径的真实路径 |
示例
如何实现网站的用户统计功能?

关键代码
统计:
<%
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 + "个人访问过本网站。");
%>
上机练习
需求描述:实现网站计数器的功能,在网页中显示访问的人数统计。

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>
测试结果:

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>
测试结果:

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>
测试结果:

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>
测试结果:

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的有效期,以秒为单位。
|
|
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?
上机练习
- 需求描述
- 用户第一次登录时需要输入用户名和密码
- 在5分钟内,无需再次登录则直接显示欢迎页面
- 实现思路
- 用户登录后,创建cookie保存用户信息
- 设置cookie的有效期为5分钟
- 在登录页循环遍历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的更多相关文章
- JSP数据交互
JSP数据交互 一.jsp中java小脚本 1.<% java代码段%> 2.<% =java表达式%>不能有分号 3.<%!成员变量和函数声明%>二.注释 1 ...
- #学习笔记#JSP数据交互
#学习笔记#JSP数据交互 数据库的使用方式: 当用户在第一个页面的查询框输入查询语句点提交的时候我们是用什么样的方式完成这个查询的? 答:我们通过在第一个页面提交表单的形式,真正的数据库查询时在 ...
- jsp数据交互(一).2
01.什么是JSP内置对象(jsp核心)? Java 内置对象 Java 作用域 解析:jsp内置对象是web容器创建的一组对象.我们都知道tomcat这款软件可以看成是一种web容器,所以我们可以 ...
- JSP数据交互(二)和Servlet基础
01.Application原理与应用 01.application对象的作用域范围是整个应用服务,而它在应用中所承担的责任就类似于一个全局变量.只要服务启动,则application对象就会存在. ...
- jsp数据交互(二).3
01.Application原理与应用 01.application对象的作用域范围是整个应用服务,而它在应用中所承担的责任就类似于一个全局变量.只要服务启动,则application对象就会存在. ...
- jsp数据交互(一),九大内置对象
九大内置对象 九大内置对象 内置对象 类型 说明 作用域 request javax.servlet.ServletRequest 请求对象——在 一次请求/一个Request请求周期 中传递数据,请 ...
- JSP/Servlet开发——第二章 JSP数据交互(一)
1. JSP内置对象:JSP内置对象是 Web 容器创建的一组对象: ●JSP常用的内置对象:out.request.application.session.response等: ●内置对象不需要 ...
- 第二章 jsp数据交互(一)
JSP如何处理客户端的请求? 解析:通过jsp内置对象 表单数据被提交到了jsp页面! 什么是JSP内置对象(jsp核心)? Java 内置对象 Java 作用域 解析:jsp内置对象是web容器创 ...
- JSP———数据交互【1】
JSP的内置对象 不用声明就可以在JSP页面中使用 request对象 内置对象 request 封装了用户提交的信息,主要用于处理客户端请求 <FORM action="tom.js ...
随机推荐
- Android控件大全(四)——CoordinatorLayout
CoordinatorLayout 其实就是个高级的FrameLayout,用于协调子布局要使用该控件,需要再gradle中加入: compile 'com.android.support:desig ...
- E20180327-hm
renew vt. 补充; 重新开始; 使更新; 使恢复; vi. 重申,重复强调; 重新开始; renewal n. 重建,重生; 更新,革新; 重申; 合同的续订;
- Codeforces - 1114B - Yet Another Array Partitioning Task - 构造 - 排序
https://codeforces.com/contest/1114/problem/B 一开始叫我做,我是不会做的,我没发现这个性质. 其实应该很好想才对,至少要选m个元素,其中m个作为最大值,从 ...
- 洛谷 - P2335 - 位图 - 简单dp
https://www.luogu.org/problemnew/show/P2335 假如我们使用dp的话,每次求出一个点的左上方.右上方.左下方.右下方的最近的白点的距离.那么只是n²的复杂度.这 ...
- hdoj5842【水题】
比赛的时候还特别撒比地写了二分的那个写法,然后wa了一发,因为这个集合的翻译成自然数集.还是转换了一下,还是去写了一个二分. 后面就是出现几种就是多长... 比赛的真的非常非常挫的code-. #in ...
- python 类对象和实例对象动态添加方法
class Person(): def __init__(self, name): self.name = name def print_name(self): print(self.name) p ...
- win10家庭版安装
https://www.microsoft.com/zh-cn/software-download/windows10ISO https://www.2cto.com/os/201704/621770 ...
- loj#2540. 「PKUWC2018」随机算法
传送门 完了pkuwc咋全是dp怕是要爆零了-- 设\(f(S)\)表示\(S\)的排列数,\(S\)为不能再选的点集(也就是选到独立集里的点和与他们相邻的点),\(mx(S)\)表示\(S\)状态下 ...
- 大数据系列文章-Hadoop的HDFS读写流程(二)
在介绍HDFS读写流程时,先介绍下Block副本放置策略. Block副本放置策略 第一个副本:放置在上传文件的DataNode:如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点. 第二 ...
- 第二类Stirling数初探 By cellur925
上午noi.ac崩崩崩了,栽在组合数学上,虽说最后在辰哥&Chemist的指导下A掉了此题,也发现自己组合数学太弱了qwq. 在luogu上找题,结果找到了一个第二类斯特林数的题(还是双倍经验 ...