1. 内置对象简介
-
Request对象:该对象存储客户端的请求信息,主要用于接受通过Http协议传送到服务器的数据。
-
Response对象:该对象主要负责将JSP页面响应给客户端,对客户端的请求做出应答。
-
Session对象:会话对象由服务器创建,服务器会为每一个请求的用户分别创建一个,主要用于保存用户的信息跟踪用户的操作状态。当打开浏览器第一次请求时就会生成,直到关闭或者间隔多久Session才会失效。
-
application对象:本质是ServletContext对象,是整个程序的上下文对象。能够获取当前Web下的所有Servlet、资源…拥有最高的权限。
-
pageContext对象:当前页面的上下文对象,所有获取 JSP 页面的out、request、reponse、session、application 等对象。
-
page对象:代表当前页面只有在JSP页面内才是合法,page隐含对象本质上包含当前Servlet接口引用的变量类似于Java编程中的 this 指针。
-
out对象:用于将数据输出到前端响应给用户,并且管理应用服务器上的输出缓冲区。
-
config对象:本质是ServletConfig对象,用于管理当前Web项目下web.xml中的所有配置信息。
-
exception对象:作用是显示异常信息,当页面发生错误爆出的一些状态码错误都是由它负责的,比如常见的500错误,exception对象会再页面中显示异常的堆栈调用信息。
2. 内置对象原理分析
JSP页面的本质还是一个个的Servlet页面,每一个JSP页面在服务器第一次访问时会进行转为Java文件Servlet,之后进行编译生成.class文件。因此JSP页面的对象几乎都来自于Servlet。编译后的.class文件的_Jspservice方法是整个JSP页面的核心,里面可以看到所有的内置对象。
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
//方法头中有 request response exception
if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
final java.lang.String _jspx_method = request.getMethod();
if ("OPTIONS".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
return;
}
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}
}
final javax.servlet.jsp.PageContext pageContext; //pagecontext
javax.servlet.http.HttpSession session = null; //session
final javax.servlet.ServletContext application; //ServletContext
final javax.servlet.ServletConfig config; //ServletConfig
javax.servlet.jsp.JspWriter out = null; //out输出
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;charset=UTF-8");
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("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>Title</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write(" hello jsp\r\n");
out.write("</body>\r\n");
out.write("</html>\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);
}
}
final javax.servlet.http.HttpServletRequest request final javax.servlet.http.HttpServletResponse response java.io.IOException, javax.servlet.ServletException
上面这三个对象在public void _Jspservice方法头中可以看到
另外6个在_Jspservice方法内可以看到。