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 对象,关于这个知识稍后会进行详细的讲解。

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>
                Session                Cookie

保存的位置 服务端 客户端
安全性 较安全 较不安全
保存的内容(Value) Object(有时需要强转) String

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.
posted @ 2020-03-08 12:20  IceSwords  阅读(825)  评论(0编辑  收藏  举报