Jsp内置对象

来源:互联网 发布:发展下线系统源码 编辑:程序博客网 时间:2024/06/08 03:40

JSP的九大内置对象

网上关于jsp内置对象的文章太多了,个人以为很多都没有自己实践过,所以鉴于自己曾经在很不理解jsp对象的作用的惨痛教训下,首先要明白的就是怎么查看值栈了,这里请大家看看网上关于jsp的视频,然后在jsp页面中写上debug标签。多读里面的内容,一定要深入的理解jsp背后的Servlet,这里呢,先不说Servlet了,请不要听别人说Servlet是很难的,只要你明白它只是一个容器而已就可以了,要想明白里面的机制,请参考张孝祥老师关于Servlet的视频,一定要看看。

所以要有一个概念,所有的jsp页面都将成为.java文件被执行,当然它们都是Servlet。通过下面的这张表你也可以知道,大多数的内置对象都是Servlet,那么你是不是就要问,这些内置对象怎么会能直接用呢?答案其实很简单,因为jsp页面这个"Servlet"是已经初始化好了很多其它的Servlet的容器,你就可以认为jsp页面是Servlet的封装版,简化版,它拥有Servlet的一些功能,但是比Servlet简单,你可以知道它能够做很多事情,比如加一些网页元素,那么你可以想想,Servlet在背后一定都实现了这些功能。所以这个时候就不要看到了Servlet就头晕。唉,想几个月前,我学的真是相当的痛苦,网上看别人的例子,没有注释,也没有关于Servlet的解释,一提到Servlet就是一大堆很长的变量和方法,看着都怕,其实现在想想,也没有那么难,虽然也学的不怎么样,但是归根结底,Servlet在以后的web程序中用的并不多,但是它的一些思想和运行方式是非常值得深究的,所以即使不知道怎么写Servlet相关的程序,也一定要明白原理,因为以后的struts2框架就是Servlet的升级版。当然了,只是行为方式比较类似,但是更加博大精深。

唉不说了,回归主题吧!

首先我要声明这里用的最多的就是request和session了,request用于页面之间传递参数,session也有这个功能,不过作用范围要大,一般我们在判断一个用户登录后保存用户登录状态采用的就是session,也就是实现登录和注销功能。

 

内置对象类型作用域requestjavax.servlet.http.HttpServletRequestrequestresponsejavax.servlet.http.HttpServletResponseresponsepageContextjavax.servlet.jsp.PageContextpagesessionjavax.servlet.http.HtpSessionsessionapplicationjavax.servlet.jsp.ServletContextapplicationoutjavax.servlet.jsp.JspWriterpageconfigjavax.servlet.ServletConfigpagepagejava.lang.Objectpageexceptionjava.lang.Throwablepage
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)
getInitParameternames()
事实上,JSP页面通常无需配置,也就不春在配置信息因此该对象更多在Servlet中有效

exception:java.lang.Throwable的实例
该实例代表其他页面中的异常和错误,只有
当页面是错误处理页面,即编译指令page的isErrorPage属性为true时该对象才可以使用
常用方法
getMessage()
printStackTrace()


out:javax.servlet.jsp.JspWriter的实例,该实例代表JSP页面的输出流,用于
输出内容,形成HTML

page:代表该页面本身,通常没有太大用处,也就是Servlet中的this
其类型就是生成的Servlet.

pageContext:javax.servlet.jsp.PageContext的实例
该对象代表 JSP 页面上下文,(本人一直对CONTEXT译作上下文
很感冒,觉得实际上应该翻译成环境)
使用该对象可以访问页面中的共享数据,常用的方法有
getServletContext()
getServletConfig()

request:javax.servlet.http.HttpServletRequest的实例该对象封装了一次请求,
客户端的请求参数都被封装到该对象里,用于获取客户端请求参数必须使用该对象。
常用方法
getParameter(String paramName)
getParameterValues(String paramName)
setAttribute(String attributeName,Object attributeValue)
getAttribute(String attributeName)
setCharacterEncoding(String env)

response:javax.servlet.http.HttpServletResponse的实例 
代表服务器对客户端的响应,通常也很少适用该对象直接响应,
输出响应适用out对象,而response对象常用于重新定向
常用方法
sendRedirect(java.lang.String location)等
 
session:javax.servlet.http.HttpSession的实例
该对象代表一次会话,常用方法
getAttribute(String attName)
setAttribute(String attName,String attValue)

 

最后我得说明一下这里request,session,application的声明周期了

 

request的生命周期:当从一个jsp发出一个request,即表明了这个request生命周期的开始,当到达action之后一般有两种处理request的方式    

1:为request.getDispatcher.forward

2:是response.sendRedirect.

对于1:该request的生命周期将会继续延续下去,当采用forward如果到达另一个JSP页面,那么之前从第一个JSP页面中发送出来的request的消息将仍然存在,新的页面同样能够取得该request里所包含的一些信息,比如之前的JSP发送request中所包含的参数信息.事实上,它们是同一个request.

对于2:该request的生命周期将结束。

  对于request,request信息的传递,只有setAttribute()这一个方法,该方法将设置一个Object对象到request.但是,如果当一个request是从jsp中发出,包含的信息段为param1=test这样的方式,那么只能通过getParameter()得到,getAttribute()是得不到param1value.再次,对于JSPEL表达式,${}这中方式只能得到setAttribute中的值,因此当从一个JSP发送request到达action并且被forward到新的JSP中时,如果想在该JSP中取得JSP发送时的参数信息需要写为这种形式:${param.patam1}.

 

session的生命周期:是指客户端与服务器连接到断开连接的周期就是session的生命周期。

 

application的生命周期:application是与服务器同步的,服务器是开着的application就存在,服务器关了application就关了。