JSP 内置对象(上)
JSP 内置对象是 Web 容器创建的一组对象,不使用 new 关键字就可以直接使用的对象。如上一章中使用脚本实现打印九九乘法表中的out对象
<%-- 脚本:out对象是JSPWriter类的实例,用于向客户端输出内容 --%>
<%
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <=i; j++) {
out.print(i + "*" + j + "=" + (i*j) + " ");
}
out.println("</br>");
}
%>
JSP 共有九大内置对象
常用(5个): out, request, response, session, application
不常用(4个): page, pageContext, execption, config

缓冲区(Buffer)
所谓缓冲区就是内存的一块区域用来保存临时数据。下图中,可以把一粒一粒米饭想象成字节,把盛米饭的容器想象成缓冲区

out 对象
out 对象是 JspWriter 类的实例,是向客户端输出内容
常用方法如下:
1、void println() 向客户端打印字符串
2、void clear() 清除缓冲区的内容,如果在 flush 之后调用会抛出异常
3、void clearBuffer() 清除缓冲区的内容,如果在 flush 之后调用不会抛出异常
4、void flush() 将缓冲区内容输出到客户端
5、int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0
6、int getRemaining() 返回缓冲区还剩余多少可用
7、boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常
8、void close() 关闭输出流
<%@ page language="java" 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>Insert title here</title>
</head>
<body>
<%
out.println("<h2>静夜思<h2>");
out.println("床前明月光<br>");
out.println("疑是地上霜<br>");
out.println("举头望明月<br>");
out.println("低头思故乡<br>");
%>
<hr>
获取缓冲区大小:<%=out.getBufferSize() %> size; <br>
获取缓冲区可用大小:<%=out.getRemaining() %> size; <br>
是否自动清空缓冲区:<%=out.isAutoFlush() %>
</body>
</html>
页面输出结果:

下面在静夜思中间加入flush,虽然页面输出不受影响,但是可用剩余缓冲区变大。然后分别试图在其后运行 out.clear() 和 out.clearBuffer()
<%@ page language="java" 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>Insert title here</title>
</head>
<body>
<%
out.println("<h2>静夜思<h2>");
out.println("床前明月光<br>");
out.println("疑是地上霜<br>");
out.flush();
// out.clear(); // Error: Attempt to clear a buffer that's already been flushed
// out.clearBuffer();
out.println("举头望明月<br>");
out.println("低头思故乡<br>");
%>
<hr>
获取缓冲区大小:<%=out.getBufferSize() %> size; <br>
获取缓冲区可用大小:<%=out.getRemaining() %> size; <br>
是否自动清空缓冲区:<%=out.isAutoFlush() %>
</body>
</html>

request 对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。request是HttpServerletRequest类的实例。
request 对象具有请求域,即完成客户端的请求之前,该对象一直有效。常用方法如下:
- String getParameters(String name): 返回name 指定参数的参数值
- String[] getParameterValues(String name): 返回包含参数name 的所有值的数组
- void setAtrribute(String, Object): 存储此请求中的属性
- Object getAttribute(String name): 返回指定属性的属性值
- String getContentType(): 得到请求体的MIME 类型
- String getProtocol(): 返回请求用的协议类型及版本号
- String getServerName(): 返回接受请求的服务器主机名
- int getServerPort(): 返回服务器接受此请求所用的端口号
- String getCharacterEncoding(): 返回字符编码的方式
- void setCharacterEncoding(): 设置请求的字符编码方式
- int getContentLength(): 返回请求体的长度(以字节数)
- String getRemoteAddr(): 返回发送此请求的客户端IP地址
- String getRealPath(String path): 返回一虚拟路径的真实路径
- String request.getContextPath(): 返回上下文路径
创建一个简单用户注册表单: login.jsp
<%@ page language="java" 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>Insert title here</title>
</head>
<body>
<form name="loginForm" action="request.jsp" method="post">
用户名:<input type="text" name="username"><br>
爱好:<input type="checkbox" name="favorite" value="reading">阅读
<input type="checkbox" name="favorite" value="singing">唱歌
<input type="checkbox" name="favorite" value="basketball">篮球
<input type="checkbox" name="favorite" value="swimming">游泳<br>
<input type="submit" value="提交">
</form> </body>
</html>
创建一个处理数据的 request.jsp
<%@ page language="java" 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>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8"); // 解决中文乱码问题
%>
用户名:<%=request.getParameter("username") %><br> 爱好:<%
String[] favorites = request.getParameterValues("favorite");
for (String favorite:favorites) {
out.println(favorite);
}
%> </body>
</html>
页面展示效果如图:

