• 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.
  • 相关阅读:
    Deadlock Detecting--转
    java.util.concurrent包详细分析--转
    spring源码分析之spring-core总结篇
    Google和Baidu常用的搜索技巧--转
    极速发展的饿了么订单系统架构演进--转
    唯品会订单分库分表的实践总结以及关键步骤--转
    数据扩展性探讨和总结--转
    MAT使用--转
    Java 8 Stream API详解--转
    论海明威的存在主义宗教意识——存在主义虚无主义。注:部分观点个人不赞同
  • 原文地址:https://www.cnblogs.com/prjruckyone/p/12395068.html
Copyright © 2020-2023  润新知