JSP中存在9个内置对象,不需要我们声明就可以直接使用了,我们来看经过服务器编译过后的JSP的源码,就可以很容易理解,这个9个对象了: public void _jspService(final javax.servlet.http.HttpS
JSP中存在9个内置对象,不需要我们声明就可以直接使用了,我们来看经过服务器编译过后的JSP的源码,就可以很容易理解,这个9个对象了:
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;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;
} 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);
}
}
- javax.servlet.jsp.JspWriter out,这个对象用来向客户端输出响应内容,等同于respnse.getPrintWriter();
- final javax.servlet.ServletConfig config;这个对在Servlet中对应一段Servlet的配置,所以在这里对应一段JSP的配置,JSP也可以在web.xml文件中进行配置
- final java.lang.Object page = this;当前对象,基本没啥用,可以直接在JSP中使用this.XXX
- javax.servlet.http.HttpSession session,从这里可以看出,客户端直接请求JSP,就会默认创建session
- exception(Throwable),只有在错误页面才可以使用这个对象
- HttpServletRequest request,在_jspService方法中出现
- HttpServletResponse response,在_jspService方法中出现
- ServletContext application;一个项目一个的域对象
- PageContext pageContext,页面上下文对象,
PageContext对象
我们都知道Servlet中有三大域对象,而JSP中有四大域对象,PageContext就是JSP独有的,同样PageContext也有如下方法:
- setAttribute();
- getAttribute()
- removeAttribute();
每个页面都有一个pageContext对象,这个域可以在当前JSP页面和当前JSP中使用的标签中共享数据,页面可以给标签传递数据,标签也可以使用这个这个域给页面传输数据
同时pageContext可以代理其他域对象,
- pageContext.setAttribute("aaa","AAA",PageContext.SESSION_SCOPE);
- pageContext.setAttribute("aaa","AAA",PageContext.REQUEST_SCOPE);
- pageContext.setAttribute("aaa","AAA",PageContext.APPLICATION_SCOPE);
重载的方法可以在其他域中存储信息,同样的getAttribute()和removeAttribute();也有重载的方法,可以代理其他域对象
PageContext还可以直接获取其他8个对象,它的一系列getXXX方法,将返回对应的内置对象,上面的代理其他域的功能也要先获取特定的域,才能代理
pageContext.getServletContext();
pageContext.getSession();
pageContext.getRequest();
pageContext.getResponse();
pageContext.getServletConfig();
pageContext.getOut();
pageContext.getException();
pageContext.getPage();
PageContext还可以进行全域查找findAttribute(),这个方法会在四个域中查找属性,依此从小到大:
pageContext--->request--->session--->application
如果有同名属性,小域的属性会优先于大域,所以一般往域中存储信息,都会带上,域的名字,防止重名问题,