jsp 内置对象和域-百家乐凯发k8
jsp 脚本中包含 9 个内置对象,这 9 个内置对象都是 servlet api 接口的实例,只是 jsp 规范对它们进行了默认的初始化(由 jsp 页面对应的 servlet 的 _jspservice() 方法来创建这些实例),即它们已经是对象了,可以直接使用。
9 个内置对象依次如下:
application javax.servlet.servletcontext 的实例,该实例代表 jsp 所属的 web 应用本身,可用于 jsp 页面或者在 servlet 之间交换信息。常用方法有 getattribute(string attname)、setattribute(string attname, string attvalue) 和 getinitparameter(string paramname) 等。 config javax.servlet.servletconfig 的实例,该实例代表该 jsp 配置信息。常用方法有 getinitparameter(string paramname) 和 getinitparameters() 等方法。事实上,jsp 页面通常无须配置,也就不存在配置信息,因此,该对象更多地在 servlet 中有效。 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.jsp.pagecontext 的实例,该对象代表该 jsp 页面的上下文,使用该对象可以访问页面中的共享数据。常用的方法有 getservletcontext() 和 getservletconfig() 等。 request javax.servlet.http.httpservletrequest 的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象里。这是一个常用对象,获取客户端请求必须使用该对象。常用的方法有 getparameter(string paramname)、 getparametervalues(string paramname)、 setattribute(string attrname, object attrvalue)、 getattribute(string attrname) 和 setcharacterencoding(string env) 等。 response javax.servlet.http.httpservletresponse 的实例,代表服务器对客户端的响应。通常很少使用该对象直接响应,而是使用 out 对象,除非需要生成非字符响应,response 对象常用于重定向。常用的方法有 getoutputstream()、 sendredirect(java.lang.string location) 等。 session javax.servlet.http.httpsession 的实例,该对象代表一次会话。当客户端浏览器与站点建立连接时,会话开始;当客户端关闭浏览器时,会话结束。常用的方法有 getattribute(string attrname)、 setattribute(string attrname, object attrvalue) 等。打开 tomcat\work\cataline\localhost\…\jsp,其中几乎所有的 jsp 页面编译后 servlet 类都有如下所示结构:
public final class index_jsp extends org.apache.jasper.runtime.httpjspbase implements org.apache.jasper.runtime.jspsourcedependent { 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; 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"); pagecontext = _jspxfactory.getpagecontext(this, request, response, null, false, 8192, true); _jspx_page_context = pagecontext; application = pagecontext.getservletcontext(); config = pagecontext.getservletconfig(); out = pagecontext.getout(); _jspx_out = out; // ... } } }
说明:
通过上面的代码可以发现 jsp 内置对象的实质:它们要么是 _jspservice() 方法的形参,要么是 _jspservice() 方法的局部变量,所以我们直接在 jsp 脚本(脚本对应于 servlet 的 _jspservice() 方法部分)中调用这些对象,无须创建它们。 上面的代码中并没有 exception 内置对象,只有当页面的 page 指令的 iserrorpage 属性为 true 时,才可使用 exception 对象,也就是说:只有异常处事页面对应的 servlet 时才会初始化 exception 对象。注意:
由于 jsp 内置对象都是在 _jspservice() 方法中完成初始化的,因此在 jsp 脚本、jsp 输出表达式中使用这些内置对象,不能在 jsp 声明中使用它们,否则,系统将提示找不到这些变量。
application 对象代表 web 应用本身,因此使用 application 来操作 web 应用相关数据。application 对象通常有如下两个作用:
在整个 web 应用的多个 jsp、servlet 之间共享数据。 访问 web 应用的配置参数2.1 让多个 jsp、servlet 共享数据
application 通过 setattribute(string attrname, object value) 方法将一个值设置成 application 的 attrname 属性,该属性的值对整个 web 应用有效,因此该 web 应用的每个 jsp 页面或 servlet 都可以访问该属性,访问该属性的方法为 getattribute(string attrname)。
在 jsp 中可直接通过 application 内置对象在 jsp 脚本或者表达式中进行赋值和取值:
<% application.setattribute("name", "jsp") %> <%=application.getattribute("name")%>
在 servlet 中,必须先获取 servletcontext 对象,才能进行赋值和取值:
servletcontext sc = getservletcontext(); // servletcontext sc = getservletconfig().getservletcontext(); sc.setattribute("name", "servlet"); sc.getattribute("name");
建议:
虽然使用 application(即 servletcontext 实例)可以方便多个 jsp、servlet 共享数据,但不要仅为了 jsp、servlet 共享数据就将数据放入 application 中。由于 application 代表整个 web 应用,所以通常只应该把 web 应用的状态数据放入 application 里。
2.2 获取 web 应用配置参数
因为 application 对象代表 web 应用本身,所以可用于获取 web 应用的初始化配置参数。
在 jsp 页面中的访问方式如下:
<% string name = application.getinitparameter("name"); %>
在 web.xml 文件的根元素(web-app)下配置 web 应用的初始化参数:
......name web
config 对象代表当前 jsp 配置信息,但 jsp 页面通常无须配置,也就不存在配置信息。此对象在 jsp 页面中比较少用,此处简单作说明,但在 servlet 中则用处相对较大,详见 servlet。
在 jsp 获取配置参数:
<%=config.getservletname()%> <%=config.getinitparameter("name")%>
在 web.xml 中为 jsp 配置初始化参数:
config /config.jspname jsp config
注意:
由于对 jsp 进行了如上配置(相当于将 jsp 作为 servlet 进行配置),所以,此 jsp 页面存在两种访问方式:
不过要想在 jsp 页面中通过 config 内置对象获取在 web.xml 中配置的初始化参数,必须使用第二种方式。
exception 对象是 throwable 的实例,代表 jsp 脚本中产生的错误和异常,是 jsp 页面异常机制的一部分。
在 jsp 脚本中无须处理异常,即使该异常是 checked 异常。事实上,jsp 脚本包含的所有可能出现的异常都可交给错误处理页面处理。
打开普通的 jsp 页面生成的 servlet 类如下:
public void _jspservice(final javax.servlet.http.httpservletrequest request, final javax.servlet.http.httpservletresponse response) throws java.io.ioexception, javax.servlet.servletexception { // 内置对象定义,init(),destory()... try { // 内置对象初始化,所有 jsp 脚本、静态 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); } }
说明:
从上面的代码可以看出,jsp脚本和静态 html 部分都将转换成 _jspservice() 方法中的执行性代码,且已经处于 try-catch 块中,一旦捕获到 jsp 脚本异常,并且 _jsp_page_context 不为 null,就会以由该对象来处理异常。 _jsp_page_context 对异常的处理:如果该页面的 page 指令指定了 errorpage,则将请求 forward 到 errorpage 属性指定的页面,否则使用系统页面来输出异常信息。 由于只有 jsp 脚本、表达式才会对应于 _jspservice() 方法里的代码,所以,对于 jsp 声明部分的 checked 异常仍需要用户手动处理。在 jsp 的异常处理机制中,一个异常处理页面可以处理多个 jsp 页面脚本部分的异常,异常处理页面通过 page 指令的 errorpage 属性确定。在异常处理页面中,需要通过 page 指令中指定 iserrorpage 属性为 true,否则 jsp 的异常处理机制无法找到 errorpage 属性指定的异常处理页面,该页面中也无法访问 exception 内置对象。
在 jsp 的异常处理页面,可以使用如下方法获取异常信息:
异常类型:<%=exception.getclass()%> 异常信息:<%=exception.getmessage()%>
out 对象代表一个页面输出流,通常用于在页面上输出变量值及常量。一般在使用输出表达式的地方,都可以使用 out 对象来达到同样的效果,<%=...%>
的本质就是 out.write(…)。建议使用输出表达式,更加简洁。
在 jsp 页面中使用 out 对象的语法如下:
<% out.write("abc"); %>
这个对象代表页面上下文,该对象主要用于访问 jsp 之间的共享数据。使用 pagecontext 对象可以访问 page、request、session 和 application 范围的变量。
pagecontext 是 pagecontext 实例,它提供了如下两个方法来访问 page、request、session 和 application 范围的变量:
getattribute(string name):取得 page 范围内的 name 属性getattribute(string name, int scope):取得指定范围内的 name 属性,其中 scope 可以是如下 4 个常量值:
pagecontext.page_scope(1):对应于 page 范围 pagecontext.request_scope(2):对应于 request 范围 pagecontext.session_scope(3):对应于 session 范围 pagecontext.application_scope(4):对应于 application 范围与 getattribute() 方法相对应,pagecontext 也提供了 2 个对应的 setattribute() 方法,用于将指定变量的值存入指定的范围内:
setattribute(string name, object value) setattribute(string name, object value, int scope)在 jsp 页面中使用 pagecontext 对象进行相关范围内的赋值与取值语法:
<% pagecontext.setattribute("username", "administrator", pagecontext.session_scope); pagecontext.getattribute("username", pagecontext.session_scope); %>
pagecontext 还可获取其他内置对象,方法如下:
servletrequest getrequest() servletresponse getresponse() servletconfig getservletconfig() serveltcontext getserveltcontext() httpsession getsession()因此一旦在 jsp、servlet 编程中获取了 pagecontext 对象,就可以通过它获取其他内置对象。
每个 request 对象封装着一次用户请求,并且所有的请求参数都被封装在 request 对象中。该对象通常有如下几个作用:
获取请求参数 用于操作 request 范围的属性 执行 forward 或 include7.1 获取请求参数
request 是 httpservletrequest 接口的实例,它提供了如下几个方法来获取请求参数:
string getparameter(string paramname):获取 paramname 请求参数的值 map getparametermap():获取所有请求参数名和参数值所组成的 map 对象 enumeration getparameternames():获取所有请求参数所组成的 enumeration 对象 string[] getparametervalues(string name):paramname 请求参数的值,当该请求参数有多个值时,该 方法返回多个值所组成的数组。httpservletrequest 提供了如下方法来访问请求头:
string getheader(string name):获取指定请求头的值 enumeration getheadernames():获取所有请求头的名称 enumeration getheaders(string name):获取指定请求头的多个值 int getintheader(string name):获取指定请求头的值,并将该值转为整数值7.2 操作 request 范围的属性
httpservletrequest包含如下两个方法,用于设置和获取 request 范围的属性:
setattribute(string attname, object attvalue):将 attvalue 设置成 request 范围的属性 object getattribute(string attname):获取 request 范围的属性7.3 执行 forward 或 include
除了 jsp 提供的 forward 和 include 动作指令,request 也可以执行 forward 和 include。
httpservletrequest 类提供了一个 getrequestdispatcher(string path) 方法,其中 path 就是希望 forward 或者 include 的目标路径,该方法返回 requestdispatcher,该对象提供了如下两个方法:
forward(servletrequest request, servletresponse response):执行 forward include(serveltrequest request, servletresponse response):执行 includeresponse 对象代表服务器对客户端的响应。通常情况下,在 jsp 页面中直接使用 out 对象来输出响应信息即可,但 out 是 writer 的子类,是一个字符输出流,对于非字符内容,就必须使用 response 作为输出响应。除此之外,还可以使用 response 来重定向请求以及用于向客户端增加 cookie。
8.1 response 响应生成非字符响应
response 是 httpservletresponse 接口的实例,该接口提供了一个 getoutputstream() 方法,该方法返回响应的输出字节流。
8.2 重定向
httpservletresponse 提供了一个 sendredirect(string path) 方法,该方法用于重定向到 path 资源,即重新向 path 资源发送请求。
8.3 增加 cookie
cookie 通常用于网站记录客户的某些信息,存放客户端机器上,直到超出 cookie 的生命期限。客户端浏览器完全可以禁用 cookie,所以使用 cookie 必须客户端浏览器支持才行。
response 对象提供如下方法增加 cookie:
void addcookie(cookie cookie)session 对象代表一次用户会话。一次用户会话是从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止。session 范围内的属性可以在多个页面的跳转之间共享,一旦关闭浏览器,即 session 结束,session 范围内的属性将全部丢失。
session 对象是 httpsession 的实例,httpsession 有如下两个常用的方法:
setattribute(string attname, object attvalue):设置 session 范围内 attname 属性的值为 attvalue getattribute(string attname):返回 session 范围内 attname 属性的值在 jsp 九大内置类中存在四大域对象,分别是:
page 域:pagecontext 对象 request 域:request 对象 session 域:session 对象 application 域:application 对象域对象主要是用于 jsp 和 servlet 的数据共享。