JavaWeb之JSP 页面的9个隐含对象

 

    隐含对象:没有声明就可以使用的对象

 

public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;

	//...
	
	//使用  <% %> 编写的代码在此位置. 可以用到 request, response, pageContext, session
	//application, config, out, page ,exception 这 9 个隐含对象.  
}

 

 

1) request:HttpServletRequest 的一个对象。

2) response:HttpServletResponse 的一个对象(在 JSP 页面中几乎不会调用 response 的任何方法)。

3) pageContext:页面的上下文,是 PageContext 的一个对象。可以从该对象中获取到其他 8 个隐含对象。也可以从中获取到当前页面的其他信息(学习自定义标签时使用它) 。

4) session:代表浏览器和服务器的一次会话,是 HttpSession 的一个对象。

5) application:代表当前 WEB 应用。是 ServletContext 对象。

6) config:当前 JSP 对应的 Servlet 的 ServletConfig 对象(几乎不使用)。若需要访问当前 JSP 配置的初始化参数,需要通过映射的地址才可以。

7) out:JspWriter 对象,调用 out.println() 可以直接把字符串打印到浏览器上。

8) page:指向当前 JSP 对应的 Servlet 对象的引用,但为 Object 类型,只能调用 Object 类的方法(几乎不使用) 。

9) exception:在声明了 page 指令的 isErrorPage="true" 时,才可以使用。

    注:在声明 page 指令的 isErrorPage="true"的方式为在页面添加<%@ page isErrorPage="true" %>。

 

10) pageContext, request, session, application(对属性的作用域的范围从小到大)

 

out隐式对象

 

在JSP页面中应使用out隐式对象来向客户端发送文本形式的实体内容。 

out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。 

JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。 

JSP页面中的out隐式对象相当于插入到ServletResponse.getWriter方法返回的PrintWriter对象前面的缓冲包装类对象。

只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:

设置page指令的buffer属性关闭了out对象的缓存功能

写入到out对象中的内容充满了out对象的缓冲区

整个JSP页面结束

 

out隐式对象的工作原理图 

 



  

 

pageContext对象 

 

1) pageContext对象简介 

 

pageContext对象封装了当前JSP页面的运行信息,它提供了返回JSP页面的其他隐式对象的方法。 

PageContext类中定义了一个setAttribute方法来将对象存储进pageContext对象内部的一个HashMap对象中,同时也定义了一个getAttribute方法来检索存储在该HashMap对象中的对象。 

PageContext类除了可以存储和检索自身中的属性对象外,还定义了可以存储和检索其他域范围内的属性对象的方法。  

 

2) 获得其他隐式对象 

 

getException方法返回exception隐式对象 

getPage方法返回page隐式对象

getRequest方法返回request隐式对象 

getResponse方法返回response隐式对象 

getServletConfig方法返回config隐式对象

getServletContext方法返回application隐式对象

getSession方法返回session隐式对象 

getOut方法返回out隐式对象  

 

3) 引入和跳转到其他资源 

 

PageContext类中定义了一个forward方法和两个include方法来分别简化和替代RequestDispatcher.forward方法和RequestDispatcher.include方法的调用:

public void forward(java.lang.String relativeUrlPath)

throws javax.servlet.ServletException,java.io.IOException

public void include(java.lang.String relativeUrlPath)

throws javax.servlet.ServletException,java.io.IOException

public void include(java.lang.String relativeUrlPath,boolean flush)

throws javax.servlet.ServletException,java.io.IOException

传递给这些方法的资源路径都只能是相对路径,如果路径以“/”开头,表示相对于当前WEB应用程序的根目录,否则,表示相对于当前JSP所映射到的访问路径。

 

4) 访问各个域范围中的属性

 

在application、session、request、pageContext对象中都可以调用setAttribute方法和getAttribute方法来设置和检索各自域范围内的属性。

存储在application对象中的属性可以被同一个WEB应用程序中的所有Servlet和JSP页面访问。

存储在session对象中的属性可以被属于同一个会话的所有Servlet和JSP页面访问。

存储在request对象中的属性可以被属于同一个请求的所有Servlet和JSP页面访问,例如使用PageContext.forward和PageContext.include方法连接起来的多个Servlet和JSP页面。    

存储在pageContext对象中的属性仅可以被当前JSP页面的当前响应过程中调用的各个组件访问,例如,正在响应当前请求的JSP页面和它调用的各个自定义标签类。 

PageContext类中还提供了对各个域范围的属性进行统一管理的方法,以简化对各个域范围内的属性的访问。 

 

常量

PageContext.APPLICATION_SCOPE

PageContext.SESSION_SCOPE

PageContext.REQUEST_SCOPE

PageContext.PAGE_SCOPE

 

setAttribute方法 

public void setAttribute(java.lang.String name,java.lang.Object value)

public void setAttribute(java.lang.String name, java.lang.Object value,int scope) 

 

getAttribute方法

public java.lang.Object getAttribute(java.lang.String name)

