JSP的九大内置对象

6 篇文章 0 订阅

前言:一个功能分为两个终端(客户端与服务端)(前端与后端),客户端接收数据,提交给服务端,服务端处理后,把结果展示给客户端,这个就是一个完整的请求/响应模式;数据如何在页面与页面之间传递?可以使用JSP的内置对象来解决

一、JSP内置对象

JSP内置对象是Web容器创建的一组对象

  • JSP内置对象的名称是JSP保留字
  • JSP内置对象是可以直接在JSP页面中使用的对象,无需声明和创建,直接使用即可
  • JSP一功预定义了9个这样的对象,分别有:request、response、session、application、out、pageContext、config、page、exception

二、request对象

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

1、request的常用方法

方法说明
String getParameter(String name)根据表单组件名称获取提交数据
String[] getParameterValues(String name)获取表单组件对应多个值的请求数据
void setCharacterEncoding(String charset)指定每个请求的编码
RequestDispatcher getRequestDisPatcher(String path)返回一个RequestDispatcher对象,该对象的forward()方法用于转发请求
void setAttribute(String key, Object value)以key/value形式将值保存到request中

2、关于request的小例子

例子1:一个页面通过form表单将数据提交到另一个页面中展示

  • 表单源数据JSP页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>request内置对象的使用--提交页面</title>
</head>
<body>
<!-- jQuery用标签的id属性作为数据的KeyValue标注 -->
<!-- tomcat服务器用标签的name属性作为数据的KeyValue标注 -->
	<!-- post会乱码  数据在tomcat服务器之间传递,而tomcat使用的编码是ISO-8859-1,因此会乱码 -->
	<!-- get不乱码,是因为在tomcat8.0及以上版本内部做了映射(设置),因此不会乱码 -->
	<form action="acceptData.jsp" method="post">	
		<p>
			请输入姓名:
			<input type="text" name="userName" required="required" placeholder="请在这里输入姓名..." />
		</p>
		<p>
			请选择性别:<br>
			<input type="radio" name="userSex" value="" /><br />
			<input type="radio" name="userSex" value="" /><br />
		</p>
		<p>
			请选择你的特征:<br />
			<input type="checkbox" name="userTrait" value="丑陋" />好看<br />
			<input type="checkbox" name="userTrait" value="衰老" />年轻<br />
			<input type="checkbox" name="userTrait" value="恶毒" />善良<br />
			<input type="checkbox" name="userTrait" value="屌丝" />有钱<br />
		</p>
		<p>
			<button type="submit">提交</button>
		</p>
	</form>
	<button type="button" onclick="window.history.go(1);">前进</button>
</body>
</html>
  • 数据展示JSP页面
<%@page import="java.util.Arrays"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>request内置对象的使用--接收页面</title>
</head>
<body>

	<%
		// 接收数据之前需要设置请求的编码
		request.setCharacterEncoding("utf-8");
		String userName = request.getParameter("userName");
		String[] userTrait = request.getParameterValues("userTrait");
		String userSex = request.getParameter("userSex");
	%>

<!-- request.getParameter("标签名称") 专门用来接收客户端传递的数据(form表单数据) -->
<!-- getParameter()返回的是String类型,因为它是根据HTTP协议进行传输的,而HTTP协议传输字符流 -->
	<h1>
		欢迎您!<%=userName%>同学,<br>
		万万没想到,你竟然是个<%=Arrays.toString(userTrait) %>的老<%=userSex %>人!!!
	</h1>
	<button type="button" onclick="javascript:window.history.go(-1);">返回</button>
</body>
</html>
  1. 在接收页面接收数据时,需要根据form表单中封装的input标签的name值来进行接收,并且接收到的数据只能是String类型,因为这是通过数据传输协议(HTTP协议)进行限制的。
  2. 在接收页面接收数据时,若是多个值需要使用String[]数组来接收,例如复选框的值。
  3. 在接收get请求时,因为在tomcat8.0及以上版本内部做了映射(设置),所以可以不设置编码格式;但采用post请求时,需要设置编码格式,因为数据在tomcat服务器之间传递,而tomcat使用的编码是ISO-8859-1,因此会乱码。

例子2:通过输入不同的姓名进入不同的页面

  • 登录页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body>
	<div>
		<form action="process.jsp" action="post">
			<input type="text" name="userName" required="required" placeholder="请在这输入您的姓名..."  />
			<input type="submit"  value="登录" />
		</form>
	</div>
</body>
</html>
  • 跳转逻辑处理JSP(功能页面,都是小脚本,不展示任何数据)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 定义普通用户数组
	String[] losers = {"王某", "小王", "wang"};
	// 定义vip用户数组
	String[] vips = { "小李", "Jan", "jan"};
	
	// 设定编码
	request.setCharacterEncoding("utf-8");
	// 接收页面请求
	String userName = request.getParameter("userName");
	// 定义最终展示的结果页
	String result = "error.jsp"; // 默认错误页面
	
	// 判断是否为普通用户
	for(String loser : losers){
		if(userName.equals(loser)){
			result = "user.jsp";
		}
	}
	
	// 判断是否为vip用户
	for(String vip : vips){
		if(userName.equals(vip)){
			result = "vipUser.jsp";
		}
	}
	
	// 提交业务结果转发到对应页面
	// getRequestDispatcher 分发到不同页面
	// forward真正的转发	request 请求	response 响应
	request.getRequestDispatcher(result).forward(request, response);
%>
  1. 此处调用request对象的getRequestDispatcher()方法,这个方法有一个参数是用来设定请求发送的地址。页面发起请求先由统一的一个服务页面接收,然后根据业务不同再转发给其他页面进行操作。
  2. 后面的forward()方法叫做转发方法,也就是将现在的请求处理再交给其他程序处理,里面有两个参数 request,response。
  • 展示页面1
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>普通用户</title>
</head>
<body>
	<div>
		<p>欢迎,<%=request.getParameter("userName") %></p>
	</div>
	<div>
		<marquee behavior="alternate" scrollamount="20" onmouseout="this.start();" onmouseover="this.stop();" >
			<h1 style="font-size: 100px; color: red;">
				赶紧充钱成为VIP用户!
			</h1>
		</marquee>
	</div>
	<button type="button" onclick="window.history.back();">返回</button>
</body>
</html>
  • 展示页面2
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>炫酷炸天Vip用户</title>
		<style type="text/css">
			h1{
				animation:glow 10s ease-in-out infinite;
				/*
				For less laggy effect, uncomment this:
					animation:none;
					-webkit-text-stroke:1px #fff;
					=========== 
				*/
			}
			*{
				box-sizing:border-box;
			}
			/* 背景色 */
 			body{
				background: #0a0a0a;
				overflow:hidden;
				text-align:center;
			}
			/* 3D侧面 */
 			figure{
				animation:wobble 5s ease-in-out infinite;
				transform-orign:center center;
				transform-style:preserve-3d;
			}
			/* 摆动效果 */
			@keyframes wobble{
				0%,100%{transform:rotate3d(1,1,0,40deg);}
				25%{transform:rotate3d(-1,1,0,40deg);}
				50%{transform:rotate3d(-1,-1,0,40deg);}
				75%{transform:rotate3d(1,-1,0,40deg)})
			}
			h1{
				display: block;
				width:100%;
				padding:40px;
				line-height:1.5;
				font:900 8em 'Concert One', sans-serif;
				text-transform:uppercase;
				position:absolute;
				color:#0a0a0a;
			}
			/* 显示,颜色效果 */
			@keyframes glow{
				0%,100%{text-shadow:0 0 30px yellow;}
				25%{text-shadow:0 0 30px purple;}
				50%{text-shadow:0 0 30px pink;}
				75%{text-shadow:0 0 30px cyan;}
			}
			/* 3D效果 */
 			h1:nth-child(2){transform:translateZ(5px);}
			h1:nth-child(3){ transform:translateZ(10px);}
			h1:nth-child(4){ transform:translateZ(15px); }
			h1:nth-child(5){ transform:translateZ(20px); }
			h1:nth-child(6){ transform:translateZ(25px); }
			h1:nth-child(7){ transform:translateZ(30px); }
			h1:nth-child(8){ transform:translateZ(35px); }
			h1:nth-child(9){ transform:translateZ(40px); }
			h1:nth-child(10){ transform:translateZ(45px); }
		</style>
	</head>
	<body>
		<figure>
		  <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
		  <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
		  <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
		  <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
		  <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
		  <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
		  <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
		  <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
		  <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
		  <h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
		</figure>
	</body>
