request.setAttribute()、session.setAttribute()和request.getParameter()的联系与区别

来源:互联网 发布:js atan2函数 编辑:程序博客网 时间:2024/04/29 20:00

最近在复习web相关的内容,将遇到的问题通过网上一些文章和参考用书进行了一个整理,整理为如下内容:
首先我们先来看如下的一个例子,现在假设有两个jsp页面,jsp1与jsp2:

jsp1页面

String [] test=new String[2];  test[0]="1";  test[1]="2";  request.setAttribute("test",test) ;  response.sendRedirect("jsp2.jsp");  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

jsp2页面:

String test[] = (String[])request.getAttribute("test");out.println(test);
  • 1
  • 2
  • 1
  • 2

会发现无法显示test,因为在jsp2页面中找不到test,那么原因是什么呢?

request.setAttribute()

其实那就要从request的生命周期或者是说作用范围说起了,setAttribute()用来在同一个request周期中保存变量使用。

比如servlet调用后,引出JSP页面,这是一个request周期。如果在Jsp页面需要servlet中的一些 处理结构,就从request.getAttribute中获取。
而sendRedirect()方法是通过浏览器重定向的,所以第二个JSP页面中获得的request并非是前一个页面的request(两次请求生成了前后两个不同的 request对象了)。而此时使用RequestDispatcher接口的forward()方法则能够得到request中的对象了,这是因为后者并不是使用客户端浏览器进行重定向的,从函数的名字就可以看出,RequestDispatcher.forward()就是从服务器端进行任务转发。

sendRedirect()是请求从定向,和超连接是一个意思,比如你在A页面中写一个request.setAtribute,sendRedirect到B页面,就是说服务器从A页面中给你一个response,然后你的浏览器再去request到B页面,由于有两次request和response,是不能在B页面取到request.setAtribute里的值,能从地址栏看到url的改变。

request.getRequestDispatcher().forward(request,response)是请求分发器,比如你在A页面中写一个request.setAtribute,request.getRequestDispatcher().forward(request,response)到B页面,那就是说服务器给你的response是B页面的,并且只有一次request和response,所以是能在B页面取到request.setAtribute里的值,地址栏的url仍然是A页面的。

所以通常情况下,setAttribute()方法都和RequestDispatcher.forward()都在一起使用,具体用法示例:

List list = new CommonsDao().getAllCommons();  request.setAttribute("CommonsList", list);  request.getRequestDispatcher("View.jsp").forward(request, response); //一直都是同一个request
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

request.setAttribute()和request.getAttribute()配对使用,作用域是请求和被请求页面之间。request.setAttribute()是只在此action的下一个forward需要使用的时候使用;request.getAttribute()表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为Object对象类型。其实表单控件中的Object的 name与value是存放在一个哈希表中的,所以在这里给出Object的name会到哈希表中找出对应它的value。setAttribute()的参数是String和Object。

sendRedirect不能传递request对象。使用request.setAttribute时不能使redirect而是forward。即是将请求转发而不是重定向。

request.getParameter()

request.getParameter()表示接收参数,参数为页面提交的参数。包括:表单提交的参数、URL重写(就是xxx?id=1中的id)传的参数等,因此这个并没有设置参数的方法(没有setParameter()),而且接收参数返回的不是Object,而是String类型。

(1)request.getParameter()取得是通过容器的实现来取得通过类似post,get等方式传入的数据,request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段
(2)request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。request.getParameter()方法返回String类型的数据。
request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部
还有一点就是,HttpServletRequest类有setAttribute()方法,而没有setParameter()方法。
拿一个例子来说一下吧,假如两个WEB页面间为链接关系时,就是说要从1.jsp链接到2.jsp时,被链接的是2.jsp可以通过getParameter()方法来获得请求参数.

假如1.jsp里有

请输入用户姓名:

的话在2.jsp中通过request.getParameter(“username”)方法来获得请求参数username:
<% String username=request.getParameter(“username”); %>


但是如果两个WEB间为转发关系时,转发目的WEB可以用getAttribute()方法来和转发源WEB共享request范围内的数据,也还是说一个例子吧。
有1.jsp和2.jsp
1.jsp希望向2.jsp传递当前的用户名字,如何传递这一数据呢?先在1.jsp中调用如下setAttribute()方法:

<%String username=request.getParameter("username");request.setAttribute("username",username);%><jsp:forward page="2.jsp" />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

在2.jsp中通过getAttribute()方法获得用户名字:
<% String username=(String)request.getAttribute(“username”); %>

session.setAttribute()

不同页面间传值使用request.setAttribute(position, nameOfObj)时,只会从a.jsp到b.jsp一次传递,之后这个request 就会失去它的作用范围,再传就要再设一个 request.setAttribute()。而使用session.setAttribute()会在一个过程中始终保有这个值。
session.setAttribute()和session.getAttribute()配对使用,作用域是整个会话期间,在所有的页面都使用这些数据的时候使用。详细的session相关内容可以参考http://blog.csdn.net/megustas_jjc/article/details/53443012。

0 0
原创粉丝点击