内置对象技术
什么是内置对象
在JSP中,不需要声明和创建就可以直接使用的对象,就是内置对象。
内置对象的功能
为了便于数据信息的保存、传递、获取等操作。
9个内置对象
reuqest(请求对象)
response(响应对象)
session(会话对象)
application(应用程序对象)
out(输出对象)
page(页面对象)
config(配置对象)
exception(异常对象)
pageContext(页面上下文对象)
对象的作用域(生命周期)
其中,有效范围是层层包含的关系,application最大,依次是,session、request和page。
四个有效范围的作用域
application //对象可以在与创建它的JSP页面属于相同的Web应用程序的任意一个JSP中被访问
session //对象可以在与创建它的JSP页面共享相同的HTTP会话的任意一个JSP中被访问
request //对象可以在与创建它的JSP页面监听的HTTP请求相同的任意一个JSP中被访问
page //对象只能在与创建它的JSP页面中被访问
以上范围的对象中,如果实现同一个功能的对象可以采用多种,最好采用范围最小的。因为范围越大,实现的性能越差。
request对象
功能
最主要的作用是接受参数
,当客户端请求一个JSP页面或一个Servlet时,服务器会将客户端的请求信息包装在这个request对象中,请求信息的内容包括请求的头信息,请求的方式,请求的参数名称及参数值等。
常用方法
1. String getParameter(String name); //根据请求属性名(input标签中的name),返回属性值value
2. String [] getParameterValues(String name); //根据请求属性名(input标签中的name),返回多个属性值values,对应HTML中的checkbox标签
3. void setCharacterEncoding("编码格式UTF-8"); //设置post请求的编码,通常为UTF-8,(tomcat7以前的版本的默认编码为“iso-8859-1,tomcat8以后的版本默认编码为“utf-8”)
4. void getRequestDispatcher("b.jsp").forward(request,response); //请求转发的方式跳转到b.jsp页面
5. ServletContext getServerContext(); //获取项目的ServletContext对象
示例1:注册表单
在项目下,新建register.jsp 和 show.jsp 两个jsp文件。
register.jsp内容如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户注册</title>
</head>
<body>
<form action="show.jsp" method="get">
用户名:<input type="text" name="Uname"/><br>
密码: <input type="password" name="Upwd"/><br>
年龄:<input type="text" name="Uage"><br>
爱好:
<input type="checkbox" name="Uhobbies" value="足球">足球、 <!--value:Uhobbies的值-->
<input type="checkbox" name="Uhobbies" value="篮球">篮球、
<input type="checkbox" name="Uhobbies" value="排球">排球<br>
<input type="submit" value="提交">
</form>
</body>
</html>
show.jsp内容如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户信息显示页面</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8"); //再获取request信息前,先设置请求编码
String name = request.getParameter("Uname");
String pwd = request.getParameter("Upwd");
int age = Integer.parseInt(request.getParameter("Uage")); //将字符型转换成整型
String [] hobbies = request.getParameterValues("Uhobbies"); //用一个字符数组来存储Uhobbies的值
%>
注册成功,用户信息如下:<br>
用户名:<%=name %><br>
密码:<%=pwd %><br>
年龄:<%=age %><br>
爱好:
<%
if(hobbies != null){
for(String hobby:hobbies){
out.println(hobby+ "<br>");
}
}
%>
</body>
</html>
启动tomcat服务器,运行register.jsp ,输入以下信息
提交后,跳转到show.jsp, 显示如下
提交方式:
get提交方式:method=“get” 和 地址栏 、超链接(<a href="">
)等方式;
post提交方式:method="post"方式;
get与post提交方式的区别:
- get方式,请求信息在地址栏中显示出来,不安全。post方式,不会显示信息。
- 当表单中有文件上传操作时,必须使用post方式。因为地址栏可容纳的信息有限,大概只有4-5KB。
统一请求编码方法
get提交方式:
- 给每个变量转换编码(不推荐使用)
如在tomcat7以前版本(默认编码为“iso-8859-1”),给每个变量加上
new String(旧编码,新编码);
如:上示例中,在String name = request.getParameter("Uname");
后面加上
name = new String(name.getBytes("iso-8859-1"),"utf-8"); //name的value,将由iso-8859-1转换成utf-8编码
- 修改server.xml文件,可以一次性将tomcat默认编码修改为utf-8
在MyEclipse中,打开tomcat的配置信息,查看tomcat的路径(注意:该路径并不是安装时的tomcat路径,因为在部署tomcat时,在项目下,会拷贝一份tomcat信息),如下图:
根据路径找到tomcat的conf/server.xml文件,打开,找到端口配置的地方,如下图:
在Connector 标签
中加上URIEncoding="UTF-8"
(严格区分大小写),如下图:
即可实现更改了tomcat的默认编码。
post提交方式:
如果出现乱码,在获取request对象属性前,加上一行代码
request.setCharacterEncoding("UTF-8");
示例2:获取request对象的信息
在项目下,新建一个requestdemo.jsp。
requestdemo.jsp代码如下
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>requestDemo</title>
</head>
<body>
请求信息如下:<br>
请求方法是:<%=request.getMethod() %><br>
请求的URI是:<%=request.getRequestURI() %><br>
请求的协议是:<%=request.getProtocol() %><br>
接受客户提交信息的页面路径是:<%=request.getServletPath() %><br>
请求中的查询字符串是:<%=request.getQueryString() %><br>
请求的信息的总长度是:<%=request.getContentLength() %><br>
服务器名称是:<%=request.getServerName() %><br>
提供HTTP服务的服务端口号是:<%=request.getServerPort() %><br>
客户端IP地址是:<%=request.getRemoteAddr() %><br>
客户端机器的名称是:<%=request.getRemoteHost() %><br>
HTTP头文件中User-Agent的值是:<%=request.getHeader("User-Agent") %><br>
HTTP头文件中accept的值是:<%=request.getHeader("accept") %><br>
HTTP头文件中Host的值是:<%=request.getHeader("Host") %><br>
HTTP头文件中accept-encoding的值是:<%=request.getHeader("accept-encoding") %><br>
头文件的一个枚举:
<%
Enumeration head = request.getHeaderNames();
while(head.hasMoreElements()){
out.println((String)head.nextElement()); //打印下一个枚举
}
%><br>
头文件中指定头名字的全部值的一个枚举:
<%
Enumeration headValues = request.getHeaders("cookie");
while(headValues.hasMoreElements()){
out.println((String)headValues.nextElement());
}
%>
</body>
</html>
运行requestdemo.jsp, 显示如下:
response对象
功能
用来处理服务器端对客户端的一些响应。
常用方法
void addCookie(Cookie cookie); //服务器向客户端增加cookie对象
void sendRedirect(String location) throws IOException; //页面跳转(重定向),location表示一个页面,该方法需要抛出异常
void setContentType(String type); //设置服务器响应的编码,type表示编码类型,如UTF-8
示例1:登录重定向
在项目的WebRoot目录下,新建一个文件夹responseDemo。在该文件夹下,新建login.jsp 、check.jsp 、success.jsp 三个jsp文件。
login.jsp代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<form action="check.jsp" method="post">
用户名:<input type="text" name="Uname"><br>
密码:<input type="password" name="Upwd"><br>
<input type="submit" value="提交"><input type="reset" value="重置">
</form>
</body>
</html>
login.jsp主要用于让用户输入登录信息。
check.jsp代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("Uname");
String pwd = request.getParameter("Upwd");
if(name.equals("张三") && pwd.equals("123456")){
response.sendRedirect("success.jsp");
}else{
out.print("用户名或密码有误!");
}
%>
</body>
</html>
check.jsp主要用于判断用户名和密码是否属于合法的用户,假设只有一个用户:张三;密码是:123456。
success.jsp代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<%
String name=request.getParameter("Uname");
%>
登录成功!<br>
你好!<%=name %>
</body>
</html>
success.jsp主要用于用户登录成功,输出的欢迎页面。
测试
-
执行login.jsp页面,输入不合法的用户名或密码,如下:
-
重新执行login.jsp页面,输入合法的用户名和密码,如下:
由上图,可见成功登录了。通过地址栏,已跳转到了success.jsp页面了,但是success.jsp中,无法获取到用户名,输出了null
3. 将check.jsp中的
response.sendRedirect("success.jsp");
改为
request.getRequestDispatcher("success.jsp").forward(request, response);
保存后,重新运行login.jsp,输入合法的用户和密码后,提交,跳转如下:
可见,采用request跳转,可以得到用户名:张三。由地址栏可知,只是跳转到了check.jsp页面,并没有跳转到success.jsp页面。
两种跳转方式的区别
response.sendRedirect("success.jsp");
是重定向
request.getRequestDispatcher("success.jsp").forward(request, response);
是请求转发
由测试中第2、3步中的地址栏中可以看出地址栏改变与否。
请求次数参考下图:
类似于:张三到银行办理取钱业务。
- 如果是请求转发。张三
(客户端)
向窗口A(check.jsp)
请求取钱, 窗口A验证了张三是合法用户,但是窗口A并不支持取钱的业务,在张三不知道的情况下,它将请求转发给支持取钱的窗口B(success.jsp)
,窗口B将钱取出来(回复一个响应)
给张三。 - 如果是重定向。张三
(客户端)
向窗口A(check.jsp)
请求取钱, 窗口A验证了张三是合法用户,但是窗口A并不支持取钱的业务,它将跟张三说(回复一个响应)
,窗口B(success.jsp)
支持取钱业务。张三将第二次发送请求给窗口B,窗口B将钱取出来(回复一个响应)
给张三。 - 跳转范围。
将check.jsp的response.sendRedirect("success.jsp");
中的“success.jsp"改成"http://www.baidu.com"
,跳转结果如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R0uAL5Pi-1611143173667)(response跳转范围.png)]
可见,response.sendRedirect()方法可以跳转到外部网站。
再将response.sendRedirect("http://www.baidu.com");
该成request.getRequestDispatcher("http://www.baidu.com").forward(request, response);
,跳转结果如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cDR5Ipto-1611143173668)(request跳转范围.png)]
可见,request.getRequestDispatcher("http://www.baidu.com").forward(request, response)方法
无法跳转到外部网站。
示例2:根据客户端选择调用相应的程序处理
void setContentType(MAME)方法
可以动态改变ContentType的属性值,参数MIME可text/html、text/plain、application/x-msexcel、application/msworld等,该方法的作用是:客户端浏览器通过区分不同种类的数据,调用浏览器内不同的程序嵌入模块来处理相应的数据。
MIME
定义
MIME(Multipurpose Internet Mail Extensions)
多用途互联网邮件扩展类型。是设定某种扩展名的文件用的一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
常见的MIME类型(通用型):
超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二进制数据 application/octet-stream
示例
在responseDemo文件夹下,新建data.txt 、response1.jsp 、contenttype.html 三个文件。
data.txt内容如下:
34 79 51 99<br>
40 69 92 22<br>
67 71 85 20<br>
72 30 78 38<br>
55 61 39 43<br>
43 81 10 55<br>
36 93 41 99<br>
contenttype.html 代码如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="txt/html;charset=utf-8" /> <!-- 设置html的编码为UTF-8,默认为ANSI -->
</head>
<body bgcolor=cyan>
<font size=5>
<p>你想使用什么方式查看文本文件data.txt</p>
<form action="response1.jsp" method="post" name="form">
<input type="submit" value="word" name="submit1"> <!-- value显示在按钮内 -->
<input type="submit" value="excel" name="submit2">
</form>
</font>
</body>
</html>
response1.jsp 代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<%
String str1 = request.getParameter("submit1");
String str2 = request.getParameter("submit2");
if(str1==null) //防止出现异常,体面推出
str1="";
if(str2==null)
str2="";
if(str1.startsWith("word")){
response.setContentType("application/msword;charset=utf-8");
}
if(str2.startsWith("excel")){
response.setContentType("application/x-msexcel;charset=utf-8");
}
%>
<jsp:include page="data.txt" />
</body>
</html>
测试
-
执行contenttype.html页面,显示如下:
-
当选择word时,显示如下:
-
可以对数据进行保存、查看等操作。
out对象
功能
1.out对象代表向客户端输出数据。JSP中out输出的数据只是输出在HTML上,这些数据是怎样显示在浏览器上,还是显不显示,还要结合HTML的代码来分析。
2.out对象还管理应用服务器上输出缓冲区。
常用方法
clear() 清除缓冲区的内容
clearBuffer() 清除缓冲区当前的内容
flush() 清空流
getBufferSize() 返回缓冲区字节数的大小,默认为8KB
getRemaining() 返回缓冲区剩余多少可用
isAutoFlush() 当缓冲区满时,是否自动刷新
printIn() / print() 输出内容,前者输完换行,后者不换,注意:是输出在HTML上的,不一定在浏览器上显示
close() 关闭输出流
newLine() 换行
示例
主要:理解清空缓冲的工作原理。
示例代码如下:
浏览器上的显示如下:
可见,显示很混乱,out.printin()、out.newLine()等换行效果都没有出来。其实,out对象输出的内容是显示在HTML源码中的,而HTML中的回车换行和空格等效果,在浏览器中,都只是显示一个空格而已。
在out.flush()之后,剩余可用缓冲增多了,也就说明out.flush()清空了缓冲了。
网页内容的三种输出方法
- HTML
- JSP表达式
- out对象
注意
out对象
和 Java中的代码输出
是输出到HTML上的,并不是输出到浏览器上显示。