当前位置: 代码迷 >> Web前端 >> java_web 温习 2 jsp 与 servlet (3)jsp内置对象
  详细解决方案

java_web 温习 2 jsp 与 servlet (3)jsp内置对象

热度:330   发布时间:2012-09-17 12:06:51.0
java_web 复习 2 jsp 与 servlet (3)jsp内置对象

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是在服务器端建立的,浏览器访问服务器会有一个jsessionid,浏览器端通过 jsessionid定位服务器端的session,session的创建和销毁由服务器端控制。当浏览器关闭后,session还存在在服务器端,只不过你新开的浏览器去访问服务器会创建另一个session,这个时候的jsessionid已经不一样了。也就不能访问上一次的哪个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 对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。

  相关解决方案