</html>

不管是哪个展示页面其地址栏中的地址始终停留在最开始被请求的process.jsp页面,这就是转发的特性,面对客户端来说它只知道请求传递给了process.jsp,然后process.jsp再把请求交给哪个页面处理就是服务器内部的事情了,因此在request内部进行这种请求转发处理的时候不管转了多少次,都是可以接收到最开始请求的数据的。这种数据传输处理的方式,叫做request的请求转发链,它的特点就是发生在服务器内部,浏览器看不到每个内部的处理环节都可以处理请求的数据。

三、response对象

response对象代表的是客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象的作用域只在当前JSP页面内有效。

1、response概述

response对象用于响应客户请求并向客户端输出信息。

2、response的常用方法

方法说明
void sendRedirect(String location)重定向,表示本次请求已经处理完毕,客户端将重新发送请求到指定URL

重定向后request对象会被重置,即request中的信息都会丢失,并且地址栏也会发生改变成新的地址。

3、request和response的区别

  • request是页面发送请求到服务器,然后服务器接收数据再做处理。因为客户端与服务器之间的传输都是字符流,所以request也叫请求流。
  • response与request相反,是服务器处理完了页面请求之后,需要发送结果给页面,因为服务器向客户端发送信息,所以response叫相应流。
  • B/S请求与响应模式:
    request:(页面请求 --> 服务器处理 --> 页面展示)将form数据从页面带到服务端,然后:设置编码,接收数据,保存数据,转发数据。
    response:(页面请求 --> 服务器操作)重定向代表本次操作已完成,然后开启下一次操作。
requestresponse
转发重定向
在服务器端发挥作用,将同一请求在服务器资源之间进行传递在客户端发挥作用,通过发送一个新的请求实现页面跳转
客户端浏览器的地址栏不会显示转向后的地址客户端浏览器的地址栏会显示转向后的地址
DQL操作使用转发DML操作使用重定向

4、关于response的小例子

例子:修改上个案例的跳转页面的request换成response

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 定义普通用户数组
	String[] losers = {"王某", "小王", "wang"};
	// 定义vip用户数组
	String[] vips = { "小李", "Jan", "jan"};
	
	// 设定编码
	request.setCharacterEncoding("utf-8");
	// 接收页面请求
	String userName = request.getParameter("userName");
	// 定义最终展示的结果页
	String result = "error.jsp"; // 默认错误页面
	
	// 判断是否为普通用户
	for(String loser : losers){
		if(userName.equals(loser)){
			result = "user.jsp";
		}
	}
	
	// 判断是否为vip用户
	for(String vip : vips){
		if(userName.equals(vip)){
			result = "vipUser.jsp";
		}
	}
	
	// 提交业务结果转发到对应页面
	// getRequestDispatcher 分发到不同页面
	// forward真正的转发	request 请求	response 响应
	// request.getRequestDispatcher(result).forward(request, response);
	// 换成重定向
	response.sendRedirect(result);
%>
  • 结果中地址栏直接显示当前的页面地址,而不是停留在process.jsp逻辑页面。
  • 并且结果页面也不能接收到userName,都为null

四、session对象

session对象是由服务器自动创建的,与请求相关的对象。是服务器创建用于与浏览器沟通的通道。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类型来保存数据,因此保存数据的格式为KV结构。session对象的value可以是复杂的对象类型,而不仅仅局限于字符串类型。session对象的作用域在浏览器的一次打开与关闭内有效。

1、session概述

一个会话就是在一段时间内,一个客户端与Web服务器的一连串相互交互的过程。与tomcat的一次通信,其中会包含多个页面的跳转里面都包含转发与重定向,而不管多少次转发与重定向其实tomcat就只给我们创建一个会话叫做session对象。

2、session对象的常用方法

