jsp隐藏对象

jsp的最终表现形式

jsp代码最终会通过Tomcat转换成servlet的 .java 文件,通过java环境编译为 .class 文件。通过由jsp转成的servlet类中会包含9大隐藏对象

jsp的隐藏对象

jsp文件通过Tomcat编译后保存在项目目录文件夹下的 .metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\demo_10_29\org\apache\jsp 中,文件包过jsp转换为.java和编译后的.class文件。
在jsp页面中有些对象需要经常使用,在jsp中提供了9大隐藏对象,如下

名称类型描述
outjavax.servlet.jsp.JspWriter用于页面输出
requestjavax.servlet.http.HttpServletRequest得到用户请求信息
responejavax.servlet.http.HttpServletRespone服务器向客户端的回应信息
configjavax.servlet.ServletConfig服务器配置,可以取得初始化参数
sessionjavax.servlet.http.HttpSession用来保存用户的信息
applicationjavax.servlet.ServletContext所有用户的共享信息
pagejava.lang.Object指当前页面转换后的servlet类的实例
pageContextjavax.servlet.jsp.PageContextJSP的页面容器
exceptionjava.lang.Throwable表示JSP页面所发生的异常,在错误页面才起作用

在一般的由jsp转换成的servlet中只有前8个隐藏对象,没有错误对象如下:

 final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;

出现这种情况的原因是因为exception对象只在错误页面中才起作用,需要在由eclipse生成的页面中加入 isErrorpage=“true” ,如下

//这是没加之前
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
// 加了之后
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%>
out对象

隐藏对象out是javax.servlet.jsp.JspWriter包的实现,其和servlet中的printwriter同样有缓冲区,但jspwriter的缓冲区内容需要发送到printwriter对象中在由printwriter发送出去。所以如果printwriter存在缓冲区,就会发生在接收到jspwriter发来的数据对其进行缓冲,从而造成在输出是造成输出混乱。在写jsp页面时需要把printwriter的缓冲区大小设置为0kb

<%@page import="java.io.PrintWriter"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%--buffer="0kb" 设置printwriter对象的缓冲区设置为0,因为隐藏对象out是javax.servlet.jsp.JspWriter包最终需要通过printwriter缓冲区,
   	所有设置printwriter缓冲区为0,使printwriter没有缓冲,即jspwriter发送到printwriter一条数据,printwriter不能缓冲直接输出 --%>
<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title></title>
	</head>
	<body>
		<h1>用户登录界面</h1>
		<form action="">
			用户名:<input type="text" name="username">
			密码: <input type="password" name="userpass">
			<input type="submit" value="登录">
		</form>
		<%
			String username = request.getParameter("username");
			String userpass = request.getParameter("userpass");
			out.print(username);
			response.getWriter().print(userpass);
		%>
	</body>
</html>

// 设置printwriter的缓冲区为0
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" buffer="0kb"%>
pageContext对象

pageContext可以访问其他8个隐藏对象及访问4大作用域
四大作用域

Web应用中,JSP创建的对象有一定的生命周期,也有可能被其他组件或者对象访问。对象的声明周期和可访问性称为作用域。四种范围对象作用域从小到大顺序如下:pageContext----request----session----application。

(1)pageContext:页面域

页面作用域仅限于当前页面对象,可以近似于理解为java的this对象,离开当前JSP页面(无论是redirect还是forward),则pageContext中的所有属性值就会丢失。

(2)request:请求域

请求作用域是同一个请求之内,在页面跳转时,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值。如果通过redirect方式进行页面跳转,由于redirect相当于重新发出的请求,此种场景下,request中的属性值会丢失。

(3)session:会话域

会话作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失。

(4)application: 应用域

应用作用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享

<%@ 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>
		<h1>页面容器对象-最强	</h1>
		<h2>通过pageContext对象还可以访问其他8个对象</h2>
		<h3>通过pageContext对象还可以访问4大作用域</h3>
		<%
			//java小脚本测试pageContext页面容器对象
			//1.获取其他对象
			HttpServletRequest req = (HttpServletRequest)pageContext.getRequest();
			HttpSession ses = (HttpSession)pageContext.getSession();
			//2.使用获取对象
			req.setAttribute("req", "form页面容器对象的req111");
			request.setAttribute("req","form页面容器对象的req222" );
			req.setAttribute("req", "form页面容器对象的req333");
			//3.直接访问,默认放在当前页面容器总即PAGE_SCOPE,只能在当前页面取得,其他页面无法获得
			pageContext.setAttribute("req", "pagetContext直接获取的属性aaaa",pageContext.PAGE_SCOPE);//pageContext.PAGE_SCOPE设置其作用域,PAGE_SCOPE为当前页面
			String str1 = (String)pageContext.getAttribute("req");
		%>
		<%-- 取出req的session对象 --%>
		<%= req.getAttribute("req") %>
		<%= str1 %>
	</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值