jsp jsp九个内置对象
每个JSP页面在第一次被访问的时候,WEB容器都会把请求交给JSP引擎(即一个JAVA)程序。JSP引擎先将JSP翻译成一个_jspServlet实质也是一次servlet,然后按照
Servlet的调用方式进行调用。
由于jsp第一次访问时候会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,jsp引擎如果发现jsp没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
jsp引擎在调用jsp对应的_jspServlet时,会传递或创建9个web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面的时候获得这些web对象的引用,特意定义了9个相应的变量。这样JPS页面中通过这些变量就可以快速获得9大对象的引用。
9个内置对象
pageContext javax.servlet.jsp.PageContext
request javax.servlet.http.HttpServeletRequest
response javax.servlet.http.HttpServletResponse
session javax.servlet.http.httpSession
application javax.servlet.ServletContext
config javax.servlet.ServletConfig
out javax.servlet.jsp.JspWriter
page java.lang.Object
exception java.lang.Throwable
page对象
page对象表示当前一个jsp页面,可以理解为对象本身,即:把一个jsp当做一个对象来看待。在开发中几乎不用
request对象
request对象是HttpServletRequest类的实例。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。
requst对象提供了一系列方法来获取http头信息,cookies,http方法等。
response对象
response对象是HttpServletResponse类的实例。当服务器创建request对象时会同时创建用于响应这个客户端的response对象
response对象也定义了处理HTTP头模块的接口。通过这个对象开发者可以添加新的cookies,时间戳,http状态码等等。
session对象
session对象是javax.servlet.http.HttpSession类的实例。和java Servlet中的session对象有一样的行为。
session对象用来跟踪在各个客户端请求间的回话。
application对象
application对象直接包装了servlet的ServletContext类的对象,是javax.servlet.ServletContext类的对象。这个对象在JSP页面的整个生命周期中都代表着整个JSP页面。这个对象在jsp页面初始化时被创建,随着jspDestory()方法的调用而被移除。
通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。
out对象
out对象用于向客户端发送文本数据
out对象是通过调用pageConext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的printWriter对象相似。jsp页面中的out对象的类型为JspWriter,JspWriter相当于一种带缓存功能PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓冲大小,甚至关闭它的缓冲。
只有向out对象中写入内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将,out对象的缓冲去中的内容真正写入到Servlet引擎提供的缓冲区中
设置page指令的buffer属性关闭了out对象的缓存功能
out对象的缓冲区已满
整个jsp页面结束
config对象
config对象是java.Servlet.ServletConfig类的实例,直接包装了ServletConfig类的对象
这个对象允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等。
config.getServletName();
返回包含在<servlet-name>元素中的servlet名字,注意,<servlet-name>元素在WEB-INF/web.xml文件中定义
pageContext对象
pageContext对象是jsp技术中最重要的一个对象,它代表jsp页面的运行环境。这个对象不仅封装了对其他8大隐式对象的引用,它自身还是一个域对象(容器)。
并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其他资源,检索其他域对象中的属性都能
pageContext获取其他对象
getException 方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
pageContext封装其他8大内置对象的意义。如果在编程过程中,把pageContext对象传递给一个普通java对象,那么这个java对象将可以获取8大隐式对象,
此时这个java对象就可以和浏览器交互了。此时这个java对象就成为一个动态web资源了,这就是pageContext封装其他8大内置对象的意义。 把pageContext
传递给谁,谁就能成为一个动态web资源,那么什么情况下需要把pageContext传递一个java类呢,什么情况下需要使用这种技术呢,在比较正规的开发中,
jsp页面是不允许出现java代码的,如果jsp页面出现了java代码就应该想办法把java代码给移除掉,我们可以开发一个自定义的标签来移除jsp页面上出现的java
代码。jsp引擎在执行自定义的标签的时候会调用围绕在自定义标签写的那个java类,在调用java类的时候就会把pageContext对象传递传递给这个java类。由于
pageContext对象还封装其他8个隐式对象的引用,因此这个java类就可以使用jsp页面中8个隐式对象(request,response,config,application,session,page,out,exception)
pageContext可以用来作为容器使用,因此可以将一些数据存储在pageContext中。
pageContext常用的方法
public void setAttribute(name,value);
getAttribute(name);
removeAttribute(name);
public object findAttribute(name);
其中findAttibute 是用来查找各个域中的属性的,顺序是page-request-session-application,只要找到就返回属性值,如果都没有找到则返回null
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<div>设置信息内容JAVA代码</div>
<%
pageContext.setAttribute("n1", "高硕");
request.setAttribute("n2", "杭州");
session.setAttribute("s1", "session");
application.setAttribute("a1", "application");
%>
<div>获取对应的属性值</div>
<% String _pageContext_str=(String)pageContext.findAttribute("n2"); %>
<%= pageContext.findAttribute("n2") %> ---》(输出为杭州)
<div>使用EL表达式</div>
<span>pageContext:n1:<%= _pageContext_str %></span> ---》(输出为杭州)
</body>
</html>
pageContext引入和跳转到其他资源
pageContext类中定义个一个forward方法(用来跳转页面)和两个include方法(用来引入页面)来分别简化和替代RequestDispacher.forward和include方法
方法接受的资源如果以"/"开头,"/"代表当前web应用
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<!-- 使用pageContext的forward方法跳转到Servlet》pageContext/forward -->
<% pageContext.forward("/pageContext/forward"); %>
<!-- 使用pageContext.forward来代替RequestDispatcher.forward(relativeUrlPath) -->
<!-- 使用pageContext.getRequest().getRequestDispatcher("/url/**").forward(request,response) -->
</body>
</html>
@WebServlet("/pageContext/forward")
public class PageContextForward extends HttpServlet {
private static final long serialVersionUID = 1L;
public PageContextForward() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("name", "高硕");
request.getRequestDispatcher("/WEB-INF/business/first.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
pageContext.forward('/url/**')这种写法用来简化代替pageContext.getRequest.getRequestDispatcher("/url/**").forward(request,response)
但是在实际开发中使用pageContext.forward('/url/**')跳转的不多,因为这样就在jsp页面中嵌入了java代码,一般使用<jsp:forward标签>来将请求转发给另外一个请求。
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<jsp:forward page="/pageContext/forward"></jsp:forward>
<body>
<% //pageContext.forward("/pageContext/forward"); %>
<!-- <h1>我的首页</h1> -->
</body>
</html>
exception 对象
exception 对象包装了从先前页面中抛出的异常信息。它通常被用来产生对出错条件的适当响应
jsp jsp九个内置对象的更多相关文章
- Java Web学习总结(16)——JSP的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- Jsp的九个内置对象
一.什么是内置对象?在jsp开发中,会频繁使用到一些对象.例如HttSession,ServletContext,HttpServletRequest.如果我们每次要使用这些对象都去创建这些对象,就会 ...
- java web学习总结(二十五) -------------------JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JavaWeb---总结(十七)JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JavaWeb学习总结(十七)——JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- javaWeb学习总结(8)- JSP中的九个内置对象(4)
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JavaWeb学习 (十六)————JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JavaWeb(十七)——JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JSP学习(三)JSP中的九个内置对象
JSP中的九个内置对象 NO. 内置对象 类型 1 pageContext javax.servlet.jsp.PageContext 2 request javax.servlet.http.Htt ...
- JSP学习 三大指令、九个内置对象、JavaBean、EL表达式
1.page-->最复杂:<%@page language="java" info="xxx"...%> * pageEncoding和con ...
随机推荐
- JavaScript:正则表达式 分组
在现在的我看来,带小挂号的就是分组,嗯. 代码: var reg=/(abc)/; var str="abcdabcdeabcdef"; console.dir(reg.exec( ...
- POJ1061 青蛙的约会(扩展欧几里得)题解
Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事 ...
- 关于java中的类的学习
设计模式应该牵扯到类的分布排列了,尽管现在我只能这么表达. 下面来自段帅发来的视频课程中的整理: 类与类之间的关系 每天进步一点点 类是java程序中最小组成单位,要理解后才可以更能理解类继承,重载, ...
- 【TCP/IP详解 卷一:协议】第十九章 TCP的交互数据流
19.1 引言 前一章我们介绍了TCP连接的建立与释放:三握四挥,以及状态转移图. TCP报文段分为:交互数据,以及成块数据(下一章介绍). 交互数据:例如telnet,ssh,这种类型的协议在大多数 ...
- HDU 2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=2243 题意: 给出m个模式串,求长度不超过n的且至少包含一个模式串的字符串个数. 思路: 如果做过poj2778 ...
- Win10重命名文件夹导致资源管理器卡顿的解决办法
我本机使用的是 Win10 1607,不清楚是因为什么原因导致重命名文件夹时资源管理器会被卡死,找了很长时间终于找到了解决办法,现在我把步骤粘出来以便后续遇到相同问题的朋友能及时解决. 其实操作很简单 ...
- c++ 匹配相邻元素相等的元素(adjacent_find)
#include <iostream> // cout #include <algorithm> // adjacent_find #include <vector> ...
- html js 捕捉鼠标右键事件,按下滚轮事件,左键点击事件
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 解决“centos 下bash: g++: 未找到命令...”
简单测试一个C++的“Hello World”,发现报错:“bash: g++: 未找到命令...”,因为没有安装编译器G++:然后就百度,出现一大堆的解决办法,什么“sudo apt-get ins ...
- 雷林鹏分享:C# 枚举(Enum)
C# 枚举(Enum) 枚举是一组命名整型常量.枚举类型是使用 enum 关键字声明的. C# 枚举是值数据类型.换句话说,枚举包含自己的值,且不能继承或传递继承. 声明 enum 变量 声明枚举的一 ...