当前位置 : 主页 > 编程语言 > java >

JSP的九大内置对象

来源:互联网 收集:自由互联 发布时间:2021-06-25
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

  如果有同名属性,小域的属性会优先于大域,所以一般往域中存储信息,都会带上,域的名字,防止重名问题,

网友评论