加载头像

第四章 JSP 内置对象

有些对象不用声明就可以在 JSP 页面的 Java 程序片和表达式部分使用,这就是 JSP 的内置对象。

JSP 的常用内置对象有 requestresponsesessionapplicationout

4.1 request 对象

HTTP 通信协议是用户与服务器之间一种提交(请求)信息与响应信息(request/response)的通信协议。在 JSP 中,内置对象 request 封装了用户提交的信息,那么该对象调用相应的方法可以获取封装的信息,即使用该对象可以获取用户提交的信息。

内置对象 request 是实现了 ServletRequest 接口类的一个实例,可以在 Tomcat 服务器的 webapps \tomcat-docs\servletapi 中查找 ServletRequest 接口的方法。

用户通常使用 HTML 的 form 表单(也称 form 标记)请求访问服务器的某个 JSP 页面(或 servlet),并提交必要信息给所请求的 JSP 页面(servlet)。表单的一般格式是:

1
2
3
<form action="请求访问的页面或 Servlet" method="get"/"post">
提交手段
</form>

其中,<form> 是 form 表单的开始标签、</form> 是结束标签,开始标签和结束标签之间是 form 表单的标记体的内容。action 是 form 表单的属性,其属性值给出表单请求访问的 JSP 页面或 servlet。form 表单中的 method 属性取值 get 或 post。

get 方法和 post 方法的主要区别是:使用 get 方法提交的信息会在提交的过程中显示在浏览器的地址栏中,而 post 方法提交的信息不会显示在地址栏中。

提交手段包括文本框、列表、文本区等,例如:

1
2
3
4
<form action="tom.jsp" method="post">
<input type="text" name="boy" value="ok"/>
<input type="submit" name="submit" value="提交"/>
</form>

该 form 表单使用 post 方法向请求访问的 tom.jsp 页面提交信息,提交信息的手段是 text(文本框),文本框的名字由 name 属性的值指定(例如,名字是 boy)。在文本框输入信息(其中默认信息是 ok),然后单击 submit 提交键向服务器的 JSP 页面 tom.jsp 提交信息。

form 表单请求访问的 JSP 页面可以让内置 request 对象调用 getParameter(String s) 方法,并让 s 取值是 input 标记中 name 给出的文本框 text 的名字(比如 boy),获取该表单通过文本框 text 提交的文本信息(即用户在 GUI 控件文本框中输入的文本,默认值是 ok),比如:

1
request.getParameter("boy");

常用方法

request 对象常用方法如下:

方法 说明
String getParameter(String name) 获取请求参数 name 的值
Enumeration getParameterNames() 获取所有参数名称
String[] getParameterValues(String name) 获取请求参数 name 的所有值
Object getAttribute(String name) 获取 name 属性的值
Enumeration getAttributeNames() 返回所有属性的名称集合
void setAttribute(String key, Object value) 给 key 对象赋 value 值
void removeAttribute(String name) 删除指定的 name 属性
cookie[] getCookies() 获取所有的 cookie 对象
HttpSession getSession() 返回 request 对应的 session 对象,如果没有则创建一个 session 对象
HttpSession getSession(boolean create) 返回 request 对应的 session 对象,如果没有,且 create 值为 true,则创建一个 session 对象
Enumeration getHeaderNames() 返回 HTTP 头信息的名称集合
String getHeader(String name) 获取 name 指定的 HTTP 头信息
String getMethod() 获取 HTTP 请求方法/客户提交信息方式

避免乱码

当 request 对象处理汉字信息时,需要进行特殊处理,防止出现乱码现象。

JSP 页面文件的编码为 UTF-8 编码,只要让 request 对象在获取信息之前调用 setCharacterEncoding() 方法设置编码为 UTF-8(默认是 ISO-8859-1)就可以避免乱码现象:

1
request.setCharacterEncoding("utf-8");

4.2 response 对象

当用户访问一个服务器的页面时,会提交一个 HTTP 请求,服务器收到请求时,返回 HTTP 响应。响应和请求类似,也有某种结构,每个响应都由状态行开始,可以包含几个头及可能的信息体(网页的结果输出部分)。

request 对象获取用户请求提交的信息,与 request 对象相对应的对象是 response 对象。可以用 response 对象对用户的请求作出动态响应,向用户端发送数据。比如,当一个用户请求访问一个 JSP 页面时,该页面用 page 指令设置页面的 contentType 属性的值是 text/html,那么 Tomcat 服务器将按照这种属性值响应用户对页面的请求,将页面的静态部分返回给用户,用户浏览器接收到该响应就会使用 HTML 解释器解释执行所收到的信息。

常用方法

response 对象的常用方法如下:

