JSP中为何内置对象——JSP中九个内置对象使用总结
2016-04-13 16:17
423 查看
简介
在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>
相关文章推荐
- Javascript 点击div之外任何地方,隐藏div
- WinServer-IIS-js无法加载问题
- JavaScript获取HTML元素样式的方法(style、currentStyle、getComputedStyle)
- JavaScript函数的参数设置默认值
- JavaScript初学者应注意的七个细节
- json get请求 img src 带 中文 解决
- JavaScript 运行机制详解:再谈Event Loop
- Async详解之一:流程控制
- 原生js设置,获取,删除cookie demo
- JavaScript 开发进阶:理解 JavaScript 作用域和作用域链
- JS 异步纵向编程
- JSP关于Frameset的简单用法
- 关于 Servlet.service() for servlet jsp threw exception的问题
- Extjs4.2或以上 使用自定义事件时报错问题
- js 小知识
- JavaScript call
- 面向对象js
- JSON 解析库的使用 :Gson 和 fast-json比较
- javascript window.onload addLoadEvent(func)
- JS学习2(基础知识)