JSP脚本中常用的内置对象

        JSP脚本中包含9个内置对象,这9个对象都是Servlet API接口的实例,只是JSP规范对它们进行了默认初始化,由JSP页面对应的Servlet的_jspService()方法来创建这些实例,在JSP页面中可以直接使用。
        1 application对象:javax.servlet.ServletContext实例,代表JSP所属的Web应用本身,用于JSP页面,Servlet间交换信息,通常使用setAttribute(String attName, String attValue)方法设置某一属性名称及其值到aplication对象中,在其它地方如Servlet或JSP页面中调用getAttribute(String attrName)方法访问已设置到application对象中的指定属性名的属性值。
        2 config对象:javax.servlet.ServletConfig实例,代表JSP的配置信息。常用方法有getInitParameter(String paraName)和getInitParameternames()等方法。JSP配置信息通常配置在web.xml文件中,以<context-param>标签表示一条配置信息,子标签<param-name>表示配置项的名称,子标签<param-value>表示配置项的值。例如如下示例配置了数据库驱动,配置名称为driver,值为com.mysql.jdbc.Driver

	<context-param>
		<param-name>driver</param-name>
		<param-value>com.mysql.jdbc.Driver</param-value>
	</context-param>

        3 exception对象:java.lang.Throwable实例,代表其它页面中的异常和错误,只有当页面是错误处理页面,即页面的编译指令page的isErrorPage属性为true时,才初始化该对象,才可使用该对象,普通页面不初始化该对象,不可以使用该对象。通常调用getMessage()方法获取错误信息,调用printStackTrace()方法打印调用栈。
        4 out对象:javax.servlet.jsp.JspWriter实例,代表JSP页面输出流,用于输出内容,形成HTML页面。   
        5 page对象:页面对应的Servlet类实例,代表该页面本身,也就是Servlet中的this,能用page的地方就可使用this。
        6 pageContext对象:javax.servlet.jsp.PageContext实例,代表JSP页面上下文,使用该对象可以访问页面中的共享数据,常用方法有getServletContext()和getServletConfig()等。
        7 request对象:javax.servlet.http.HttpServletRequest实例,该对象封装一次请求,客户端的请求参数都封装在该对象里,获取客户端参数时必须使用该对象,常用的方法有getParameter(String paramName),getParameterValues(String paramName),setAttribute(String attrName, Object attrValue),getAttribute(String attrName)和setCharacterEncoding(String env)等。
        8 response对象:javax.servlet.http.HttpServletResponse实例,代表服务器对应客户端的响应,通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应,而response对象常用于重定向,常用的方法有getOutputStream(),sendRedirect(java.lang.String location)等。
        9 session对象:javax.servlet.http.HttpSession实例,代表一次会话。当客户端浏览器与站点建立连接时,会话开始;当客户端关闭浏览器时,会话结束。通常调用setAttribute(String attrName, Object attrValue)设置属性值,调用getAttribute(String attrName)获取属性值。
        以下面的HelloWorld.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>HelloWorld</title>
</head>
<body>
	Hello, World
</body>
</html>

        其对应的Servlet文件HelloWorld_jsp.java内容片段如下:



//此处省略部分代码
public final class HelloWorld_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

	//此处省略部分代码
	//_jspService方法是响应用户请求的方法
  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;
	//此处省略部分代码 
  }
}

        HelloWorld_jsp.java页面就是HelloWorld.jsp经过编译后生成的java文件,也就是Servlet,几乎所有JSP页面经过编译后都有如上结构,从代码中可以看出,request,response这两个对象是_jspService()方法的形参,当Web服务器,如Tomcat调用该方法时会初始化这两个对象,而page,pageContext,application,
config,session,out都是_jspService方法的局部对象,由该方法完成初始化。这些对象要么是_jspService方法的形参,要么是该方法的局部对象,而JSP页面中的jsp脚本都会被解释成_jspService方法的执行代码,所以可以在jsp代码中直接使用这些对象。
        从上面的Servlet代码中可以看出没有Exception对象,因为这个页面是普通页面,如果页面最开始的page指令中把isErrorPage属性设置为true,生成的Servlet代码中就会有Exception对象,读者可自己验证。

转载于:https://my.oschina.net/u/2420118/blog/747389

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值