方法说明
String getId()获取sessionid
void setMaxInactiveInterval(int interval)设定session的非活动时间
int getMaxInactiveInterval()获取session的有效非活动时间(秒)
void invalidate()设置session对象失效
void setAttribute(String key, Object value)以key/value形式保存对象值
Object getAttribute(String key)通过key获取对象值
void removeAttribute(String key)从session中删除指定名称所对应的对象

3、关于session对象的小例子

index.jsp

	<%
			pageContext.setAttribute("msg1", "pageContext_msg!");
			request.setAttribute("msg2", "request_msg!");
			session.setAttribute("msg3", "session_msg!");
			// 重定向
			response.sendRedirect("page1.jsp");
	%>
		<p>我是首页</p>
		<p>pageContext.request.contextPath:${pageContext.request.contextPath }</p>
		<p>msg1:${msg1 }</p>
		<p>msg2:${msg2 }</p>
		<p>msg3:${msg3 }</p>

page2.jsp

		<p>我是page1:index重定向过来的</p>
		<p>msg1:${msg1 }</p>
		<p>msg2:${msg2 }</p>
		<p>msg3:${msg3 }</p>

五、application对象

application对象可以将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象的声明周期更长,类似于系统的全局变量。作用域在Tomcat服务器的一次开启与关闭内有效。

1、application概述

application对象类似于系统的“全局变量”,在tomcat开启的时候,创建一个application对象,然后整个项目不管打开和关闭多少次都只有这一个对象。

2、application对象的常用方法

方法说明
void setAttribute(String key, Object value)以key/value形式保存对象值
Object getAttribute(String key)通过key获取对象值
String getRealPath(String path)返回相对路径的真实路径

3、关于application对象的小例子

index.jsp

			pageContext.setAttribute("msg1", "pageContext_msg!");
			request.setAttribute("msg2", "request_msg!");
			session.setAttribute("msg3", "session_msg!");
			application.setAttribute("msg4", "application_msg!");
			// 转发
			request.getRequestDispatcher("page1.jsp").forward(request,response);
	%>
		<p>我是首页</p>
		<p>pageContext.request.contextPath:${pageContext.request.contextPath }</p>
		<p>msg1:${msg1 }</p>
		<p>msg2:${msg2 }</p>
		<p>msg3:${msg3 }</p>
		<p>msg4:${msg4 }</p>

page1.jsp

	<%
		// 重定向
		response.sendRedirect("page2.jsp");
	%>
		<p>我是page1:index转发过来的</p>
		<p>msg1:${msg1 }</p>
		<p>msg2:${msg2 }</p>
		<p>msg3:${msg3 }</p>
		<p>msg4:${msg4 }</p>

page2.jsp

		<p>我是page2:page1重定向过来的</p>
		<p>msg1:${msg1 }</p>
		<p>msg2:${msg2 }</p>
		<p>msg3:${msg3 }</p>
		<p>msg4:${msg4 }</p>

六、out对象

out对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。

1、out对象概述

在使用out对象输出数据时,可以对数据缓冲区进行操作,即使清楚缓冲区中的残留数据,为其他的输出让出缓冲空间。带输出完毕后,要及时关闭输出流。

2、out对象的常用方法

方法说明
void print(Object arg)向客户端输出数据
void flush()刷新缓冲区空间
void close()关闭输出流

3、关于out对象的小例子

	<%
			pageContext.setAttribute("msg1", "pageContext_msg!");
			request.setAttribute("msg2", "request_msg!");
			session.setAttribute("msg3", "session_msg!");
			application.setAttribute("msg4", "application_msg!");
			out.print("abc");
			out.flush();
			// 如果这里显示的关闭out对象,则其他数据都输出不了
			out.close();
	%>
	<div>
		<p>我是首页</p>
		<p>pageContext.request.contextPath:${pageContext.request.contextPath }</p>
		<p>msg1:${msg1 }</p>
		<p>msg2:${msg2 }</p>
		<p>msg3:${msg3 }</p>
		<p>msg4:${msg4 }</p>

七、pageContext对象

pageContext对象提供了对JSP页面内所有的对象及名字空间的访问。pageContext对象的作用是取得任何范围的参数,可以获取JSP页面的request、response、session、application、out等对象。pageContext的作用域不论是转发还是重定向,只在当前页面有效。