方法 说明
void addHeader(String name, String value) 添加头信息(参数名称和对应值)
void addCookie(Cookie cookie) 添加 cookie 信息
void sendRedirect(String location) 实现页面重定向
void setStatus(int sc) 实现页面的响应状态代码
void setContentType(String type) 设置页面的 MIME 类型和字符集
void setCharacterEncoding(String charset) 设定页面响应的编码类型

动态响应 contentType 属性

页面用 page 指令设置页面的 contentType 属性的值,那么 Tomcat 服务器将按照这种属性值作出响应,将页面的静态部分返回给用户,用户浏览器接收到该响应就会使用相应的手段处理所收到的信息。由于 page 指令只能为 contentType 指定一个值来决定响应的 MIME 类型,如果想动态地改变这个属性的值来响应用户,就需要使用 response 对象的 setContentType(String s) 方法来改变 contentType 的属性值。

response 对象的重定向

在某些情况下,当响应用户时,需要将用户重新引导至另一个页面。例如,如果用户输入的 form 表单信息不完整,就会再被引导到该 form 表单的输入页面。

此时可以使用 response 对象的 sendRedirect(URL url) 方法实现用户的重定向,即让用户从一个页面跳转到 sendRedirect(URL url) 中 url 指定的页面,即所谓的客户端跳转。需要注意的是当使用 sendRedirect(URL url) 方法将用户从当前页面重定向另一个页面时,Tomcat 服务器还是要把当前 JSP 页面执行完毕后才实施重定向(跳转)操作,但 Tomcat 服务器不再给用户看当前页面的执行效果。如果在执行 sendRedirect(URL url) 方法后,紧接着执行了 return 返回语句,那么 Tomcat 服务器会立刻结束当前 JSP 页面的执行。

4.3 session 对象

HTTP 协议是一种无状态协议。一个用户向服务器发出请求(request),然后服务器返回响应(response),在服务器端不保留用户的有关信息,因此当下一次发出请求时,服务器无法判断这一次请求和以前的请求是否属于同一用户。当一个用户访问一个 Web 服务目录时,可能会在这个服务目录的几个页面反复链接,反复刷新一个页面或不断地向一个页面提交信息等,服务器应当通过某种办法知道这是同一个用户。Tomcat 服务器可以使用内置对象 session(会话)记录用户的信息。内置对象 session 由 Tomcat 服务器负责创建,session 是实现了 HttpSession 接口类的一个实例,可以在 Toamcat 服务器的 webapps\tomcat-docs\servletapi 中查找 HttpSession 接口的方法。

常用方法

session 对象的常用方法如下:

方法 说明
void setAttribute(String name, Object value) 将参数名和参数值存放在 session 对象中
Object getAttribute(String name) 通过 name 返回获取相应的 value 值,如果 name 没有相应的 value 值,则返回 null
void removeAttribute(String name) 删除指定的 name 参数
Enumeration getAttributeNames() 获取 session 对象中存储的所有参数
long getCreationTime() 返回 session 对象创建的时间
String getId() 获取 session 对象的 ID 值
boolean isNew() 用于检查 session 对象是不是新对象,如果客户端禁用了 cookie ,则 session.isNew() 始终返回 true
void invalidate() 终止 session,即指定 session 对象失效
void setMaxInactiveInterval() 设置 session 对象的有效时间,单位:秒
int getMaxInactiveInterval() 获取 session 对象的有效时间,单位:秒
long getLastAccessedTime() 获取上次访问 session 对象的时间

session 对象的 id

当一个用户首次访问 Web 服务目录中的一个 JSP 页面时,Tomcat 服务器产生一个 session 对象,这个 session 对象调用相应的方法可以存储用户在访问该 Web 服务目录中各个页面期间提交的各种信息,比如姓名、号码等信息。这个 session 对象被分配了一个 String 类型的 id 号,Tomcat 服务器同时将这个 id 号发送到用户端,存放在用户(浏览器)的 Cookie 中。这样,session 对象和用户之间就建立起一一对应的关系,即每个用户都对应着一个 session 对象(称作用户的会话),不同用户(不同浏览器)的 session 对象互不相同,具有不同的 id 号码。当用户再访问该 Web 服务目录的其他页面时,或从该 Web 服务目录链接到其他 Web 服务器再回到该 Web 服务目录时, Tomcat 服务器不再分配给用户的新 session 对象,而是使用完全相同的一个,直到 session 对象达到了最大生存时间或用户关闭自己的浏览器或 Tomcat 服务器关闭,Tomcat 服务器将销毁用户的 session 对象,即和用户的会话对应关系消失。如果用户的 session 对象被销毁,当用户再请求访问该 Web 服务目录时,Tomcat 服务器将为该用户创建一个新的 session 对象。

