九大内置对象
内置对象(又叫隐含对象,有9个内置对象):不需要预先声明就可以在脚本代码和表达式中随意使用
JSP中九大内置对象为:
- pageContext 页面上下文对象 类型 javax.servlet.jsp.PageContext 作用域 Page
- request 请求对象 类型 javax.servlet.ServletRequest 作用域 Request
- response 响应对象 类型 javax.servlet.SrvletResponse 作用域 Page
- session 会话对象 类型 javax.servlet.http.HttpSession 作用域 Session
- application 应用程序对象 类型 javax.servlet.ServletContext 作用域 Application
- out 输出对象 类型 javax.servlet.jsp.JspWriter 作用域 Page
- config 配置对象 类型 javax.servlet.ServletConfig 作用域 Page
- exception 例外对象 类型 javax.lang.Throwable 作用域 page
- page 页面对象 类型javax.lang.Object 作用域 Page
1)pageContext
①javax.servlet.jsp.PageContext(抽象类)类型,pageContext 对象直译时可以称作“页面上下文”对象,代表的是当前页面运行的一些属性。此对象提供自身和其他3个作用域层次的属性查询和修改能力,同时可以获取其他8个内置对象。它也提供了转发请求到其它资源和包含其他资源的方法:该对象的方法都是抽象方法。作用域为page(页面执行期)。
②常用的方法有 :findAttribute、getAttribute、getAttributesScope 和getAttributeNamesInScope,一般情况下pageContext对象用到得也不是很多,只有在项目所面临的情况比较复杂的情况下,才会利用到页面属性来辅助处理。
2)request
①javax.servlet.ServletRequest的子类型,equest 对象代表的是来自客户端的请求,例如我们在FORM表单中填写的信息等,封装了由WEB浏览器或其它客户端生 成地HTTP请求的细节(参数,属性,头标和数据等),是最常用的对象。作用域为request(用户请求期)。
②常用的方法有:getParameter、getParameterNames 和getParameterValues等,通过调用这几个方法来获取请求对象中所包含的参数的值,方法可查看API。
3)response
①javax.servlet.ServletResponse的子类型,response 对象代表的是对客户端的响应,此对象封装了返回到HTTP客户端的输出,向页面作者提供设置响应头标和状 态码的方式。经常用来设置HTTP标题,添加cookie,设置响应内容的类型和状态,发送HTTP重定向和编码URL等。作用域为page(页面执行期)。
②也就是说可以通过response 对象来组织发送到客户端的数据。但是由于组织方式比较底层,所以不建议普通读者使用,需要向客户端发送文字时直接使用。
③常用方法有:sendRedirect、setContentType、encodeRedirectURL、addHeader、addCookie、getWriter等
4)session
①avax.servlet.http.HttpSession类型,主要用于跟踪对话。HttpSession是一个类似哈希表的与单一WEB浏览器会话相关的对象,它存在于HTTP请求之间,可以存 储任何类型的命名对象。作用域session(会话期)。若不需要在请求之间跟踪会话对象,可以通过在page指令中指定session="false"。
②session对象代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用,比如在线购物、客户轨迹跟踪等。“session” 对象建立在 cookie的基础上,所以使用时应注意判断一下客户端是否打开了cookie。注意:不要把cookie也理解为九大内置对象之一,cookie主要是实现了session的作用。
概要:
HTTP是无状态(stateless)协议;
Web Server 对每一个客户端请求都没有历史记忆;
Session用来保存客户端状态信息;
由Web Server 写入;
存于客户端;
客户端的每次访问都把上次的session记录传递给Web Server;
Web Server读取客户端提交的session来获取客户端的状态信息。
③常用方法有:getAttribute、setAttribute、removeAttribute、setMaxInactiveInterval、getId、 getValue、 getValueNames和putValue等。
5)application
①javax.servlet.ServletContext类型,作用域是application(整个程序运行期)。它提供了关于服务器版本,应用级初始化参数和应用内资源绝对路径,注册信息的方 式,负责提供应用程序在服务器中运行时的一些全局信息。
②常用的方法有:getMimeType、getRealPath、getResourceAsStream
等。
③获取ServletContext对象的途径:
方法一:通过GenericServlet提供的 getServletContext()
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext3 = getServletContext();
}
方法二:通过ServletConfig提供的getServletContext()
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext2 = getServletConfig().getServletContext();
}
方法三:通过HttpServletRequest获取
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext1 = req.getServletContext();
}
方法四:通过HttpSession获取。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = req.getSession().getServletContext();
}
servlet的环境通过调用getServletConfig().getContext()方法获得。
6)out
①javax.servlet.jsp.JspWriter类型,代表输出流的对象。作用域为page(页面执行期)。
②out 对象代表了向客户端发送数据的对象,与“response” 对象不同,通过“out” 对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过“out” 对象直 接向客户端写一个由程序动态生成HTML文件。常用的方法除了pirnt和println之外,还包括clear、clearBuffer、flush、getBufferSize和getRemaining,这是因 为“out”对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法。
7)config
①javax.servlet.ServletConfig类型,“config” 对象提供一些配置信息,作用域为page(页面执行期)。
②常用的方法有:getInitParameter和getInitParameterNames,以获得Servlet初始化时的参数。
8)exception
①java.lang.Throwable类型,通过JSP错误页面中一个catch块已经益出但没有捕获的java.lang.Throwable的任意实例,传向了errorPage的URI。作用域为page(页面执行期)。
②“exception” 代表了JSP文件运行时所产生的例外对象,此对象不能在一般JSP文件中直接使用,而只能在使用了page指令“<%@ page isErrorPage="true "%>”的JSP文件中使用。
9)page
①java.lang.Object类型,指向页面自身的方式。作用域为page(页面执行期)。
②“page” 对象代表了正在运行的由JSP文件产生的类对象,不建议一般读者使用。
四大作用域
四个域对象:pageContext -- page域
request -- request域
session -- session域
application -- context域
1)域对象作用:保存数据和获取数据,用于数据共享。
2)域对象方法:setAttribute("name",Object) 保存数据
getAttribute("name") 获取数据
removeAttribute("name") 清除数据
3)域对象作用范围:
page域: 只能在当前jsp页面中使用(当前页面)
request域: 只能在同一个请求中使用(转发)
session域: 只能在同一个会话(session对象)中使用(私有的)
context域: 只能在同一个web应用中使用。(全局的)
1、如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。 从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量。
2、如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。就算在这个过程中,使用request对象的getRequestDispatcher("path").forward(request, response)的请求转发方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量,但如果使用了response对象的sendRedirect("path")重定向方式,那这个request域就会失去效果。因为response的sendRedirect("path")重定向方式,跟request对象的getRequestDispatcher("path").forward(request, response)的请求转发方式是有区别的,因为重定向涉及到浏览器的两次请求和两次响应,故第二次的request会将第一次的request域刷新。
3、如果把变量放到session里,就说明它的作用域是session,有效范围是当前会话。所谓当前会话,是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量。
session是在服务器端建立的,浏览器访问服务器会有一个jsessionid,浏览器端通过 jsessionid定位服务器端的session,session的创建和销毁由服务器端控制。当浏览器关闭后,session还存在在服务器端,只不过你新开的浏览器去访问服务器会创建另一个session,这个时候的jsessionid已经不一样了。也就不能访问上一次的哪个session里面的内容了。
那服务器端session如何创建的呢? 普通htm不会创建,jsp默认是创建的,只要你访问一个任何一个jsp就会创建(不过只创建一次),你关闭浏览器从新访问又会创建一个,这些创建的 session由服务器自己控制销毁(tomcat默认为30分钟,web.xml中配置),你也可以在服务器端代码中手动调用session.invalidate()销毁它。
注意:如果JSP没有显示的使用 <%@page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true),这也是JSP中隐含的session对象的来历。
4、如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。与上述三个不同的是,application里的变量可以被所有用户共用。如果用户甲的操作修改了application中的变量,用户乙访问时得到的是修改后的值。
EL表达式获取指定域中变量值: 例如${pageScope.name.value}
域范围: pageScoep / requestScope / sessionScope / applicationScope