本身想把九个内置对象放到Listener里面写,但是这样写的话再看起来比较麻烦,还是单独拿出来做一篇文章吧。
JSP内置对象:何为内置?就是不用我们创建,JSP它本身里面就有这些对象。
有人会问,内置对象是在那个过程被创建的?是怎么被创建的?拿着这个问题,我查了些资料,进行总结,口说无凭,眼见为实:
首先,我在web工程里面添加一个nzdx.jsp页面:
然后我用SearchEverything去搜索,nzdx_jsp.java和nzdx_jsp.class文件,发现没有这两个文件,如图:
注:SearchEverything能够快速在本地搜索指定名称的文件,这个软件挺好用的。
然后,我启动tomcat,并用浏览器访问该页面,且用SearchEverything搜索jsp转换成java和class的文件,得到下图:
我们发现,我们的jsp页面转换成了java文件和class文件,这个过程是怎么进行的呢?下面上个图,来解释该过程(图是盗的,对不起原作者,嘿嘿)
接下来看一下,生成的java文件,了解一下其中内容:
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.0.15
* Generated at: 2017-07-19 02:26:31 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class nzdx_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}
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;
try {
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("\r\n");
out.write("å置对象
\r\n");
out.write("\r\n");
out.write("\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
代码中可以看到web容器(tomcat)帮我们将JSP转换成Servlet,再将Servlet转换成java文件。
转换成的java文件中存在init、Destory、Service这三个方法,你是否想起来我们学习Servlet里面的方法呢,这三个方法是不是和那三个方法相同?
你猜的没错,就是相同的。
接下来我们再看内置对象,下面红色标记的代码就是从上面生成的代码中截取的,我们所要知道的内置对象就是在这个时候被声明的,他们是9个内置对象中的6个:
pageContext,session,application,config,out,page(红色代码块)
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;
在上述代码中可以看到,接下来的try语句块里面对其进行了赋值(蓝色代码块)
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
final java.lang.Object page = this;
这时候你会奇怪,剩下的三个呢?
剩下的三个分别是HttpServletRequest和HttpServletResponse,ServletException,其中2个是final声明的形参,1个是thorw后的代码(紫色代码块)
final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException
熟悉的request和response回来了,我们知道他们分别属于HttpServletRequest类和HttpServletResponse类,知道Httpservlet这个类的,就知道这两个内置对象那里来的,不明白的请学习Servlet。
而exception这个对象,我们必须将jsp文件的page中指定isErrorPage为true时,才可以使用。
什么意思?意味着在JSP页面指定这个属性为true后,该jsp页面在转换成java文件时才会自动为我们定义exception这个对象,大家可以自定义个jsp文件,将其errorPage指定为true,再找到对应的java文件,便可以发现exception这个对象了。
还是老话,耳听为虚,眼见为实:
再看生成的java文件,我将其和之前生成的nzdx_jsp.java进行对比:
我们发现,多出来了一个exception对象,至此,所有的内置对象的创建和复制我们都大概了解了一遍,每个对象的具体功能和详细描述如下,这些内容网上千篇一律,我就随便找了一篇copy了一下。
注意:通常所说的ServletContext其实和Jsp页面中引用的application是一回事,只是一个用于JSP页面,一个用于java文件。
下
1、request对象
request 对象是 javax.servlet.httpServletRequest类型的对象。
该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。
request对象的作用域为一次请求。
2、response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。
response对象也具有作用域,只在JSP页面内有效。
3、session对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。
session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
4、application对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。
与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
5、out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。
待数据输出完毕后,要及时关闭输出流。
6、pageContext 对象
pageContext 对象的作用是取得任何范围的参数,可以获取 JSP页面的out、request、reponse、session、application 等对象。
pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
7、config 对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。
当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。
开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
9、exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。
excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。
在Java程序中,可以使用try/catch关键字来处理异常情况;
在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。