Java

来源:互联网 发布:好看的步兵番号知乎 编辑:程序博客网 时间:2024/06/09 16:28

JSP有9个内置对象: 
- request:封装客户端的请求,其中包含来自GET或POST请求的参数; 
- response:封装服务器对客户端的响应; 
- pageContext:通过该对象可以获取其他对象; 
- session:封装用户会话的对象; 
- application:封装服务器运行环境的对象; 
- out:输出服务器响应的输出流对象; 
- config:Web应用的配置对象; 
- page:JSP页面本身(相当于Java程序中的this); 
- exception:封装页面抛出异常的对象。

补充:如果用Servlet来生成网页中的动态内容无疑是非常繁琐的工作,另一方面,所有的文本和HTML标签都是硬编码,即使做出微小的修改,都需要进行重新编译。JSP解决了Servlet的这些问题,它是Servlet很好的补充,可以专门用作为用户呈现视图(View),而Servlet作为控制器(Controller)专门负责处理用户请求并转发或重定向到某个页面。基于Java的Web开发很多都同时使用了Servlet和JSP。JSP页面其实是一个Servlet,能够运行Servlet的服务器(Servlet容器)通常也是JSP容器,可以提供JSP页面的运行环境,Tomcat就是一个Servlet/JSP容器。第一次请求一个JSP页面时,Servlet/JSP容器首先将JSP页面转换成一个JSP页面的实现类,这是一个实现了JspPage接口或其子接口HttpJspPage的Java类。JspPage接口是Servlet的子接口,因此每个JSP页面都是一个Servlet。转换成功后,容器会编译Servlet类,之后容器加载和实例化Java字节码,并执行它通常对Servlet所做的生命周期操作。对同一个JSP页面的后续请求,容器会查看这个JSP页面是否被修改过,如果修改过就会重新转换并重新编译并执行。如果没有则执行内存中已经存在的Servlet实例。我们可以看一段JSP代码对应的Java程序就知道一切了,而且9个内置对象的神秘面纱也会被揭开。

JSP页面:

<%@ page pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";%><!DOCTYPE html><html>  <head>    <base href="<%=basePath%>">    <title>首页</title>    <style type="text/css">        * { font-family: "Arial"; }    </style>  </head>  <body>    <h1>Hello, World!</h1>    <hr/>    <h2>Current time is: <%= new java.util.Date().toString() %></h2>  </body></html>
对应的Java代码:

/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/7.0.52 * Generated at: 2014-10-13 13:28:38 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 index_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<java.lang.String, java.lang.Long> _jspx_dependants;    private javax.el.ExpressionFactory _el_expressionfactory;    private org.apache.tomcat.InstanceManager _jsp_instancemanager;    public java.util.Map<java.lang.String, java.lang.Long> 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 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;            out.write('\r');            out.write('\n');            String path = request.getContextPath();            String basePath = request.getScheme() + "://"                    + request.getServerName() + ":" + request.getServerPort()                    + path + "/";// 以下代码通过输出流将HTML标签输出到浏览器中            out.write("\r\n");            out.write("\r\n");            out.write("<!DOCTYPE html>\r\n");            out.write("<html>\r\n");            out.write("  <head>\r\n");            out.write("    <base href=\"");            out.print(basePath);            out.write("\">\r\n");            out.write("    <title>首页</title>\r\n");            out.write("    <style type=\"text/css\">\r\n");            out.write("    \t* { font-family: \"Arial\"; }\r\n");            out.write("    </style>\r\n");            out.write("  </head>\r\n");            out.write("  \r\n");            out.write("  <body>\r\n");            out.write("    <h1>Hello, World!</h1>\r\n");            out.write("    <hr/>\r\n");            out.write("    <h2>Current time is: ");            out.print(new java.util.Date().toString());            out.write("</h2>\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 {                        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);        }    }}

原创粉丝点击