jsp内置对象
JSP 有以下九种内置对象,包括:
request,请求对象
response,响应对象
pageContext,页面上下文对象
session,会话对象
application,应用程序对象
out,输出对象
config,配置对象
page,页面对象
exception,异常对象
从本质上讲,JSP的这些内置对象其实都是由特定的Java类所产生的,在服务器运行时根据情况自动生成,一下是内置对象相对应的类的对应表,在jsp中可以直接使用对象的实例,内置对象 服务器帮忙创建好了。
“request” 对象代表的是来自客户端的请求,例如我们在FORM表单中填写的信息等,是最常用的对象 。 关 于 它 的 方 法 使 用 较 多 的 是getParameter 获得对应name的参数值、 getParameterNames 获得参数名的enumeration 通过调用 hasMoreElements()和nextElement()来遍历整个集合 和getParameterValues()返回string数组,通过调用这几个方法来获取请求对象中所包含的参数的值
<body>
<%
Enumeration e = request.getParameterNames();
while(e.hasMoreElements())
{
System.out.println(e.nextElement());
}
String[] values = request.getParameterValues("age");
for(String value : values)
{
System.out.println(value);
}
String value = request.getParameter("age");
System.out.println(value);
%>
“response” 对象代表的是对客户端的响应,也就是说可以通过“response”对象来组织发送到客户端的数据。但是由于组织方式比较底层,所以不建议普通读者使用,需要向客户端发送文字时直接使用“out” 对象即可。
“pageContext” 对象直译时可以称作“页面上下文”对象,代表的是当前页面运行 的 一 些 属 性 , 常 用 的 方 法 包 括findAttribute 、 getAttribute 、getAttributesScope 和getAttributeNamesInScope,一般情况下“pageContext” 对象用到得也不是很多,只有在项目所面临的情况比较复杂的情况下,才会利用到页面属性来辅助处理。一般Servlet容器会使用该对象。
“session” 对象代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用,比如在线购物、客户轨迹跟踪等。
HTTP是无状态(stateless)协议;
Web Server 对每一个客户端请求都没有历史记忆;
Session用来保存客户端状态信息;
void setAttribute(String name,Object value)
Binds an object to this session, using the name specified. If an object of the same name is already bound to the session, the object is replaced.
Object getAttribute(String name)
Returns the object bound with the specified name in this session, or null
if no object is bound under the name.
<HTML>
<BODY>
<%
String Name=request.getParameter("UserName");
session.setAttribute("LogName", Name);
%>
你的名字"<%=Name%>"已经写入session
<br>
<a href='./check_session.jsp'>check</a>
</BODY>
</HTML>
<HTML><BODY>
<%
String yourName=(String)session.getAttribute("LogName");
if (yourName= =null)
{
%>您还未登录
<%
}else
{
%>
"<%=yourName%>"已经登录
<%
}
%>
</BODY></HTML>
“out” 对象代表了向客户端发送数据的对象,与“response” 对象不同,通过“out” 对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过“out” 对象直接向客户端写一个由程序动态生成HTML文件。常用的方法除了print和println之外,还包括clear、clearBuffer 、 flush 、 getBufferSize 和getRemaining,这是因为“out” 对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法。
“config” 对象提供一些配置信息,常用的方法有getInitParameter和getInitParameterNames,以获得Servlet初始化时的参数。
“page” 对象代表了正在运行的由JSP文件产生的类对象,不建议一般读者使用。
“exception” 对象则代表了JSP文件运行时所产生的异常对象,此对象不能在一般JSP文件中直接使用 , 而只能在使用了 “ <%@ page isErrorPage="true "%>”的JSP文件中使用
要想 getAttribute 必须先放进去 setAttribute
request 的 setAttribute 与 getAttribute 方法一般都是成对出现的,首先通过 setAttribute 方法设置属性与属性值,然后通过getAttribute 方法根据属性获取到与该属性对应的对象值(获取到之后一般都需要进行向下类型转换,将属性值转换为真正的对象)setAttribute与 getAttribute方法都是在服务器端内部执行的,客户端不知道服务器端是否执行过这两个方法。
request对象内数据的存活范围就是在request对象的存活范围内,当客户端向服务器端发送一个请求,服务器向客户端返回一个响应后,该请求对象就被销毁了;之后再向服务器端发送新的请求时,服务器会创建新的 request 对象,该request 对象与之前的request 对象没有任何关系,因此也无法获得在之前的 request 对象中所存放的任何数据。
session对象内数据的存活范围也就是session对象的存活范围(?只要浏览器不关闭,session对象就会一直在?) ,因此在同一个浏览器窗口中,无论向服务器端发送多少个请求,session 对象只有一个。
application(应用对象) :存活范围最大的对象,只要服务器没有关闭,application对象中的数据就会一直存在。在整个服务器运行过程当中,application 对象只有一个。
request、 session以及application这3个对象的范围是逐个增加的:
equest只在一个请求的范围内; ?session 是在浏览器窗口的范围内?;application则是在整个服务器的运行过程中。
关于session作用范围(网站找了一些资料)
:
那服务器端session如何建的呢?普通htm不会创建,jsp默认是创建的,只要你访问一个任何一个jsp就会创建(不过只创建一次),你关闭浏览器从新访问又会创建一个,这些创建的 session由服务器自己控制销毁,你也可以在服务器端代码中销毁。
session其实简单:
先request.getsession(),当已有一个session与前request相关时就返回对这个session的引用,当没有时就生成一个.一个session在server通过一个sessionid来标识的。也就是说在一个server是不会有两个相同sessionid的 session.
那么session为什么会和cookie扯在一起呢?
正如我所说对於一个session来说它的sessionid就是其身份的标识。若我们将这个sessionid保存到用户端,当同一个会话的后序请求来时都将这个sessionid放在request 的header中(也就是我们说的cookie)这样不就可以来验证这个request是否与之前的request是同一个会话了吗!
什么是会话呢?
我们可以通俗一点理解。只要你的browers不关我们就称这一系列的request与response为一个会话。一断你close就称这个会话已结束。虽然会话结束但并不代表你的session就被destroy.因为session是存活在server上的。它的生命完全由server来主宰(web.xml中的设定).
虽然你的session还存活在server上但你已无法再取得它。因为j2ee的api只给我们一种方法来取得与当前会话相关的session的引用:request.getsession() or reqeust.getsession(boolean)
这也就是为会什么会有"当浏览器关session就结束"这个错误的说法了!
请求转发
String username = req.getParameter("username");
req.setAttribute("username", username);
RequestDispatcher rd = req.getRequestDispatcher("myResult.jsp");
rd.forward(req, resp);
HttpServletResponse 对象的 sendRedirect(String location)方法称作重定向。如果 location 地址前面加上“/”,则表示相对于 Servlet容器的根来请求,即 http://localhost:8080,如果location地址前没有加上“/”,则表示相对于当前请求的 URI来寻找地址。
RequestDispatcher的forward(request, response)方法称作请求转发。
请求转发与重定向的区别。
请求转发,整个过程处于同一个请求当中
重定向。实际上客户端会向服务器端发送两个请求。
RequestDispatcher 是 通 过 调 用 HttpServletRequest 对象的getRequestDispatcher()方法得到的,是属于请求对象的方法。
sendRedirect()是 HttpServletResponse 对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。