JavaWeb学习(五) : 九大内置对象
内置对象是什么?
内置对象是自带的对象,不需要我们去 new 一个,形象化一点就是咱们一起出去玩,
这次旅游有个规定,每个人都需要带一个对象,然而小明本身就有对象,所以不用去
在找一个临时的对象来凑数了,然而可伶巴巴的我为了充面子不得不临时 New 一个。
是对象就会有属性和方法,所以说内置对象的属性和方法我们就可以直接拿来用,而
非内置对象就需要进行实例化才可以使用。
内置对象有哪些?
1、out 对象: 负责管理对客户端的输出。
2、request 对象: 负责得到客户端的请求信息。
3、response 对象: 负责向客户端发出响应。
4、session 对象: 负责保存同一客户端一次会话过程中的一些信息。
5、application 对象: 表示整个应用的环境信息。
6、exception对象: 表示页面上发生的异常,可以通过它获得页面异常信息。
7、page 对象: 表示的是当前JSP页面本省,就像 Java 类定义中的 this
一样。
8、pageContext 对象: 表示的是此 JSP 的上下文。
9、config 对象: 表示此 JSP 的ServletConfig。
out 对象:
作用:用于输出一些内容。
常见方法:
void print();
void println();
该方法比较常见,基本上在每一个 Jsp 页面中都能看到,在此不再多加赘述。
request 对象:
作用:
请求对象,存储"客户端向服务端发送的请求信息",也就是说我们可以通过这个
对象知道我们的用户想要干什么,有什么样的需求。
常见方法:
1、String getParameter(String name);
根据请求的字段名 key(name 属性),返回字段值 value(value 属性),参数里面放置字段名。
2、String[] getParameterValues(String name)
根据请求的字段名 key,返回多个字段值,最常见的是checkbox,访问时
常常通过一个循环进行访问。
3、void setCharacterEncoding("编码格式 utf-8"):设置请求编码。
4、getRequestDispatcher("b.jsp").forward(request,response)
:请求转发,实现页面跳转。
5、ServletContext gerServerContext():
获取项目的 ServletContext 对象。
Code 测试:
实现一个注册的信息,用户注册,注册成功后显示用户的注册信息。
register.jsp 页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- Get提交方式:method = "get"和地址栏,超链接,请求方式,默认都是get提交方式
缺陷: a、在地址栏会显示请求信息,如果文件太大的话,地址栏会容纳不下。
b、不安全,会将用户的信息暴露在地址栏
Get 与 Post提交方式的区别:
Post 不会显示信息到地址栏。
(文件上传操作必须是Post提交方式,最好用POST提交方式)
-->
<form action = "show.jsp" method = "post">
User:<input type = "text" name = "uname"> <br>
Password:<input type = "password" name = "upwd"> <br>
Age:<input type = "text" name = "uage"> <br>
Hobbies:<input type = "checkbox" name = "uhobby" value = "足球"> 足球 <br>
<input type = "checkbox" name = "uhobby" value = "篮球"> 篮球 <br>
<input type = "checkbox" name = "uhobby" value = "乒乓球">乒乓球<br>
<input type = "submit" name = "注册">
</form>
</body>
</html>
show.jsp 页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
// 只设置 Post 方式
request.setCharacterEncoding("utf-8");
// 通过 name 属性 来获取 value
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
// 强制转换
int age = Integer.parseInt(request.getParameter("uage"));
String[] hobbies = request.getParameterValues("uhobby");
%>
注册成功! <br>
用户信息如下 : <br>
User Name : <%=name %> <br>
User password : <%=pwd %> <br>
User age : <%=age %> <br>
User Hobbies: <br>
<%
// 有可能一个都不选,所以要特殊处理一下,否则会出现 500
if(hobbies != null) {
for(String hobby : hobbies) {
out.print(hobby + " ");
}
}
%>
</body>
</html>
reponse 对象:
作用:
响应对象,对客户端进行响应。
常见方法:
void addCookie(Cookie cookie);
服务端向客户端增加 Cookie 对象
void sendRedirect(String location) throws IOException;
重定向,页面跳转的一种方式。
void setContenType(String type)
设置服务器响应编码
Code 实例:
登录操作,登录成功就跳转到 success.jsp 页面。
login.jsp 页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="check.jsp" method="post">
User : <input type="text" name="uname" /> <br>
Password : <input type="password" name="upwd" /> <br>
<input type="submit" value="登录" />
</form>
</body>
</html>
check.jsp 页面(检查用户名和密码是否正确和相匹配)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
/*
页面跳转的两种方式:
请求转发 重定向(主要利用response对象)
地址栏是否发生改变 不变 变 (请求了两次)
是否保留第一次请求 保留 不保留
时的数据
请求次数 1 2
跳转发生位置 服务端内部 重新回到客户端,由客户端再次请求
*/
request.setCharacterEncoding("utf-8") ;
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
if(name.equals("zs") && pwd.equals("abc")) {
// 重定向(可能会造成数据的丢失)
//response.sendRedirect("success.jsp");
// 请求转发的方式(服务端内部进行跳转)
request.getRequestDispatcher("success.jsp").forward(request, response);
} else {
//out.print(pwd + "<br>");
out.print("登录失败,用户名或者密码错误");
}
%>
</body>
</html>
success.jsp 成功后跳转页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
登录成功!
<br> 欢迎
<%
String name = request.getParameter("uname");
// 重定向时 显示的是 Null
out.print(name + "<br>");
%>
</body>
</html>
Session 对象:
Cookie(不是内置对象,但与 Session 密切相关)
Cookie 是由服务端生成的,再发送给客户端进行保存。
作用:
1、本地缓存的作用,例如我们登录某个网页时保存密码,下次再登录时就可以直接登录。
2、提高访问服务端的效率,但是安全性较差。
常见方法及应用:
Cookie 也是以键值对的方式进行存储,一个 key 对应一个 Value.
是由 javax.servelet.http.Cookie 类产生的对象。
public Cookie(String name,String value);
// 可以通过构造方法增加 Cookie 对象。
String getName() ;
// 获取 name(key)
String getValue();
// 获取 value
void setMaxAge(int expiry);
// 设置最大有效期(秒)
服务端怎么生成呢?
response.addCookie(Cookie cookie);
怎么发送给客户端进行保存呢?
通过页面跳转的方式实现发送给客户端(请求转发或者重定向)
最后客户端获取 Cookie
request.getCookies()
(无法获取单个Cookie,会获得所有的Cookie,需要进行扫描)
总结:
服务端增加 Cookie: reponse 对象。
客户端获取对象: request 对象。
代码演示:
Add_Cookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
// 创建 Cookie 对象
Cookie cookie1 = new Cookie("name","ls");
Cookie cookie2 = new Cookie("pwd","123");
// 服务端生成 Cookie 对象
response.addCookie(cookie1);
response.addCookie(cookie2);
// 发送到 客户端
response.sendRedirect("requese.jsp");
%>
</body>
</html>
reuqest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 客户端获取 Cookie 对象 -->
<%
Cookie[] cookies= request.getCookies();
for(Cookie cookie : cookies) {
out.print(cookie.getName() + " " + cookie.getValue() + "<br/>");
}
%>
</body>
</html>
这时候我们输出Cookie 的键值对的时候,会出现如下效果:
除了我们想要得到东西,还多了一个 JSESSIONID ,这是因为Cookie 对象在发送到客户端的时候
会自动生成一个 JSESSIONID 对象,关于这个知识稍后会进行详细的讲解。
Cookie 经典案例(实现记住密码的功能):
login.jsp 页面:(客户端)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 声明一个全局变量 -->
<%!
String uname;
%>
<%
boolean flag = false;
// 判断Cookie是否已经失效
Cookie[] cookies = request.getCookies();
// 不能直接获取某一个单独对象,只能一次性将全部的Cookie对象拿到
for(Cookie cookie : cookies) {
if(cookie.getName().equals("uname")) { // 逐个判断
uname = cookie.getValue();
flag = true;
}
}
if(!flag) {
out.print("Cookie已失效!");
} else {
out.print("Cookie:" + uname);
}
%>
<form action="check.jsp" method="post">
User : <input type="text" name="uname" value=<%=(uname == null ? "" : uname) %>> <br>
<!-- 由于第一次没有用户登录时是null,所以我们需要判断一下 -->
Password : <input type="password" name="upwd"> <br>
<input type="submit" value="登录">
</form>
</body>
</html>
Check.jsp(服务端)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8") ;
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
// 在服务端生成一个 Cookie 对象
Cookie cookie = new Cookie("uname",name);
// 设置保留的最长时间
cookie.setMaxAge(10);
response.addCookie(cookie);
//通过响应的方式在服务端生成
// 跳转到客户端,便于获取 Cookie(从服务端跳转到的任意界面都是客户端)
response.sendRedirect("A.jsp"); // 只是一种将信息传入到客户端的一种方式
// 新建一个 jsp 页面用于实现
// 通过重定向或者请求转发的方式将信息传入到客户端,然后让客户端得到姓名
%>
</body>
</html>
Session 对象的作用:
session 被称为一次会话,比如我们去参观某个朋友的房子,从到朋友家到参观完,然后最
后回到家,这被称为一次会话,及 开始 - > 结束。
还有一些例子:
浏览网站: 开始 -- > 关闭
购物: 浏览 -- 付款 -- 退出
那 Session 有什么用呢?
拿登录淘宝网页来说,在我们第一次登录时需要输入账号密码进行登录,但是我们再开一个网页,
再次进入淘宝网页时,就不需要再进行输入账号密码了。(注意是在同一个浏览器下),关于Session
的具体运行机制,请看下文。
Session 运行机制(包括对上文 JSESSIONID 的解释):
1、客户端第一次请求服务器时(也就是第一次登录时),服务端会产生一个 Session 对象(用于保存客户的各种信息
包括 账号、密码、及各种购物情况)。
2、并且每个Session 对象 都会有 唯一的 sessionID (用于区分其他 Session)
3、服务端会产生一个 Cookie ,并且 该 Cookie 的 name = JSESSIONID ,value = 服务端 SessionID 的值(用于
进行唯一的匹配。
4、然后服务端在响应客户端的同时,将 Cookie 发送给客户端,至此,客户端就有了一个 Cookie (JESSIONID).
5、至此,客户端就有了一个 JESSIONID 与 服务端的 SESSIONID 进行一一对应。
6、客户端第 二/n 次请求服务端时, 服务端会先用 cookie 中的 JESSSIONID 去和 服务端中的 Sessionid 进行匹配,
匹配成功,说明此用户已经登录过,如果说没有匹配上,则进行上述步骤,实际上第一次登录时也会进行匹配。
用生活实例对 Session 运行机制进行解释:
商场买东西:
顾客拿着包去商场买东西,到商场门口时需要进行 存包:
客户端:顾客(客户端)
服务端:存包处 -- 服务端
顾客第一存包: 商场 判断 此人是不是第一次存包(观察顾客手里是否有钥匙)
如果是新顾客(没钥匙) : 分配一个钥匙给顾客,此时钥匙和柜子的编号一一对应(JSESSIONID 和 Session 一一对应)
第 2/n 次存包,商场 判断此人是否之前已经存储过包(通过手里是否有钥匙进行匹配)
如果是老顾客(有钥匙) :则不需要分配,该顾客手里的钥匙会和柜子 自动进行 一 一对应。
Session 对象的一些细节问题:
1、Session 存储在服务端。
2、Session 是在同一个用户(客户,不能说张三的柜子和李四的钥匙匹配上了,这时候柜台服务的小姐姐就要被罚款咯)请求时共享。
3、Session 的实现机制。
Session 方法 :
String getId();
// 获取 Sessionid
boolean isNew()
//判断是否是新用户(是否是第一次访问)
void invalidate()
// 使 Session 失效,(退出登录,注销)
Object getAttribute();
void setAttribute();
void setMaxInactiveInterval(秒);
// 设置最大有效非活动时间。
int getMaxInactiveInterval()
// 获取最大有效非活动时间
Code测试:
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="check.jsp" method="post">
User : <input type="text" name="uname" /> <br>
Password : <input type="password" name="upwd" /> <br>
<input type="submit" value="登录" />
</form>
</body>
</html>
welcome.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
欢迎您:
<%
// session.getAttribute() 返回值是 Object,需要进行强制转换
String name = (String)session.getAttribute("uname");
if(name != null) { // 未输入正确的账户时无法进入欢迎界面,需要重新输入账户
out.print(name);
} else {
response.sendRedirect("login.jsp");
}
%>
<!-- 注销 -->
<a href="back.jsp">退出登录</a>
</body>
</html>
check.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
if (name.equals("zs") && pwd.equals("abc")) {
// 只有登录成功,session中才会有 uname / upwd
// 登录成功后分配给用户一个 SessionID
session.setAttribute("uname", name);
session.setAttribute("upwd", pwd);
// 设置页面最大非活动时间(保证其安全性)
//session.setMaxInactiveInterval(10);
// 检测服务端Session和客户端Cookie自带的JSESSIONID是否一致
System.out.println("sessionID" + session.getId());
// Cookie在服务端生成,通过响应传送到客户端
// cookie 产生时自带一个 JSESSIONID
Cookie cookie = new Cookie("uname",name);
response.addCookie(cookie);
request.getRequestDispatcher("welcome.jsp").forward(request, response);
} else {
// 登录失败就重新登录
response.sendRedirect("login.jsp");
}
%>
</body>
</html>
back.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
// 账户失效
session.invalidate();
response.sendRedirect("login.jsp");
%>
</body>
</html>
A.jsp(检测客户端的 JESSIONID 和 Sessionid 是否一致,第二次请求的页面,JESSIONID 已经分配好)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 同一个账户可以任意访问本次会话中的所有内容 -->
<%
out.print(session.getAttribute("uname"));
// 第二次请求(看sessionID 和JSESSIONID是否一致)
// Cookie 自帶 JSESSIONID
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies) {
if(cookie.getName().equals("JSESSIONID")) {
System.out.println("JSESSIONID" + session.getId());
}
}
%>
</body>
</html>
Cookie 和 Session 的区别:
Session Cookie
保存的位置 服务端 客户端
安全性 较安全 较不安全
保存的内容(Value) Object(有时需要强转) String
Cookie 内容的补充:
1、Cookie 不是内置对象,要使用需要 new 。
2、但是客户端在第一次请求时,服务端会自动产生一个Cookie(只包含 JSESSIONID 的 Cookie).
Application 对象:
作用:全局对象
常见方法:
String getContextPath()
// 获取相对路径
String getRealPath()
// 获取绝对路径(相对于相对路径的绝对路径)
// 往往需要先知道当前项目的相对路径,然后根据当前的相对路径找到其绝对路径
四种范围对象的作用域及常见用法:
四种范围对象的相对大小关系:
从小到大:
1、pageContext() Jsp页面容器 -- 只对当前页面有效
2、request() 请求对象 -- 同一次请求有效(请求转发可以,重定向不行,具体解释请看上文代码)
3、session() 会话对象 -- 同一次会话有效(只要不关闭/切换浏览器都可以)
(页面跳转时 请求转发和重定向都可以)
4、application 全局对象 -- 同一个项目有效(不关闭服务器或者不切换项目都有效)
四种范围对象共有的方法:
void setAttribute(String name,Object obj)
// 增加或者修改属性
Obiect getAttribute(String name)
// 根据属性名获取对应的值
void removeAttribute(String name)
// 根据属性名,删除对象
四种范围对象的分析:
a、pageContext()
当前页面有效,页面跳转后无效
b、request()
同一次请求有效,其他请求无效(可以多次请求转发,但是不能重定向)
c、Session()
可以使得重定向也有效
从登录到退出都有效,切换浏览器无效
d、application()
整个项目都有效,切换浏览器也有效
关闭项目或者关闭服务器无效
后记:
其他对象用的不太多,遇到后再进行补充,后续更新 ing.
如果说年轻人未来是一场盛宴的话,那么我首先要有赴宴的资格。