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.Driverhtml
<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页面为例:java
<%@ 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内容片断以下:mysql
//此处省略部分代码 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对象,读者可本身验证。web