头哥educoder - JSP 隐式对象与四大作用域

写在前面:个人博客,欢迎来玩!!vASTSEa'S bLOg - 写点什么

极速版:

第1关:JSP 输入与输出对象

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>接收页面</title>
    </head>
    <body>
        <%
			/********** Begin **********/

			//将字符串编码设置为 utf-8
            request.setCharacterEncoding("utf-8");
			//获取表单传来的参数
            String user = request.getParameter("userName");
            String pass = request.getParameter("password");
			//验证用户名和密码是否正确
            if(user.equals("admin")&& pass.equals("123456")){
                out.print("登录成功!");
            }else{
                response.sendRedirect("form.jsp");
            }
				//正确:输出:登录成功!

            	//否则,重定向到form.jsp


								
			/********** End **********/
        %>
    </body>
</html>

第2关:JSP 通信控制对象

request.jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>接收页面</title>
    </head>
    <body>
        <%
			/********** Begin **********/
            request.setCharacterEncoding("utf-8");
			//获取表单传来的参数
            String user = request.getParameter("userName");
            String pass = request.getParameter("password");
            if(!user.isEmpty()&& !pass.isEmpty()){
                session.setAttribute("userName",user);
                response.sendRedirect("index.jsp");
            }
           	//对用户名和密码进行非空判断

	        //如果非空,将用户名存入session中,重定向到index.jsp

								
			/********** End **********/
        %>
    </body>
</html>

 index.jsp

<%@ page language="java" import="java.util.*"
         contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
         errorPage="error.jsp"%>
<html>
<head>
    <title>index</title>
</head>
<body>
<%
	/********** Begin **********/
	//此处完成获取访问次数的功能
    Object obj=application.getAttribute("counter");
    if (obj==null){
        application.setAttribute("counter",new Integer(1));
        out.println("该页面被访问了1次<br/>");
    }else {
        int countValue=new Integer(obj.toString());
        countValue++;
        out.println("该页面被访问了"+countValue+"次<br/>");
        application.setAttribute("counter",countValue);
    }
    
	/********** End **********/

%>
<%-- ********** Begin ********** --%>
<%--此处存放 session获取到的用户名--%>
用户名:<%=session.getAttribute("userName")%>
<%-- ********** End ********** --%>
</body>
</html>

 第3关:JSP Servlet 对象

<%@ page language="java" import="java.util.*"
         contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
         errorPage="error.jsp"%>
<html>
<head>
    <title>index</title>
</head>
<body>

<%-- ********** Begin ********** --%>
<%--使用 config 对象获取 JSP 页面编译后的 Servlet 的名称。--%>
Servlet 名称:<%=config.getServletName()%>
<%-- ********** End ********** --%>
</body>
</html>

第4关:JSP 异常对象

request.jsp

<%-- ********** Begin ********** --%>
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="error.jsp"%>
<%-- ********** End ********** --%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>接收页面</title>
    </head>
    <body>
        <%
			request.setCharacterEncoding("utf-8");
            String userName=request.getParameter("userName");
            String password=request.getParameter("password");
            if(!userName.equals("")&&!password.equals("")){
	            response.sendRedirect("index.jsp");
            }
        %>
    </body>
</html>

error.jsp

<%-- ********** Begin ********** --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
                pageEncoding="UTF-8" isErrorPage="true"%>
<%-- ********** End ********** --%>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>错误页面</title>
</head>
<body>
<%-- ********** Begin ********** --%>
异常类型:<%=exception.getClass()%><br>
异常信息:<%=exception.getMessage()%><br>
<%-- ********** End ********** --%>

</body>
</html>

 第5关:JSP 四大作用域

<%--
  Created by IntelliJ IDEA.
  User: MaNing
  Date: 2020/1/3
  Time: 15:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>作用域</title>
</head>
<body>

<%
/********** Begin **********/
request.setAttribute("srequest","我是request作用域");
session.setAttribute("ssession","我是session作用域");
application.setAttribute("sapplication","我是application作用域");
/********** End **********/

request.getRequestDispatcher("index.jsp").forward(request,response);
%>



</body>
</html>

以下题目:
第1关:JSP 输入与输出对象

任务描述
本关任务:编写一个获取用户登录信息的小程序。

相关知识
为了完成本关任务,你需要掌握:

