小言_互联网的博客

JavaWeb核心技术系列教程(22)——JSP隐式对象

189人阅读  评论(0)

C语言自学完备手册(33篇)

Android多分辨率适配框架

JavaWeb核心技术系列教程

HTML5前端开发实战系列教程

MySQL数据库实操教程(35篇图文版)

推翻自己和过往——自定义View系列教程(10篇)

走出思维困境,踏上精进之路——Android开发进阶精华录

讲给Android程序员看的前端系列教程(40集免费视频教程+源码)


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

概述

JSP隐式对象又被称为JSP内置对象。JSP隐式对象由JSP引擎自动创建,我们可以在JSP页面中直接使用这些对象。

演示示例

JSP当中有哪些隐式对象呢?它们又是在何时创建的呢?为了加深对于JSP隐式对象的理解,我们准备如下示例:

示例描述

使用JSP指令指定当JSP页面发生错误时跳转到指定的错误页面。

项目结构

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%-- 利用page指令的errorPage指定处理错误的页面 --%>
<%@ page errorPage="error.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index</title>
</head>
<body>
	<%
		int i = 9527 / 0;
	%>
</body>
</html>

error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%-- 利用page指令的isErrorPage指定该JSP页面为处理错误的页面  --%>
<%@ page isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>error</title>
</head>
<body>
   <h2 align="left" style="color: red;">本文作者:谷哥的小弟</h2>
   <h2 align="left" style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
   <h3>抱歉,您所访问的页面出错,我们正在紧急修复中,请稍等.....</h3>
	<%
		exception.printStackTrace(response.getWriter());
	%>
</body>
</html>

部署测试

部署该Web应用至服务器后在浏览器中输入访问地址:http://localhost:8080/Jsp07/index.jsp

JSP内置对象详解

在刚才的示例中error.jsp页面被JSP引擎翻译成为error_jsp.java文件。

在此,我们重点关注error_jsp.java,其源码如下:

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/9.0.19
 * Generated at: 2019-10-04 08:31:01 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 error_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  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 static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  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;
    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');
      out.write('\n');
      out.write("\r\n");
      out.write("\r\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
      out.write("<title>error</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("   <h2 align=\"left\" style=\"color: red;\">本文作者:谷哥的小弟</h2>\r\n");
      out.write("   <h2 align=\"left\" style=\"color: red;\">博客地址:http://blog.csdn.net/lfdfhl</h2>\r\n");
      out.write("   <h3>抱歉,您所访问的页面出错,我们正在紧急修复中,请稍等.....</h3>\r\n");
      out.write("\t");

		exception.printStackTrace(response.getWriter());
	
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } 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);
    }
  }
}

在此,我们将关注点置于error_jsp.java中的_jspService( )方法,其核心源码如下:

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;
      
      //......
    } catch (java.lang.Throwable t) {
      //......
    } finally {
      //......
    }
  }

在_jspService( )方法的输入参数和方法体中,共涉及JSP九大内置对象。

  • javax.servlet.http.HttpServletRequest类型的request
  • javax.servlet.http.HttpServletResponse类型的response
  • javax.servlet.http.HttpSession类型的session
  • javax.servlet.ServletContext类型的application
  • javax.servlet.ServletConfig类型的config
  • java.lang.Throwable类型的exception
  • java.lang.Object类型的page
  • javax.servlet.jsp.JspWriter类型的out
  • javax.servlet.jsp.PageContext类型的pageContext

这九大内置对象中的request、response、session、application、config、exception我们在之前的教程中已经讲授过;故,在此,不再赘述。接下来,我们来学习其它另外三个未接触过的内置对象。

page

page对象表示当前JSP页面。

out

out对象用于向客户端发送文本内容。out对象是通过调用pageContext对象的getOut( )方法返回的,该对象的作用和用法与ServletResponse.getWriter( )方法返回的PrintWriter对象非常相似,都是用来向客户端发送文本内容。不同的是JSP页面中的out对象的类型为JspWriter,它相当于一种带缓存功能的PrintWriter。