1、获取当前项目名

利用pageContext来获取现在访问的项目名称,它能绝对定位到项目的根目录下,可以用于配置一些请求或者引入文件的位置

${pageContext.request.contextPath}

2、关于pageContext对象作用域的例子

index.jsp

<%
	pageContext.setAttribute("msg1", "pageContext_msg!");
	request.setAttribute("msg2", "request_msg!");
	// 转发
	request.getRequestDispatcher("page1.jsp").forward(request,response);
%>
	<p>pageContext.request.contextPath:${pageContext.request.contextPath }</p>
	<p>msg1:${msg1 }</p>
	<p>msg2:${msg2 }</p>

page1.jsp

		<p>我是page1:index转发过来的</p>
		<p>msg1:${msg1 }</p>
		<p>msg2:${msg2 }</p>

八、config对象

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

九、page对象

page对象代表JSP本身,只有在JSP页面内才是合法的。page对象本质上包括当前Servlet接口引用的变量,类似于Java的this指针。

十、exception对象

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

十一、内置对象总结

1、内置对象

名称说明
request主要用于处理客户端请求的数据信息
response用于响应客户端请求并向客户端输出信息
session用于记录会话状态的相关信息
application类似于系统全局变量,用于实现web应用中的资源共享
out用于向客户端输出数据

2、作用域

名称说明
page作用域在一个页面范围内有效 ,通过pageContext对象访问
request作用域在一个服务器请求范围内有效
session作用域在一次会话范围内有效
application作用域在一个应用服务器范围内有效

同名取值规则(就近原则):
page -> request -> session -> application

3、cookie对象

1.cookie对象概述
cookie是Web服务器保存在客户端的一系列文本信息。cookie是网站把一些信息保留在你本地的浏览器的一种操作。
注:cookie是脱离服务器管理的,因此一些敏感数据不应该放在cookie里,如果真的想放也应该是加密之后再放进去
2.cookie语法

  • 创建cookie对象
    Cookie 对象名 = new Cookie(String key, String value);
  • 写入cookie
    response.addCookie(对象名);
  • 读取cookie
    Cookie[] 数组名 = request.getCookies();
    注:cookie中只能保存字符串
    3.cookie常用对象
    | 方法 | 说明 |
    |–|--|
    | void setMaxAge(int expiry) | 设置cookie有效期(秒) |
    | void setValue(String value) | 在cookie创建后,对cookie进行赋值 |
    | String getName() | 获取cookie的名称 |
    | String getValue() | 获取cookie的值 |
    | int getMaxAge() | 获取cookie的有效时间(秒) |
    4.有关cookie对象的小例子
    index.jsp
	<%
			pageContext.setAttribute("msg1", "pageContext_msg!");
			request.setAttribute("msg2", "request_msg!");
			session.setAttribute("msg3", "session_msg!");
			application.setAttribute("msg4", "application_msg!");
			// 创建cookie对象 保存msg5
			Cookie ck = new Cookie("msg5", "cookie_msg!");
			// 设置有效期600秒
			ck.setMaxAge(600);
			// 写入cookie
			response.addCookie(ck);
	%>
	<div>
		<p>我是首页</p>
		<p>pageContext.request.contextPath:${pageContext.request.contextPath }</p>
		<p>msg1:${msg1 }</p>
		<p>msg2:${msg2 }</p>
		<p>msg3:${msg3 }</p>
		<p>msg4:${msg4 }</p>

page1.jsp

	<%
		String val = "";
		Cookie [] cks = request.getCookies();
		for(Cookie c : cks){
			if(c.getName().equals("msg5")){
				val = c.getValue();
			}
		}
	%>
	<div>
		<p>我是page1:没有重定向和转发</p>
		<p>msg1:${msg1 }</p>
		<p>msg2:${msg2 }</p>
		<p>msg3:${msg3 }</p>
		<p>msg4:${msg4 }</p>
		<p>msg5:<%=val %></p>
	</div>

5.session与cookie区别

区别sessioncookie
保存信息端服务器客户端
保存信息数据类型ObjectString
保存信息有效期会话结束销毁长期保存在本地
保存信息分类重要信息不重要信息
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值