了解 JSP 隐式对象中的输入输出对象;
掌握 out、request、response 的用法。
输入输出对象
对象    描述
out    PrintWriter类的实例,用于把结果输出至网页上
request    HttpServletRequest类的实例
response    HttpServletResponse类的实例
out 对象
out 对象是 javax.servlet.jsp.JspWriter 类的实例,JSP 通过 out 对象向客户端浏览器输出信息,并且管理应用服务器上的输出缓冲区。

以下是 out 的一些常用方法:

out.print():向客户端浏览器输出信息,可以自动将各种类型的数据转换成字符串的形式进行输出。
例子:我们用其向浏览器输出Hello world!。

<%
    out.print("Hello world!");
%>
打开浏览器,效果如下:


out.println():我们也可以用该方法向浏览器输出信息,它与 out.print() 类似,不同在于该方法在输出内容后输出一个换行符。
我们来看一个例子:

<%
    out.println("Hello world!");
    out.println("您好!");
%>
打开浏览器,效果如下:


看到上图,相信大家心里会有疑问:它并没有进行换行啊?

println() 虽然看似是换行,但转成网页之后,这种换行被认为是空格,所以输出的仍然是一行,用空格分隔,但右键点击页面查看源代码时,能看出换行起作用了。

所以在页面上需要换行的话,需要用 <br />。

<% out.println("Hello world!"); %>
<br />
<% out.println("您好!"); %>
打开浏览器,效果如下:


out 对象不仅可以向 JSP 页面输出对内容,而且还可以管理页面中的缓冲区:

crear():清除缓冲区中的内容;

crearBuffer():清除当前缓冲区中的内容;

flush():刷新流;

isAutoFlush():检测当前缓冲区已满时是自动清空,还是抛出异常;

getBufferSiae():获取缓冲区的大小;

void close():关闭流。

request 对象
request 隐式对象是 javax.servlet.http.HttpServletRequest 对象的一个实例。其表示客户端请求页面时,JSP 将创建一个新对象来表示该请求,其包含了所有的请求信息。

以下是 request 的一些常用方法:

String getParameter(String name):根据页面表单组件名称获取请求页面提交的数据。

String getParameterValues(String name):获取页面请求中一个表单组件对应多个值时的用户的请求数据(例如复选框)。

request.setCharacterEncoding("UTF-8"):POST 请求时设置中文编码:设置对客户端请求进行重新编码的编码。("utf-8"):设置字符集;

getRequestDispatcher("目标地址").forward(request,response):请求转发到指定 url。其是一次请求,转发后请求对象会保存,地址栏的 url 地址不会发生改变。
简单例子

form.jsp:这有一个简单的 form 表单,用于发送用户输入的信息;

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>输入界面</title>
    </head>
    <body>
        <!--action:发送的地址  method:提交方式 (在后面的实训中我们会为大家详细介绍)-->
        <form action="request.jsp" method="post">
            请输入信息:<input type="text" name="msg">
            <input type="submit" value="发送">
        </form>
    </body>
</html>

第2关:JSP 通信控制对象

任务描述
本关任务:编写一个计算新注册用户人数的小程序。

相关知识
为了完成本关任务,你需要掌握:

了解 JSP 隐式对象中的通信控制对象;
掌握 pageContext 、session 、application 的用法。
通信控制对象
对象    描述
pageContext    PageContext 类的实例,提供对JSP页面所有对象以及命名空间的访问
session    HttpSession类的实例
application    ServletContext类的实例,与应用上下文有关
pageContext 对象
pageContext 对象是 javax.servlet.jsp.PageContext 类实例,也是一个域对象,域范围在当前 JSP 页面范围内,它提供了对 JSP 页面内所有的对象及名字空间的访问。

我们可以通过这个对象来访问 page(作用域范围:当前页面)、request(作用域范围:当前请求)、session(作用域范围:当前会话) 和 application(作用域范围:当前 Web 应用) 作用域下的变量(这几个作用域我们会在本实训的最后一关为大家详细介绍)。

pageContext 对象获取其他内置对象的方法:

方法    返回类型    描述
getAttribute(String name,int scope)    Object    获取属性名称为:name 作用域为:scope 的值
getAttribute(String name)    Enumeration    获取属性名称为:name 的属性范围
getAttribute(int scope)    Enumeration    获取所有作用域为:scope 的属性名称
removeAttribute(String name,int scope)    void    移除取属性名称为:name 作用域为:scope 的属性对象
removeAttribute(String name)    void    获取属性名称为:name 的属性对象
setAttribute(String name,Object value,int scope)    void    设定属性对象的名称为:name 属性对象的值为:value 作用域为:scope 的属性对象
findAttribute(String name)    Object    在所有范围中寻找属性名称为:name 的属性对象
scope 作用域范围:

名称    作用域范围    int 值
PAGE_SCOPE    page 作用域    1
REQUEST_SCOPE    request 作用域    2
SESSION_SCOPE    session 作用域    3
APPLICATION_SCOPE    application 作用域    4
案例演示:

<%@ page import="static javax.servlet.jsp.PageContext.PAGE_SCOPE" %>
<%@ page import="static javax.servlet.jsp.PageContext.REQUEST_SCOPE" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页面</title>
</head>
<body>
<%
    //设定一个name名称为:msg,值为:Hello world!,作用域为:PAGE_SCOPE的对象
    pageContext.setAttribute("msg","Hello world!",PAGE_SCOPE);
    //获取name名称为:msg的对象
    String msg = (String)pageContext.getAttribute("msg",PAGE_SCOPE);
    //查找name属性名称为msg的属性对象值
    //在所有范围内查找数据,依次为 page、request、session、application。如果在前一个范围内查找到数据,那么就返回,而不会再到下一个范围中去查找!
    String value=(String)pageContext.findAttribute("msg");
%>
<h1>msg:<%=msg%></h1>
<h1>find:<%=value%></h1>
</body>
</html>

第3关:JSP Servlet 对象

任务描述

本关任务:使用 config 对象获取JSP 页面编译后的 Servlet 的名称。
相关知识

为了完成本关任务,你需要掌握:

    了解 JSP 隐式对象中的 Servlet 对象;

    掌握 page、config 的用法。

Servlet 对象
对象     描述
config     ServletConfig 类的实例
page     类似于 Java 类中的 this 关键字
page 对象

page 这个对象就是页面实例的引用。它可以被看做是整个 JSP 页面的代表。
page 对象就是 this 对象的同义词。

常用方法:

    class getClass() 获取此 Object 类;

    int hashCode() 获取Object的hash码;

    boolean equals(Object obj) 判断两个对象是否相等;

    String toString() 把Object对象转换为String对象;

    void notify() 唤醒一个指定的线程;

    void wait() 使一个线程等待,直到被唤醒。

例子:

    <h1>page内置对象</h1>
    当前page页面对象的字符串描述:<%=page.toString() %><br>

打开浏览器,效果图如下:


config 对象

 config 对象代表当前 JSP 配置信息,但 JSP 页面通常无须配置,因此也就不存在配置信息。该对象在 JSP 页面中非常少用,但在 Servlet 则用处相对较大。
方法     返回类型     描述
getInitParameter(String name)     String     返回名称为 name 的初始参数的值
config.getInitParameterNames()     Enumeration     返回当前 JSP 所有初始化参数的名称集合
getServletContext()     ServletContext     返回 ServeltContext 对象
getServletName()     String     返回 JSP 页面编译后的 Servlet 的名称

案例演示:

    返回 ServeltContext 对象
    <%=config.getServletContext()%>

效果如下:


编程要求

根据提示,在右侧编辑器 Begin-End 处补充代码,使用 config 对象获取JSP 页面编译后的 Servlet 的名称,将获取到的值展示在指定的位置。
测试说明

平台会访问你的localhost:8080/jsp3/index.jsp/,模拟 post 请求发送数据,获取相关输出信息将其输出,若输出结果与预期输出一致,则算通关。

预期输出:

    Tomcat 启动成功
    访问 localhost:8080/jsp3/index.jsp/,结果如下:
    servlet 编译后的名称为:jsp

第4关:JSP 异常对象

任务描述

本关任务:正确配置 exception对象,使得如果 request.jsp 出现异常,则将其转入 error.jsp,获取其错误信息。
相关知识

为了完成本关任务,你需要掌握:

    了解 JSP 隐式对象中的异常对象;

    掌握 exception 的用法。

异常对象
对象     描述
exception     ServletConfig 类的实例
exception 对象

