Jsp页面的九大隐式对象

来源:互联网 发布:网站性能优化技术 编辑:程序博客网 时间:2024/05/20 14:26

Jsp页面的九大隐式对象

问题1:哪九大隐式对象?

Request,  Response, Session, Config, Application, Page ,PageContext, Out, Exception

问题2:为什么会有九大隐式对象?

这与访问Jsp页面时,服务器做出响应的原理相关——任何响应都将被编译成一个Servlet,最终将结果返回给浏览器。访问Jsp页面时,首先将Jsp编译成一个Java文件(Servlet),并将页面内容放在_jspService()方法中,此方法中将会用到九大隐式对象,而这九大隐式对象是定义在_jspService()方法中,供使用。所以在Jsp页面无需再定义这九大隐式对象,而是可以直接拿来使用。

具体实现:

<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%><%     String data="aaa";    request.setAttribute("data",data);//直接使用request和out对象%>out.write(request.getAttribute("data"))//向浏览器输出aaa


具体介绍:

Request,Session,Application(即ServletContext),PageContext已在http://blog.csdn.net/edson121/article/details/73702278介绍了,此处不再重复,需要补充的一点是PageContext对象还有一个重要的方法:PageContext.findAttribute(属性名);它表示将在page,request,session,application域中查找该属性,若没有则返回”“空字符串,而非null。

① Out对象

Out对象属于JspWriter类,它是带有缓冲区的PrintWriter;也就是说数据会写到缓冲区,而非直接写给浏览器,只有数据缓冲区满了或整个Jsp页面结束时才会写给浏览器。
例如:

<%@page language="java" import="java.util.*" "pageEncoding="UTF-8"%><html>    <head></head>    <body>        out.println("aaa")        response.getWriter().write("bbb");//显示的是bbbaaa    </body></html>

也可以通过Jsp页面的Page指令中buffer属性来设置out 对象的缓冲,buffer=none|8kb|sizekb 设为none则数据不缓存,直接写给浏览器。

② Exception对象

这个对象只有在Jsp页面的Page命令中将isErrorPage属性设为true时才会在编译完成的Java文件中定义。

例:<%@page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="true"%>编译后的Servlet中显示这样一行代码:java.lang.Throwable exception=org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);if (exception != null) { response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);    }
③ Config对象

Config对象即ServletConfig类,该类用来保存相关的配置信息;例如:数据库用户名、密码等,也可以自己配置需要的参数,配置的信息作用与某一个Servlet,而前面介绍过的ServletContext即Application对象配置信息的方法作用于整个应用程序。
配置方法:

<init-param>    <param-name>password</param-name>    <param-value>123456</param-value></init-param>

获取配置信息:
通过ServletConfig对象获取,在Jsp页面中可直接使用Config对象的getInitParameter(name)方法获取。

④ Response对象

即响应内容,熟悉HTTP协议中的响应头基本上就掌握该对象了,需要注意的是response在输出时有两种输出方式:Response.getOutputStream()和Response.getWriter()方法;这两种方法不能在一次请求中同时调用。

⑤ Page对象:相当于Java程序中的this,表示当前Jsp页面。

查看Jsp页面被编译出来的Servlet的方法:

C:\apache-tomcat-7.0.78\apache-tomcat-7.0.78\work\Catalina\localhost\Jsp\org\apache\jsp在work目录下:

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)        throws java.io.IOException, javax.servlet.ServletException {    final javax.servlet.jsp.PageContext pageContext;    javax.servlet.http.HttpSession session = null;    java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);    if (exception != null) {      response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);    }    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;      out.write("\r\n");      out.write("\r\n");      out.write("\r\n");      out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");      out.write("<html>\r\n");      out.write("  <head>\r\n");      out.write("    \r\n");      out.write("\r\n");      out.write("  </head>\r\n");      out.write("  \r\n");      out.write("  <body>\r\n");      out.write("   出错了!出错了!出错了!出错了!出错了!出错了!出错了!出错了!出错了!出错了!出错了!出错了!出错了!出错了!出错了!出错了!出错了!出错了!出错了!<br>\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);    }  }

下一篇将简单总结一下重定向和请求转发的区别。

原创粉丝点击