之所以叫它们对象,是因为它们是Servlet API接口的实例。而之所以叫内置,是因为jsp完成了对他们的初始化。在jsp对应的servlet文件中的_jspService()方法中这些实例将会被创建。这9个内置对象分别为:application、config、exception、out、page、pageContext、request、response、session。虽然这里也出现了request,page,application,session,但是请千万要弄清楚内置对象与作用域的区别。这些内置对象会在jsp对应的servlet的_jspServiece()方法中首先被初始化,而request,response则是这个方法的形参。剩下的除了exception,都是这个方法的局部变量。之所以这里没有exception,是因为只有当编译指令里面的isErrorPage为true时,才可以使用exception。


applicaton:application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。它的主要方法有:getAttribute(String name)、getAttributeNames()、getInitParameter(String name)、getServerInfo()、setAttribute(String name, Object obj)。其中使用getInitParameter可以读取写在xml文件中的content-param中的变量名字。一般配置数据库都用这种方式。


config:代表当前jsp的配置信息,由于jsp通常无需配置,因此此对象对于servlet用处较大,因为servlet需要在xml中配置。jsp的servletName是jsp。config是ServletConfig接口的实例,用于获取配置参数的方法是getInitParameter(String paramName)。配置Servlet的参数要在xml中的servlet根元素下的init-param中配置。此外还要讲这个servlet映射到config处。


exception:它是Throwable的实例,仅在异常处理界面才有效。在java中利用明为try/catch的关键字来处理异常情况,如果在JSP页面中没有捕捉到的异常,就会生成exception对象,并把这个exception对象传送到在page指令中设定的错误页面中,然后在错误提示页面中处理相应的exception对象。主要方法如下:

  • getMessage():获取异常消息字符串

  • getLocalizeMessage():获取本地化语言的异常错误

  • printStackTrace():显示异常的栈跟踪轨迹

  • toString():返回关于异常错误的简单消息描述

  • fillInStackTrace():重写异常错误的栈执行轨迹

out:用于输出。最常用的为out.print()和out.println()用来输出各种类型的数据。其实所有用到out的地方都可以使用输出表达式,这种方法更加简洁。因为输出表达式在对应的servlet中的本质就是out.write。

  • out.close();关闭流

  • out.getBufferSize();获得当前缓存区大小可以用下面的语句

  • out.getRemaining();要获得剩余缓存区大小。

pageContext:代表页面上下文,主要用于jsp之间的数据共享。它可以访问page、rquest、session、application范围的变量。主要方法如下:

  • getAttribute(String name) 取得page页的属性

  • getAttribute(String name, int scope) 取得指定页的属性,int值可以是PageContext.PAGE_SCOPE、PageContext.REQUEST_SCOPE、PageContext.SESSION_SCOPE、PageContext.APPLICATION_SCOPE

 此外还有与之对应的set方法。它还可以用来获取其他内置对象,方法如下:

  • getRequest() 获取request

  • getResponse() 获取response

  • getServletCongif() 获取config

  • getServletContext() 获取pplication对象

  • getSession() 获取session


request:封装一次用户请求,所有的请求参数都在request对象当中。它是HttpServletRequest接口的实例。每次请求之中,浏览器会自动添加请求头,而请求参数则需要程序员手动添加。发送请求参数有两种方法:get和post。get方法不保险,参数数据量也小。而post方式的参数都在HTML HEADER中,从地址栏不能看到传递的参数。主要方法如下:

  • getParameter(Strings) : 获取表单提交的信息

  • getAttribute(Strings): 获取指定属性的值,如该属性值不存在返回Null

  • setAttribute(String key,Object obj):设置指定名字参数值

还可以通过request对象来代替原来的include与forward动作指令。需要额外注意的是,url必须以/开头具体语法如下:

  • getRequestDispatcher("/a.jsp").include(request, response);

  • getRequestDispatcher("/a.jsp").forward(request, response);


response:代表服务器对客户端的相应,它是HttpServletResponse接口的实例,该接口有一个getOutputStream()方法,可以返回响应输出字节流。大部分时候可以用out来输出相应,但是由于outshiJspWriter的实例,因此是Writer的子类,所以out只能输出字符。当需要输出其他内容时,就必须使用response。除此之外,response还可以用来操作Cookie。

response的另一个好处是重定向,重定向与转发不同,它会丢失request里面的全部信息,相当于再一次请求。HttpServletResponse提供了一个sendRedirect(String path)方法,可以重定向到path资源。适用语法如下:

<%  response.sendRedirect("hello.jsp"); %>

Cookie可以保存一段时间内的信息。使用response的addCookie来操作。增加Cookie时,首先要创建一个Cookie实例,然后设置它的生命周期,最后向response中添加。一个Cookie实例只能存放一条数据。语法如下:

<% Cookie c=new Cookie("username", "Alvin");
       c.setMaxAge(24*360)   
       response.addCookie(c);  
%>

当要访问Cookie的时候,使用request对象的getCookies()方法,注意此方法返回的是一个Cookie类型的数组,还得通过遍历找到所需的数据。


session:此对象表示一次对话,只要浏览器不关闭,就一直存在。开每个浏览器都会在服务器端单独开辟一块内存来构成session。session是HttpSession的实例,有setAttribute与getAttribute方法。切记要谨慎使用session,不要什么都往里面加,否则服务器的内存会炸掉的!只把与对话有关的数据放进去。页面间数据放在application或者request中。session里面的值必须是可序列化的java对象。