exception 对象包装了从先前页面中抛出的异常信息。它通常被用来产生对出错条件的适当响应。只有在 page 指令中设置 isErrorPage="true" 的页面中才能使用。

如果在 JSP 页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在 page 指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

exception 对象常用方法:

    String getMessage():返回描述异常的消息;

    String toString():返回关于异常的简短描述消息;

    void printStackTrace():显示异常及其栈轨迹;

    Throwable FillInStackTrace():重写异常的执行栈轨迹。

exception 使用配置

error.jsp

    首先在 index.jsp 的 page 指令中增加 errorPage 属性。

如果我们指定了 errorPage 属性的值为 error.jsp,那么在访问出现错误时,就会转发到 error.jsp。

index.jsp

    <%@page import="java.net.URLDecoder"%>  
    <%@ page language="java" import="java.util.*"  
        contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"  
        errorPage="error.jsp"%>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <%
            float price = Float.parseFloat("异常");
        %>
    </body>
    </html>

    在 error.jsp 中设置 page 指令中的 isErrorPage 属性。

如果想要了解异常的信息和对其进行处理,那么就要在 error.jsp 中设置 page 指令中的 isErrorPage="true",就可以调用 exception 隐式对象。如果没有将 isErrorPage 属性设置为 true 的话,exception 隐式对象是不可以调用的。

error.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8" isErrorPage="true"%>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>错误页面</title>
    </head>
    <body>
    异常类型:<%=exception.getClass()%><br>
    异常信息:<%=exception.getMessage()%><br>
    异常简短描述信息:<%=exception.toString()%><br>
    </body>
    </html>

效果如下:


编程要求

根据提示,在右侧编辑器 Begin-End 处补充代码,在 request.jsp 页面引入错误页面 error.jsp,补充 error.jsp 页面代码,获取异常类型和异常信息,将这些信息放到指定位置进行展示。
测试说明

平台会访问你的 localhost:8080/jsp4/request.jsp/页面,判断异常输出是否正确,若判断结果与预期输出一致,则算通关。

预期输出:

    Tomcat 启动成功
    访问 localhost:8080/jsp4/request.jsp/,结果如下:
    异常类型获取成功
    异常信息获取成功

第5关:JSP 四大作用域

任务描述

本关任务:学会四大作用域的使用,为这些作用域设置变量。
相关知识

为了完成本关任务,你需要掌握:

    什么作用域;

    JSP 四大作用域及其用法;

    JSP 九大内置对象的作用域。

作用域范围

什么是作用域呢,相信大家都比较熟悉,通俗地讲,就好比假如你在 IT 圈一手遮天,不可或缺,谁都离不了你,然而出了这个圈子,你就啥也不是了,这时候,IT 圈就是你的一个作用域范围了,出了圈子你就不起作用了。像我们平常编码的时候定义的变量,有全局变量,局部变量,静态变量等等,都有它的作用域范围。

我们以往在定义一个变量的时候,都会考虑到它的作用域范围,然后根据我们的实际情况,定义一个最符合要求的。而在 JSP 开发中,它又是怎么的呢,接下来我们将为大家详细介绍 JSP 的四大作用域。
四大作用域

JSP 中的四大作用域,主要是指以下四个:

    page 作用域 - 当前页面;

    request 作用域 - 当前请求;

    session 作用域 - 当前会话;

    application 作用域 - 当前 Web 应用。

page 作用域

它是 JSP 默认的作用域,这个作用域中的对象只能在该页面中使用,出了这个页面就没有效果了。该范围内的对象,在客户端每次请求 JSP 页面时创建,在页面向客户端发送响应或请求被转发(forward)到其他的资源后被删除。

案例演示:

当 page 作用域中的对象在本页面时:

index.jsp:

    <%
    pageContext.setAttribute("name","哈哈哈哈");  //设置属性
    %>
    <%
    //取得设置的属性
    String name = (String)pageContext.getAttribute("name");
    %>
    <h1>姓名:<%=name%></h1>

效果如下:


当 page 作用域中的对象在另一个页面时:

index1.jsp:

    <%
    //取得设置的属性
    String name = (String)pageContext.getAttribute("name");
    %>
    <h1>姓名:<%=name%></h1>

效果如下:


我们从图中可以看出该对象在离开本页面后失效了。
request 作用域

request 在一次请求的全过程中有效,即从客户端请求到服务器处理结束,返回响应的整个过程,存放在 HttpServletRequest 对象中。一次请求的生命周期从客户端发起到服务器接收并响应该请求,或者将该请求 forward 到另一个页面或者 Servlet 进行处理而结束。在此期间,本次请求的参数,属性都是有效的;一旦客户端刷新浏览器,重新发起请求,则之前的请求参数和属性都将失效。

案例演示:

request作用域内:

    <%
    //解决乱码问题,将编码格式设置为 utf-8
    request.setCharacterEncoding("utf-8");
    //取出发送的信息值
    String msg=request.getParameter("msg");
    //保存变量到request作用域
    request.setAttribute("msg",msg);
    //跳转操作 将跳转到 index.jsp 页面;
    request.getRequestDispatcher("index.jsp").forward(request,response);
     %>

效果如下:

从上图中我们可以看出哪怕是跳转了页面,只要是同一请求中,request 作用域内的属性依然有效。

request 作用域外:

    刷新浏览器当前页面;

    将转发操作变为重定向操作。

    <%
    //解决乱码问题,将编码格式设置为 utf-8
    request.setCharacterEncoding("utf-8");
    //取出发送的信息值
    String msg=request.getParameter("msg");
    //保存变量到request作用域
    request.setAttribute("msg",msg);
    //跳转操作 将跳转到 index.jsp 页面;
    response.sendRedirect("index.jsp");
     %>

效果如下:


从上图中我们我们可以看出客户端刷新浏览器,重新发起请求,则之前的请求参数和属性都将失效。
session 作用域

当我们向服务器发送第一个请求开始,只要页面不关闭,或者会话未过期(默认 30 分钟),或者未调用 HttpSession 的 invalidate() 方法,接下来的操作都属于同一次会话的范畴。在 JSP 中,每当向服务器发送一个请求,服务器响应这个请求的时候,会在客户端的 Cookie 中写一个 session id 值。每次发送请求的时候,会将该 session id 值一起发送到服务器端,服务器端根据该 session id 值来判断每次请求是否属于同一个 session 的范畴之内。其存放在 HttpSession 对象中。

案例演示:

session 作用域内:

    <%
    //解决乱码问题,将编码格式设置为 utf-8
    request.setCharacterEncoding("utf-8");
    //取出发送的信息值
    String msg=request.getParameter("msg");
    //保存变量到 session 作用域
    session.setAttribute("msg",msg);
    //跳转操作 将跳转到 index.jsp 页面;
    response.sendRedirect("index.jsp");
     %>

效果如下:

从上图中,我们可以看出哪怕不在同一请求中,session 作用域内的对象依然有效。

session 作用域外:

    清空 session;

    重新打开浏览器;

    session 失效。

效果如下:


从图中,我们可以看出,不在同一会话后,session 的作用域内的对象也会失效。
application 作用域

application 的作用域是最广的,它代表着整个 Web 应用的全局变量,对每一个页面,每一个 Servlet 都是有效的。当我们在 application 中设置属性时,这个属性在任意的一个页面都是可以访问的。在 application 作用域中设置的属性如果不手动调用 removeAttribute 函数进行删除的话,它们就一直可以使用,如果 Web 容器发生重启,此时 application 范围内的所有属性都将丢失。
JSP 九大内置对象的作用域范围
内置对象名称     作用域范围
pageContext     page
request     request
response     page
session     session
application     application
config     page
exception     page
out     page
page     page
编程要求

根据提示,在右侧编辑器 Begin-End 处补充代码,完成如下要求:

    在 request 作用域内定义一个变量 srequest,值为:我是request作用域;

    在 session 作用域内定义一个变量 ssession,值为:我是session作用域;

    在 application 作用域内定义一个变量 sapplication,值为:我是application作用域。

测试说明

平台会访问你的 localhost:8080/jsp5/a.jsp/页面,通过转发、重定向、清除 session 等操作判断变量设置是否成功,若判断结果与预期输出一致,则算通关。

预期输出:

    Tomcat 启动成功
    访问 localhost:8080/jsp5/a.jsp/,结果如下:
    request作用域设置成功
    session作用域设置成功,application作用域设置成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值