欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

探究JSP中的9大内置对象

最编程 2024-08-11 10:06:36
...

JSP有九个内置对象(又叫隐含对象),不需要预先声明就可以在脚本代码和表达式中随意使用,即不需要实例化,直接使用其方法即可。

  • page
  • ppagecontent
  • out
  • config
  • exception
  • request
  • reponse
  • session
  • application

作用域:

前五种都是作用于页面,request是一次请求(客户端向服务器),response是一次响应(服务器向客户端),session是一次会话(一次请求,一次响应),application是全局范围,只要app存在就有作用。

1 JSP九大内置对象分为四类:

输入输出对象:out对象、response对象、request对象
通信控制对象:pageContext对象、session对象、application对象
Servlet对象:page对象、config对象
错误处理对象:exception对象

2.九种对象简介:


out对象:用于向客户端、浏览器输出数据。out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。


request对象:封装了来自客户端、浏览器的各种信息。request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。


response对象:封装了服务器的响应信息。response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。


exception对象:封装了jsp程序执行过程中发生的异常和错误信息。exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。


config对象:封装了应用程序的配置信息。config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数

page对象:指向了当前jsp程序本身。page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。


session对象:用来保存会话信息。也就是说,可以实现在同一用户的不同请求之间共享数据。session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。


application对象:代表了当前应用程序的上下文。可以在不同的用户之间共享信息。application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。


pageContext对象:提供了对jsp页面所有对象以及命名空间的访问。pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

3 常用方法

3.1request

模拟获取用户信息:

<%--
  Created by IntelliJ IDEA.
  User: 86187
  Date: 2022/8/4
  Time: 19:18
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
          integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    <script src="http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script>
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
            integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous">
    </script>
    <style>
        .top img {
            width: 300px;
            height: 100px;
            vertical-align: -20px;
        }
        form{
            margin-left: 50px;
            margin-top: 30px;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-3 top">
            <img src="img/1.jpg" />
        </div>
        <div class="col-md-7" style="background-color: lightcyan;margin-top: 60px;">
            <span>用户注册</span>
        </div>
        <div class="col-md-2 text-right" style="background-color: lightcyan;margin-top: 60px;">
            <a href="#">帮助</a>
        </div>
    </div>
    <form action="5.jsp" method="POST">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username" />只能输入字母或数字,4-16个字符</td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="password" />密码长度6-12位</td>
            </tr>
            <tr>
                <td>确认密码:</td>
                <td><input type="password" name="password" /></td>
            </tr>
            <tr>
                <td>性别:</td>
                <td><input type="radio" name="sex" value="男" checked/>男
                    <input type="radio" name="sex" value="女"/>女
                </td>
            </tr>
            <tr>
                <td>电子邮件地址:</td>
                <td><input type="email" name="email" /></td>
            </tr>
            <tr>
                <td>出生日期:</td>
                <td>
                    <input type="text" name="year" style="width: 50px;" />年
                    <select name="month">
                        <option value="12">12月</option>
                        <option value="11">11月</option>
                        <option value="10">10月</option>
                        <option value="9">9月</option>
                        <option value="8">8月</option>
                        <option value="7">7月</option>
                        <option value="6">6月</option>
                        <option value="5">5月</option>
                        <option value="4">4月</option>
                        <option value="3">3月</option>
                        <option value="2">2月</option>
                        <option value="1">1月</option>
                    </select>月
                    <select name="day">
                        <option value="31">31</option>
                        <option value="30">30</option>
                        <option value="29">29</option>
                        <option value="28">28</option>
                        <option value="27">27</option>
                        <option value="26">26</option>
                        <option value="25">25</option>
                        <option value="24">24</option>
                        <option value="23">23</option>
                        <option value="22">22</option>
                        <option value="21">21</option>
                        <option value="20">20</option>
                        <option value="19">19</option>
                        <option value="18">18</option>
                        <option value="17">17</option>
                        <option value="16">16</option>
                        <option value="15">15</option>
                        <option value="14">14</option>
                        <option value="13">13</option>
                        <option value="12">12</option>
                        <option value="11">11</option>
                        <option value="10">10</option>
                        <option value="9">9</option>
                        <option value="8">8</option>
                        <option value="7">7</option>
                        <option value="6">6</option>
                        <option value="5">5</option>
                        <option value="4">4</option>
                        <option value="3">3</option>
                        <option value="2">2</option>
                        <option value="1">1</option>
                    </select>日<br />
                </td>
            </tr>
        </table>
        <input type="submit" name="sub" value="同意一下协议条款并提交" /><br />
        <textarea name="text">

		</textarea>
        <input type="submit" value="提交">
    </form>
</div>
</body>
</html>

 5.jsp

<%--
  Created by IntelliJ IDEA.
  User: 86187
  Date: 2022/8/4
  Time: 19:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    request.setCharacterEncoding("UTF-8");
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String sexs[] = request.getParameterValues("sex");
    String email = request.getParameter("email");
    String year = request.getParameter("year");
    String months[] = request.getParameterValues("month");
    String days[] = request.getParameterValues("day");
%>
<p>用户名:<%=username%></p>
<p>密码:<%=password%></p>
<%
    for (String sex:sexs){
%>
<p>性别:<%=sex%></p>
<%
    }
%>
<p>邮箱:<%=email%></p>
<p>出生日期:<%=year+"-"+months[0]+"-"+days[0]%></p>
</body>
</html>

4.处理乱码问题

方法一:

  request.setCharacterEncoding("UTF-8");

方法二:

  request.setCharacterEncoding("UTF-8");
  response.setCharacterEncoding("UTF-8");

方法三:

    //获取到用户名
    String username = request.getParameter("username");
    username = new String(username.getBytes(),"UTF-8");

3.2 转发与重定向

转发的定义:在多个页面交互过程中实现请求数据的共享

转发的实现:RequestDispatcher对象.forword()方法

do-login.jsp

<%@ page import="sun.util.resources.cldr.rof.CalendarData_rof_TZ" %><%--
  Created by IntelliJ IDEA.
  User: 86187
  Date: 2022/8/5
  Time: 13:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
          integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    <script src="http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script>
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
            integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous">
    </script>
</head>
<body>
<%
  //获取用户名,密码
  String username = request.getParameter("username");
  String password = request.getParameter("password");
  //判断是否为空
    if ((username != null && password !=null) && !("".equals(username.trim()) && "".equals(password.trim()))) {

        session.setAttribute("user", username);
        request.setAttribute("username", username);
        RequestDispatcher rd = request.getRequestDispatcher("success.jsp");
        rd.forward(request, response);

    }
        //判断用户名是否是lucky,密码是否是123456
       /* if ("lucky".equals(username) && "123456".equals(password)){
            session.setAttribute("user",username);
            request.setAttribute("username",username);
            RequestDispatcher rd = request.getRequestDispatcher("success.jsp");
            rd.forward(request,response);
        }else{*/
            %>
<script type="javascript">
    alert("登陆失败,请重新登录");
</script>
<%/*
            RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
            rd.forward(request,response);
        }
    }*/
%>
</body>
</html>

 success.jsp

<%--
  Created by IntelliJ IDEA.
  User: 86187
  Date: 2022/8/5
  Time: 13:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
你好:<%=request.getAttribute("username")%>
<%=session.getAttribute("user")%>
<a href="session.jsp">失效</a>
</body>
</html>

failure.jsp

<%--
  Created by IntelliJ IDEA.
  User: 86187
  Date: 2022/8/5
  Time: 14:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%=request.getAttribute("username")%>
<%=session.getAttribute("user")%>
</body>
</html>

重定向:response对象

 转发与重定向的区别(重点)

转发:

  1. 请求跳转速度由于是在站内跳转,所以速度快。
  2. 一次请求
  3. 转发地址栏路径不变,内部资源完成一个跳转过程。
  4. 可以访问WEB-INF下的资源,只能访问服务器内部的资源,即web文件下的jsp。
  5. 转发可以使用request对象来共享数据。

重定向:

  1. 地址栏路径发生变化。
  2. 可以访问其他站点的资源。
  3. 二次请求,由浏览器发起两次请求,第一次是请求的目标,第二次会有浏览器跳转到目标页面,该过程是一个重定向的过程。
  4. 由于两次跳转,所以速度慢。

4.session会话

会话:一个会话就是浏览器与服务器之间的一次对话。

一个session对应一个浏览器,每打开一个不同的浏览器会设一个新的sessionId(如打开谷歌,IE,火狐都会设一个新的ID,而在谷歌打开多个页面ID是一样的)。