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大隐藏对象,如下
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jsp.JspWriter | 用于页面输出 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息 |
respone | javax.servlet.http.HttpServletRespone | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
session | javax.servlet.http.HttpSession | 用来保存用户的信息 |
application | javax.servlet.ServletContext | 所有用户的共享信息 |
page | java.lang.Object | 指当前页面转换后的servlet类的实例 |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
exception | java.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>