JSP中为何内置对象——JSP中九个内置对象使用总结

来源:互联网 发布:淘宝联盟软件下载 编辑:程序博客网 时间:2024/06/05 22:57

简介

在JSP中有九个内置对象:

内置对象

类型

作用域

request

javax.servlet.http.HttpServletRequest

request

response

javax.servlet.http.HttpServletResponse

response

pageContext

javax.servlet.jsp.PageContext

page

session

javax.servlet.http.HtpSession

session

application

javax.servlet.jsp.ServletContext

application

out

javax.servlet.jsp.JspWriter

page

config

javax.servlet.ServletConfig

page

page

java.lang.Object

page

exception

java.lang.Throwable

page

为什么在JSP页面中会有这九个内置对象

要解释清楚为什么在JSP中会有九个内置对象,需要先明白JSP的真实身份是什么。JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计。JSP与Servlet的一个区别在于,Servlet容器必须先把JSP编译成Servlet类,然后才能运行它。JSP的生命周期包含以下阶段:

(1)  解析阶段:Servlet容器解析JSP文件的代码,如果有语法错误,就会向客户端返回错误信息。

(2)  翻译阶段:Servlet容器把JSP文件翻译成Servlet源文件。

(3)  编译阶段:Servlet容器编译Servlet源文件,生成Servlet类。

(4)  初始化阶段:加载与JSP对应的Servlet类,创建其实例,并调用它的初始化方法。

(5)  运行时阶段:调用与JSP对应的Servlet实例的服务方法。

(6)  销毁阶段:调用与JSP对应的Servlet实例的销毁方法,然后销毁Servlet实例。

项目中欢迎页面index.jsp:

<%@ page language="java" contentType="text/html;charset=UFT-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type"content="text/html; charset=UFT-8"><title>Welcome</title></head><body><%=request.getDateHeader("charset") %></body></html>
在Tomcat中发布项目后,可以在Tomcat的工作目录中找到该JSP文件翻译后的index_jsp.java文件以及index_jsp.class文件。可以看到翻译后的Java文件中有这样一段代码:

  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=UFT-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\n");      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTDHTML 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=UFT-8\">\r\n");      out.write("<title>Welcome</title>\r\n");      out.write("</head>\r\n");      out.write("<body>\r\n");      out.print(request.getCharacterEncoding() );      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);    }  }
其中就有九个内置对象,可以看到代码中page对象引用的是关键字this,表示当前类,也就是page 对象代表JSP本身,只有在JSP页面内才是合法的。

再看一下JSP文件翻译后的Java文件,其类声明是:public final class index_jsp extends HttpJspBase implements JspSourceDependent

跟踪HttpJspBase源码立即就能发现,public abstract class org.apache.jasper.runtime.HttpJspBase extendsjavax.servlet.http.HttpServlet,即JSP翻译后的Java类是Servlet的一个子类。可以这样说,JSP是什么与编辑时的文件格式无关,对服务器来说,它就是一个继承了Servlet的Java类,所以JSP的真实身份是一个Servlet。就像是平常使用的框架一样,在编写的时候是各框架中自定义的文件,而在运行的时候,框架会将该文件翻译成服务器支持的文件类型。

观察翻译后的代码不难发现,JSP文件中的代码都在上面的Java方法中,而且都在最外层的try块中,也就是说,内层try块中的异常类对象在外层try块中访问不到,这也就解释了在JSP中我们无法直接使用exception这个内置对象。而其余的内置对象在外层的try块中是可以访问到的,恰如上面分析的那样,剩下的八个内置对象在JSP中是可以直接使用的,证明了JSP中的所有代码在翻译时都嵌入了第一个try块内。现在就可以大致的猜想,由于在翻译后的Servlet中需要使用这九个对象操作客户与服务器之间的信息传递,而JSP文件中的所以在翻译前也就是在编写JSP文件时就已经声明了JSP中的这九个对象,只不过没有显示出来。

内置对象的作用及常用方法

request

request对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。

返回值

方法

说明

Object

getAttribute(String name)

返回指定属性的属性值

String

getCharacterEncoding() 

返回字符编码方式

int

getContentLength()

返回请求字节的长度

String

getContentType()

返回请求页面的MIME类型

String

getParameter(String name)

返回请求中的参数值

String[]

getOarameterValues(String name)

返回请求中集合属性的值

String

getRemoteAddr()

返回发送此请求的客户端IP地址

String

getRemoteHost()

获得请求的主机名

void

setAttribute(String key , Object value)

设置属性的值

String

getProtocol()

返回请求用的协议类型及版本号

response

response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。

返回值

方法

说明

PrintWriter

getWriter()

返回可以向客户端输出字符的一个对象

String

getCharacterEncoding() 

返回字符编码方式

void

addCookie(Cookie cookie)

向客户端保存Cookie

void

sendRedirect(String URL)

页面重定向

void

resp.setCharacterEncoding(charset)

设置响应的字符集,可以解决中文乱码问题

pageContext

pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

pageContext对象是一个强大的对象,在JSP中只要获得了这个对象就可以获得其它的一些内置对象,可以使将下面的代码放到JSP文件中,然后访问该文件,看输出的关于Servlet容器中pageContext对象含有那些方法和属性:

<%Class c =pageContext.getClass();Field[]fs = c.getDeclaredFields();Method[]ms = c.getDeclaredMethods();for(Field f:fs){%> <%=f.getName() %><br/><%}for(Method m:ms){%> <%=m.getName() %><br/><%}%><br/>

session 

是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。

application

application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。

out   out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

config

config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。

page 

page 对象代表JSP本身,只有在JSP页面内才是合法的。

exception

exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

内置对象使用的例子

示例:网页访问次数简单统计

<%int count = session.getAttribute("count")==null?0:(Integer)session.getAttribute("count");count++;session.setAttribute("count" , count);%><p>本次访问次数 <%=count%> 次。</p>

0 0
原创粉丝点击