pageContext

pageContext是JSP中非常重要的内置对象,它代表当前JSP页面的运行环境。在此,介绍pageContext对象的常见用途。

利用pageContext获取其它内置对象

在JSP页面中可通过pageContext获取其它的八个内置对象,方法如下:

  • public abstract javax.servlet.jsp.JspWriter getOut( )
  • public abstract java.lang.Object getPage( )
  • public abstract javax.servlet.http.HttpSession getSession( )
  • public abstract javax.servlet.ServletRequest getRequest( )
  • public abstract javax.servlet.ServletResponse getResponse( )
  • public abstract java.lang.Exception getException( )
  • public abstract javax.servlet.ServletConfig getServletConfig( )
  • public abstract javax.servlet.ServletContext getServletContext( )
利用pageContext存取数据

pageContext对象不仅可以获取其它内置对象,还可作为域(容器)存储数据。在学习具体方法之前,我们先来了解一下四个常用的域对象。

按照域范围从小至大依次是:

javax.servlet.jsp.PageContext类型的pageContext,也称为page域。
存储在该域的数据仅可被当前页面访问;其作用范围很小,使用较少。

javax.servlet.http.HttpServletRequest类型的request,也称为request域
存储在该域的数据在同一次请求(转发)内有效。

javax.servlet.http.HttpSession类型的session,也称为session域
存储在该域的数据它存放的数据在一次会话中有效;其作用范围较广,使用较多。

javax.servlet.ServletContext类型的application,也称为application域
存储在该域的数据在整个应用范围内都有效,其作用范围太大不利于数据隔离,应尽量少使用。

在PageContext中使用四个整数常量代表这四个域对象,按照域范围从小至大依次是:

public static final int PAGE_SCOPE = 1;

public static final int REQUEST_SCOPE = 2;

public static final int SESSION_SCOPE = 3;

public static final int APPLICATION_SCOPE = 4;

我们不但可使用pageContext对象在pageContext中即page域存储数据,还可以在其它指定的域进行数据的存储。pageContext对象与数据存储相关常用方法如下:

public abstract void setAttribute(String name, Object value)
将数据保存至pageContext中即page域。

public abstract void setAttribute(String name, Object value, int scope)
将数据保存至指定域。

public abstract java.lang.Object getAttribute(String name)
从pageContext中即page域获取数据。

public abstract java.lang.Object getAttribute(String name, int scope)
从指定域获取数据。

public abstract void removeAttribute(String name)
从pageContext中即page域移除数据。

public abstract void removeAttribute(String name, int scope)
从指定域移除数据。

public abstract java.lang.Object findAttribute(String name)
依次从page域、request域、session域、application域中查找数据直至找到为止;若在各域中均未找到则返回null。

关于PageContext的数据存储,请看如下示例。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>PageContext</title>
	</head>
	<body>
		<h2 align="left" style="color: red;">本文作者:谷哥的小弟</h2>
		<h2 align="left" style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
		<%
	      //将数据保存至request域
	      pageContext.setAttribute("name", "lucy", PageContext.REQUEST_SCOPE);
	      //利用pageContext对象的findAttribute( )查找数据
	      String name=pageContext.findAttribute("name").toString();
	      //将数据返回至客户端浏览器
	      out.println(name);
	    %>
	</body>
</html>

利用pageContext包含其它资源和跳转到其它资源

PageContext类中定义了一个include( )方法和两个forward( )方法用于包含其它资源和跳转到其它资源。这三个方法可简化和替代RequestDispatcher.forward( )方法和RequestDispatcher.include( )方法。请注意,在这三个方法中使用的路径均为相对路径;且相对路径常以/开头表示相对于当前Web应用程序的根目录。


转载:https://blog.csdn.net/lfdfhl/article/details/102081558
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场