现在查看下通过a链接跳转页面,不走form表单提交的情况,把login.jsp 稍改下
<%@ page language="java" 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>Insert title here</title>
</head>
<body>
<form name="loginForm" action="request.jsp" method="post">
用户名:<input type="text" name="username"><br>
爱好:<input type="checkbox" name="favorite" value="reading">阅读
<input type="checkbox" name="favorite" value="singing">唱歌
<input type="checkbox" name="favorite" value="basketball">篮球
<input type="checkbox" name="favorite" value="swimming">游泳<br>
<input type="submit" value="提交">
</form> <a href="request.jsp?username=Kobe">测试URL传参数</a>
</body>
</html>
由于a链接的带参参数中只测试username,所以favorite为空的情况下会报错的,要对request.jsp 稍作修改
<%@ page language="java" 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>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8"); // 解决中文乱码问题
%>
用户名:<%=request.getParameter("username") %><br>
爱好:<%
if (request.getParameterValues("favorite") != null) {
String[] favorites = request.getParameterValues("favorite");
for (String favorite:favorites) {
out.println(favorite + " ");
}
}
%> </body>
</html>
查看页面运行效果:

但是当 a 链接参数中传参为中文时就会出现乱码

虽然通过request.setCharacterEncoding() 为 utf-8,但是仅限于 request 作用域。要解决 url 中文乱码问题,就要修改tomcat 的server.xml了
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" /> ----> 增加 URIEncoding属性
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8" />
右键删除 eclipse 控制台 server下的服务器,重新启动 Tomcat 服务器后,再次运行:

接下来测试其它的request方法:
<%@ page language="java" 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>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8"); // 解决中文乱码问题
request.setAttribute("password", "123456");
%>
用户名:<%=request.getParameter("username") %><br>
爱好:<%
if (request.getParameterValues("favorite") != null) {
String[] favorites = request.getParameterValues("favorite");
for (String favorite:favorites) {
out.println(favorite + " ");
}
}
%><br>
密码:<%=request.getAttribute("password") %><br>
MIME类型:<%=request.getContentType() %><br>
协议类型及版本号:<%=request.getProtocol() %><br>
服务器主机名:<%=request.getServerName() %><br>
端口号:<%=request.getServerPort() %><br>
字符编码方式:<%=request.getCharacterEncoding() %><br>
请求体长度:<%=request.getContentLength() %>bytes<br>
客户端IP地址:<%=request.getRemoteAddr() %><br>
虚拟路径的真实路径:<%=request.getRealPath("request.jsp") %><br>
上下文路径:<%=request.getContextPath() %> </body>
</html>
页面输出结果:

response 对象
response对象包含了响应客户请求的相关信息,但在JSP 中很少直接用到它,它是HTTPServletResponse 类的实例。
response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效。
常用方法:
- String getCharacterEncoding(): 返回响应的是何种字符编码方式
- void setContentType(String type): 设置响应的MIME 类型
- PrintWriter getWriter(): 返回可以向客户端输出字符的一个对象(注意比较:PrintWriter 与内置out对象的区别)
- sendRedirect(java.lang.String location): 重新定向客户端的请求
<%@ page language="java" import="java.io.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%> <%
response.setContentType("text/html; charset=utf-8"); // 设置响应的MIME类型 out.println("<h1>response 内置对象</h1>");
out.println("<hr>"); PrintWriter outer = response.getWriter(); // 获得输出流对象
outer.println("看看我的位置在哪里");
%>
向客户端输出字符串对象,printWriter 输出总是提前于 jspWriter 的内置 out 对象

如果想让让 jspWriter 优于 printWriter 向客户端输出字符串对象,可以使用 out.flush() 方法,flush的作用是强制把前面的内容输入
<%@ page language="java" import="java.io.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%> <%
response.setContentType("text/html; charset=utf-8"); // 设置响应的MIME类型 out.println("<h1>response 内置对象</h1>");
out.println("<hr>"); out.flush(); // 注意看页面字符串的先后顺序 PrintWriter outer = response.getWriter(); // 获得输出流对象
outer.println("看看我的位置在哪里");
%>
注意与上面对比页面字符串的输出顺序:

再来看下重定向方法:
<%@ page language="java" import="java.io.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%> <%
response.setContentType("text/html; charset=utf-8"); // 设置响应的MIME类型 out.println("<h1>response 内置对象</h1>");
out.println("<hr>"); PrintWriter outer = response.getWriter(); // 获得输出流对象
outer.println("看看我的位置在哪里");
response.sendRedirect("login.jsp"); // 请求重定向
%>
页面跳转了:

请求重定向 和 请求转发的区别
请求重定向:
- 客户端行为
- response.sendRedirect()
- 从本质上讲,等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变
请求转发:
- 服务器行为
- request.getRequestDispatcher().forward(req, res)
- 是一次请求,转发后请求对象会保存,地址栏的URL地址不会发生改变