public java.lang.Object getAttribute(java.lang.String name,int scope)

 

removeAttribute方法 

public void removeAttribute(java.lang.String name)

public void removeAttribute(java.lang.String name,int scope)

 

getAttributeNamesInScope方法 

findAttribute方法

 

 

注册与配置JSP页面的访问路径

 

<servlet>
	<servlet-name>testJspServletCfg</servlet-name>
	<jsp-file>/jsp/testJspServletCfg.jsp</jsp-file>
	<load-on-startup>1</load-on-startup >
</servlet>

<servlet-mapping>
	<servlet-name>testJspServletCfg</servlet-name>
	<url-pattern>/testJspServletCfg</url-pattern>
</servlet-mapping>

 

 示例

 

1. 编写jsp文件

 

<%@ 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>GetCurrentDate.jsp</title>
</head>
<body>
    <%
    //测试URL:http://localhost:8080/org.rabbitx.web.jsp/jspPageHiddenObjectServlet?requestPara=10086
    
        //隐含对象:没有声明就可以使用的对象
        
        //request:HttpServletRequest 的一个对象。
  		String name = request.getParameter("requestPara");
  		out.println(name);
  		out.println("<br/>");
  		
  		//response:HttpServletResponse 的一个对象(在 JSP 页面中几乎不会调用 response 的任何方法)。
  		out.println(response instanceof HttpServletResponse);
  		out.println("<br/>");
  		
  		//pageContext:页面的上下文,是 PageContext 的一个对象。可以从该对象中获取到其他 8 个隐含对象。
  		//也可以从中获取到当前页面的其他信息(学习自定义标签时使用它) 。
  		ServletRequest req = pageContext.getRequest();
  		out.println(req == request);
  		out.println("<br/>");
  		
  		//session:代表浏览器和服务器的一次会话,是 HttpSession 的一个对象。
  		out.println(session.getId());
  		out.println("<br/>");
  		
  		//application:代表当前 WEB 应用。是 ServletContext 对象。
  		out.println(application.getInitParameter("applicationPara"));
  		out.println("<br/>");
  		
        //config:当前 JSP 对应的 Servlet 的 ServletConfig 对象(几乎不使用)。若需要访问当前 JSP 配置的初始化参数,需要通过映射的地址才可以。
        out.println(config.getInitParameter("configPara"));
        out.println("<br/>");
        
        //out:JspWriter 对象,调用 out.println() 可以直接把字符串打印到浏览器上。
  		out.println("<b>out:JspWriter对象</b>"); 
  		out.println("<br/>");

  		
  		//page:指向当前 JSP 对应的 Servlet 对象的引用,但为 Object 类型,只能调用 Object 类的方法(几乎不使用) 。
  		out.println(page);
  		out.println("<br/>");
  		out.println(this);
  		out.println("<br/>");
  		
  		//exception:在声明了 page 指令的 isErrorPage="true" 时,才可以使用。
        //out.println(exception.toString());
    %>
    
</body>
</html>

 

2. 配置web.xml文件

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0">

    <!--/JspPages/jspPageHiddenObject.jsp页面的相关配置-->
    
    <context-param>
        <param-name>applicationPara</param-name>
        <param-value>12306</param-value>    	
    </context-param>
    
    <servlet>
    	<servlet-name>jspPageHiddenObjectServlet</servlet-name>
    	<jsp-file>/JspPages/jspPageHiddenObject.jsp</jsp-file>
    	<init-param>
    		<param-name>configPara</param-name>
            <param-value>10010</param-value>  
    	</init-param>
    	<load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
    	<servlet-name>jspPageHiddenObjectServlet</servlet-name>
    	<url-pattern>/jspPageHiddenObjectServlet</url-pattern>
    </servlet-mapping>


    <!--默认页面配置-->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

 

 

3. 浏览器输入http://localhost:8080/org.rabbitx.web.jsp/jspPageHiddenObjectServlet?requestPara=10086测试

 



 

JSP与Servlet的应用比较 

 

JSP是一种以产生网页显示内容为中心的WEB开发技术,它可以直接使用模版元素来产生网页文档的内容。 

JSP页面的源文件要比Servlet源文件简单,并且JSP页面的开发过程要比Servlet的开发过程简单得多。

JSP引擎可以对JSP页面的修改进行检测,并自动重新翻译和编译修改过的JSP文件。

JSP技术是建立在Servlet技术基础之上的,所有的JSP页面最终都要被转换成Servlet来运行。 

在大型WEB应用程序的开发中,Servlet与JSP经常要混合使用,各司其职,Servlet通常用作控制组件,并处理一些复杂的后台业务,JSP则作为显示组件。

一次响应过程可以划分成几个功能模块来协同完成,首先由Servlet完成流程控制和业务处理,并将结果数据存储在request或session域中,然后将请求转发(forward)到JSP页面,再由JSP页面从request或session域中取出结果数据并完成响应内容的输出。通过这种方式实现业务逻辑与显示内容的分离,从而将应用程序开发者和网页作者的工作分离。  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值