简单地说,用户(浏览器)在访问一个 Web 服务目录期间,服务器为该用户分配一个 session 对象(称作和该用户的会话),服务器可以在各个页面使用这个 session 对象记录当前用户的有关信息。而且服务器保证不同用户的 session 对象互不相同。

同一个用户在不同的 Web 服务目录中的 session 对象是互不相同的。

session 对象与 URL 重写

session 对象能和用户建立起一一对应关系依赖于用户浏览器是否支持 Cookie。如果用户端浏览器不支持 Cookie,那么用户在不同网页之间的 session 对象可能是互不相同的,因为 Tomcat 服务器无法将 id 存放到用户端浏览器中,就不能建立 session 对象和用户的一一对应关系。

如果用户不支持 Cookie, JSP 页面可以通过 URL 重写来实现 session 对象的唯一性。所谓 URL 重写,就是当用户从一个页面重新链接到一个页面时,通过向这个新的 URL 添加参数,把 session 对象的 id 传带过去,这样就可以保障用户在该 Web 服务目录的各个页面中的 session 对象是完全相同的。可以让 response 对象调用 encodeURL()encodeRedirectURL() 方法实现 URL 重写。

session 对象存储数据

session 对象驻留在服务器端,该对象调用某些方法保存用户在访问某个 Web 服务目录期间的有关数据。

session 对象使用下列方法处理数据:

  1. public void setAttribute(String key, Object obj)。session 对象可以调用该方法将参数 Object 指定的对象 obj 添加到 session 对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加的对象被清除。
  2. public Object getAttribute(String key)。获取 session 对象索引关键字是 key 的对象。由于任何对象都可以添加到 session 对象中,因此用该方法取回对象时,应显式转化为原来的类型。
  3. public Enumeration getAttributeNames()。session 对象调用该方法产生一个枚举对象,该枚举对象使用 nextElemets() 遍历 session 中的各个对象所对应的关键字。
  1. public void removeAttribute(String key)。session 对象调用该方法移掉关键字 key 对应的对象。

session 对象的生存期限

一个用户在某个 Web 服务目录的 session 对象的生存期限依赖于 session 对象是否调用 invalidate() 方法使得 session 无效或 session 对象达到了设置的最长的“发呆”状态时间以及用户是否关闭浏览器或服务器被关闭。所谓“发呆”状态时间是指用户对某个 Web 服务目录发出的两次请求之间的间隔时间(默认的发呆时间是 30 分钟)。比如,用户对某个 Web 服务目录下的 JSP 页面发出请求,并得到响应,如果用户不再对该 Web 服务目录发出请求(可能去请求其他的 Web 服务目录),那么用户对该 Web 服务目录进入“发呆”状态,直到用户再次请求该 Web 服务目录时,“发呆”状态结束。

可以修改 Tomcat 服务器下的 web.xml,重新设置各个 Web 服务目录下的 session 对象的最长“发呆”时间。打开 Tomcat 安装目录中 conf 文件下的配置文件 web.xml,找到

1
2
3
<session-config >
<session-timeout>30</session-timeout>
</session-config>

将其中的 30 修改成所要求的值即可(单位为分钟)。

4.4 application 对象

application 对象是 javax.servlet.ServletContext 的实例对象。在服务器部署应用和项目时,Web 容器仅创建一次 ServletContext 实例,也就是说 application 设置的任何属性和值可以用于整个应用(所有 JSP 页面)。可以将 application 对象看作 Web 应用的全局变量。一般用于保存应用程序的公用数据。

application 对象在 Web 应用运行时一直存在于服务器中,非常占用资源,因此在实际开发中不推荐使用,否则容易造成内存不足等情况。

常用方法

application 对象常用方法如下:

方法 说明
Object getAttribute(String attributeName) 获取 attributeName(属性名称)对应的 object
void setAttribute(String attributeName, Object object) 设置 attributeName 对应的属性值
Enumeration getAttributeNames() 返回 application 对象中所有的 attributeName
void removeAttribute(String objectName) 删除 application 对象中指定 attributeName 的属性
String getServerInfo() 获取当前 Servlet 的版本信息
String getRealPath(String value) 获取指定文件的实际路径

4.5 out 对象

out 对象是 javax.servlet.jsp.JspWriter 的实例对象。out 对象包含了很多 IO 流中的方法和特性,最常用的就是输出内容到 HTML 中。

常用方法

out 对象的常用方法如下:

方法 说明
void print() 将内容直接打印在 HTML 标签中
void println() 类似于 print,唯一区别是 println 方法添加了换行符
void newLine() 输出换行字符
void clear() 清除页面缓冲区
boolean isAutoFlush() 检查页面是否自动清除缓冲区

