内置对象技术

本文详细介绍了JSP的内置对象,包括request、response和out对象的功能、常用方法及实例演示。request对象用于处理客户端请求信息,response对象负责服务器端响应,out对象则用于向客户端输出数据。文章还讨论了请求编码、重定向、MIME类型等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内置对象技术

什么是内置对象

在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提交方式的区别:

  1. get方式,请求信息在地址栏中显示出来,不安全。post方式,不会显示信息。
  2. 当表单中有文件上传操作时,必须使用post方式。因为地址栏可容纳的信息有限,大概只有4-5KB。

统一请求编码方法

get提交方式:
  1. 给每个变量转换编码(不推荐使用)
    如在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编码
  1. 修改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主要用于用户登录成功,输出的欢迎页面。

测试
  1. 执行login.jsp页面,输入不合法的用户名或密码,如下:在这里插入图片描述
    在这里插入图片描述

  2. 重新执行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步中的地址栏中可以看出地址栏改变与否。
请求次数参考下图:
在这里插入图片描述

类似于:张三到银行办理取钱业务。

  1. 如果是请求转发。张三(客户端)向窗口A(check.jsp)请求取钱, 窗口A验证了张三是合法用户,但是窗口A并不支持取钱的业务,在张三不知道的情况下,它将请求转发给支持取钱的窗口B(success.jsp),窗口B将钱取出来(回复一个响应)给张三。
  2. 如果是重定向。张三(客户端)向窗口A(check.jsp)请求取钱, 窗口A验证了张三是合法用户,但是窗口A并不支持取钱的业务,它将跟张三说(回复一个响应),窗口B(success.jsp)支持取钱业务。张三将第二次发送请求给窗口B,窗口B将钱取出来(回复一个响应)给张三。
  3. 跳转范围。
    将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>
测试
  1. 执行contenttype.html页面,显示如下:在这里插入图片描述

  2. 当选择word时,显示如下:在这里插入图片描述

  3. 可以对数据进行保存、查看等操作。

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()清空了缓冲了。

网页内容的三种输出方法

  1. HTML
  2. JSP表达式
  3. out对象

注意

out对象Java中的代码输出是输出到HTML上的,并不是输出到浏览器上显示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值