JSP 内置对象(上)的更多相关文章
- Java遇见HTML——JSP篇之JSP内置对象(上)
一.JSP内置对象简介 1.1.内置对象简介 JSP内置对象是WEB容器中创建的一组对象,可以直接使用不需要new,如截图中的out 对象. JSP有九大内置对象: 五大常用对象: out.reque ...
- JAVA遇见HTML——JSP篇(JSP内置对象上)
action:表单交给哪个动作去处理 MIME类型: 浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理文档:因此服务器设置正确以将正确的MIME类型附加到响应对象的头部是非常重要的. 语法 ...
- JSP内置对象(上)
在JSP中为了简化页面的开发提供了一些内置的对象.这些对象不需要由JSP的编写者通过new关键字实例化,他们都由容器实现和管理,在所有的JSP页面中都可以使用内置对象. JSP中共有9大内置对象: o ...
- jsp内置对象浅谈
jsp内置对象浅谈 | 浏览:1184 | 更新:2013-12-11 16:01 JSP内置对象:我们在使用JSP进行页面编程时可以直接使用而不需自己创建的一些Web容器已为用户创建好的JSP内置对 ...
- JSP内置对象-request
JSP内置对象即无需声明就可以直接使用的对象实例,在实际的开发过程中,比较常用的JSP对象有request,response,session,out和application等,笔者在本文章中将简单介绍 ...
- JavaWeb学习----JSP内置对象详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- JavaWeb之 JSP:内置对象,EL表达式,JSP标签基础
JSP的内置对象 什么是JSP的内置对象呢? 在JSP页面进行编程的时候,如果我们要使用一些对象,如:HttpSession,ServletConfig,ServletContext这些对象,如果每次 ...
- JSP内置对象详解
jsp中内置对象:request.response.session.applecation.out.pagecontesx.config.page.exception.cookie 1.request ...
- JSP内置对象(下)
JSP中共有9大内置对象: out对象 requset对象 response对象 session对象 pageContext对象 application对象 config对象 page对象 excep ...
- JSP运行过程 JSP脚本 静态动态包含 jsp指令 jsp内置对象jsp四大作用域 jsp动作元素 EL表达式 JSTL 设计模式 JSP开发模式 EL内置对象
Day38 JSP JSP的运行过程具体如下: (1)客户端发出请求,请求访问JSP文件. (2)JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果 ...
随机推荐
- Bootstrap 小结
Bootstrap 小结 Bootstrap4特点:1.兼容IE10+ 2.使用flexbox 布局 3.抛弃Nomalize.css 4.提供布局和 reboot 版本 Bootstrap组成:1. ...
- bzoj4476 [Jsoi2015]送礼物
化简式子 $M>=m+ans*(r-l+k)$ 发现$M,m$确定时,总区间长度越小越好,于是假定右端点为最小值$M+ans*l>=m+ans*r+ans*k$, 右面都确定了,但最大值仍 ...
- Charles 连接手机抓包出现Unknown,一直无法抓包的问题解决
mac电脑安装了charles并且确保已经安装成功,https抓包需要安装的相关的证书已经安装,并且手机浏览器中输入chls.pro/ssl已经将证书下载完成,但是手机与电脑相连通过点击手机应用还是无 ...
- Asp.Net Core 轻松学-多线程之Task(补充)
前言 在上一章 Asp.Net Core 轻松学-多线程之Task快速上手 文章中,介绍了使用Task的各种常用场景,但是感觉有部分内容还没有完善,在这里补充一下. 1. 任务的等待 在使用 ...
- vscode restclient 插件
使用步骤: 1.vscode 安装restclient 扩展 2.创建 .http 或 .rest 文件 ,编写相应内容 同一个文件内 可以通过 ### 分割多个请求 可以通过 @hostname ...
- 什么是HTML?
在了解概念之前,先做以下操作,在桌面新建一个txt文件,然后在txt文件中输入:“Hello World”,保存该文件并将其后缀名改为.html,然后双击打开,你就能在浏览器上看到页面显示“Hello ...
- 学习笔记—HTML基础标签
HTML的概念 概念: HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 ( ...
- Android之日志管理(Log)
##文章大纲一.为什么要使用日志管理工具二.日志管理工具实战三.项目源码下载 ##一.为什么要使用日志管理工具###1. 对IT安全至关重要 当您使用强大的日志管理软件自动触发以保护您的系统时,您已 ...
- windows下gitbash安装教程
下载安装 1.从git官网下载一个git安装包,官网下载地址http://www.git-scm.com/download/ 2.双击安装程序,进入欢迎界面点击[Next >] 3.阅读协议,点 ...
- 10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡
分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟程序猿无疑心中会激动一番(或许这是判断是否是一个标准阿猿的标准吧)! 首先自己从宏观把控一下,通过上网科普自 ...