习题 4

  1. 假设 JSP 使用的表单中有如下的 GUI (多选择框):

    1
    2
    3
    4
    <input type="checkbox" name="item" value="bird">鸟
    <input type="checkbox" name="item" value="apple">苹果
    <input type="checkbox" name="item" value="cat">猫
    <input type="checkbox" name="item" value="moon">月亮

    该表单所请求的 JSP 可以使用 request 对象获取该表单提交的数据,那么,下列哪些是 request 对象获取该表单提交的值的正确语句:

    A. String a = request.getParameter(item);

    B. String b = request.getParameter(checkbox);

    C. String c []= request.getParameterValues(item);

    D. String d []= request.getParameterValues(checkbox);

  2. 如果表单提交的信息中有汉字,接收该信息的页面应做怎样的处理?

    答:当 request 对象处理汉字信息时,需要进行特殊处理,防止出现乱码现象。

    JSP 页面文件的编码为 UTF-8 编码,只要让 request 对象在获取信息之前调用 setCharacterEncoding() 方法设置编码为 UTF-8(默认是 ISO-8859-1)就可以避免乱码现象:

    1
    request.setCharacterEncoding("utf-8");
  3. 编写两个 JSP 页面 inputString.jspcomputer.jsp,用户可以使用 inputString.jsp 提供的表单输入一个字符串,并提交给 computer.jsp 页面,该页面通过内置对象获取 inputString.jsp 页面提交的字符串,计算并显示该字符串的长度。

    答:代码如下:

    inputString.jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <%@ page contentType="text/html" %>
    <%@ page pageEncoding="utf-8" %>
    <html>
    <body>
    <form action="computer.jsp" method=post name=form>
    <input type="text" name="string" value=""/><br>
    <input type="submit" name="submit" value="提交"/>
    <input type="reset" value="重置"/>
    </form>
    </body>
    </html>

    computer.jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <%@ page contentType="text/html" %>
    <%@ page pageEncoding="utf-8" %>
    <html>
    <body>
    <%
    String string = request.getParameter("string");
    out.println("您输入的字符串为:" + string);
    out.println("字符串的长度为:" + string.length());
    %>
    <br><a href="inputString.jsp">返回</a>
    </body>
    </html>

    运行截图:

    4-1 计算字符串长度

  4. response 对象调用 sendRedirect(URL url) 方法的作用是什么?

    答:使用 response 对象的 sendRedirect(URL url) 方法实现用户的重定向,即让用户从一个页面跳转到 sendRedirect(URL url) 中 url 指定的页面,即所谓的客户端跳转。

  5. 一个用户在不同 Web 服务目录中的 session 对象相同吗?

    答:不相同。

  6. 一个用户在同一 Web 服务目录的不同子目录中的 session 对象相同吗?

    答:相同。

  7. 编写一个 JSP 页面 selectMusic.jsp,该页面使用 select(下拉列表)提供一些歌曲名,用户选择一个一个歌曲名,单击提交键提交给当前页面,然后当前页面播放用户选择的音乐(音频文件保存的 Web 服务目录的 \music 子目录中)。

    答:代码如下:

    selectMusic.jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <%@ page contentType="text/html" %>
    <%@ page pageEncoding="utf-8" %>
    <html>
    <body>
    <form action="selectMusic.jsp" method="post">
    <select name="music" id="music">
    <option value="错位时空">错位时空</option>
    <option value="海底">海底</option>
    <option value="姑娘在远方">姑娘在远方</option>
    </select>
    <br><input type="submit" name="submit" value="播放">
    </form>
    <%
    request.setCharacterEncoding("utf-8");
    String music = request.getParameter("music");
    try {
    if (music.equals("错位时空")) {
    System.out.println("!!!!A");
    // 用户选择要播放 错位时空
    out.println("<audio src='music/错位时空.mp3' autoplay='autoplay'></audio>");
    } else if (music.equals("海底")) {
    // 用户选择要播放 海底
    out.println("<audio src='music/海底.mp3' autoplay='autoplay'></audio>");
    } else if (music.equals("姑娘在远方")) {
    // 用户选择要播放 姑娘在远方
    out.println("<audio src='music/姑娘在远方.mp3' autoplay='autoplay'></audio>");
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    %>
    </body>
    </html>

    运行截图:

    4-2 播放音乐


返回目录 上一章 下一章
博客快捷键
shift K
关闭快捷键功能
shift A
打开/关闭中控台
shift M
播放/暂停音乐
shift D
深色/浅色显示模式
shift S
站内搜索
shift R
随机访问
shift H
返回首页
shift L
友链页面
shift P
关于本站
shift I
原版/本站右键菜单
引用到评论
随便逛逛博客分类文章标签
复制地址关闭热评深色模式轉為繁體