9个内置对象概述
application:javax.servlet.ServletContext实例,代表JSP所属的WEB应用本身,可以用于JSP页面或在Servlet之间的信息交换
常用方法:getAttribute、setAttribute、getInitParameter
config:javax.servlet.servletConfig实例,该实例代表该JSP的配置信息。实际上,JSP页面无需配置,所以更多在Servlet上有效
常用方法:getInitParameter、getInitParameternames
exception:java.lang.Throwable实例,代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令page的isErrorPage属性为true时,才可使用
常用方法:getMessage、printStackTrace
out: javax.servlet.jsp.JspWriter实例,代表JSP页面的输出流,用于输出内容,形成HTML页面
page:代表页面本身,也就是Servlet中的this,其类型就是生成Servlet类,能用page就可以用this
pageContext: javax.servlet.PageCOntext实例,代表该JSP页面上下文,使用该对象可以访问页面中的共享数据。
常用方法:getServletContext、getServletConfig
request:javax.servlet.http.HttpServletRequest实例,该对像封装了一次请求,客户端的请求参数都在该对象中,获取客户端请求参数必须使用该参数
常用方法:getParameter、getParameterValues、setAttribute、getAttribute、setCharacterEncoding
response: javax.servlet.http.HttpServletResponse实例,代表服务器对客户端的相应,通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应
常用方法:getOutputStream、sendRedirect
session:javax.servlet.http.HttpSession实例,代表一次会话。当客户端浏览器与站点建立连接,会话开始;当客户端关闭浏览器,会话结束
常用方法:getAttribute、setAttribute
- 这9个内置对象都是ServletAPI接口的实例,只是JSP规范对它们进行了默认初始化(由_jspService()方法来创建这些实例)。
打开任一JSP页面对应的Servlet文件,可以看到如下代码:
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=UTF-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;
- 通过以上代码可以看出JSP内置对象的实质:要么是_jspServic()方法的形参,要么是_jspService()方法的局部变量,所以可以直接在JSP脚本调用这些对象,无须创建它们。
- 上述代码之所以没有exception内置对象,是因为只有异常处理页面对应的Servlet才会初始化exception对象。
application对象
- application对象代表Web应用本身,因此使用application来操作Web应用相关数据。application对象通常有如下两个作用:
1.在整个Web应用的多个JSP、Servlet之间共享数据。
2.访问Web应用的配置参数。作用一:让多个JSP、Servlet共享数据
- 通过setAttribute(String attrName,Object value)方法设置属性,该属性的值对整个Web应用有效,访问属性的方法为getAttribute(String attrName)。
- setAttribute()方法示例
<!-- 将i值自加后放入application的变量内 --> <% application.setAttribute("counter",String.valueOf(++i)); %>
- 可以把application理解成一个Map对象,任何JSP、servlet都可以把某个变量放入application中保存,并为之指定一个属性名;而该应用的其他JSP、Servlet就可以根据属性名来得到这个变量。
out对象
- 在JSP页面中通过out对象写入数据,相当于将数据插入到JspWriter对象的缓冲区中,只有调用了ServletResponse.getWriter()方,缓冲区的数据才能真正写入到Servlet引擎所提供的缓存区中,如:
<!-- JSP页面内容 -->
<body>
<% out.write("aaaa"); %>
<% out.write("bbbb"); %>
<% response.getWriter().write("cccc"); %>
</body>
运行结果:
- 从上面可以看出,写在后面的cccc在运行后却到了前面,这是因为直到JSP页面结束,out对象输入缓冲区的数据才真正写入到Servlet引擎提供的缓冲区中,而response.getWriter().write()则是直接将内容写到Servlet引擎提供的缓冲区中,Servlet引擎按照缓冲区数据存放的顺序输出内容。
pageContext对象
- 它代表当前JSP的运行环境,使用pageContext对象可以调用JSP的其它8个内置对象(方法:pageContext.getSession()、pageContext.getRequest()、pageContext.getPage()...),这样当传递了一个pageContext对象就可以获取其它8个内置对象了。
- pageContext是一个域对象,所以可以用来存储数据。如下例:
<!-- JSP页面内容 -->
<body>
<%pageContext.setAttribute("name", "张三");
pageContext.getRequest().setAttribute("name", "李四");
pageContext.setAttribute("name", "王二",pageContext.SESSION_SCOPE);
String pageName = (String)pageContext.getAttribute("name");
String reqName = (String)pageContext.getAttribute("name", pageContext.REQUEST_SCOPE);
String sessName = (String)session.getAttribute("name");
%>
<%=pageName %></br>
<%=reqName %></br>
<%=sessName %>
</body>
运行结果: