zoukankan      html  css  js  c++  java
  • request.setAttribute()、session.setAttribute()和request.getParameter()的联系与区别

    1.session.setAttribute()和session.getAttribute()配对使用,作用域是整个会话期间,在所有的页面都使用这些数据的时候使用。

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

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

    举例:

    session.setAttribute("kindresult", result);    //result 为StringBuffer类型对象

    response.sendRedirect("../manage_kind.jsp");


    在manage_kind.jsp中:

    <%   
     StringBuffer kindresult=new StringBuffer();
     kindresult=(StringBuffer)session.getAttribute("kindresult");
     %>

    <%=kindresult%>

    ##################################################################

    我在servlet中使用了request.setAttribute()存储信息。
     语法如下:request.setAttribute("user","1234");
     然后 response.sendRedirect("/hello.jsp");
     但是在我的hello.jsp中 request.getAttribute("user");
     返回值为null,为什么没有取到String "1234"?

    在这里就要注意了,sendRedirect不能传递request对象。使用request.setAttribute时不能使redirect而是forward。即是将请求转发而不是重定向。

    你可以使用getServletContext().getRequestDispatcher("/hello.jsp").forward(request,response)转到hello.jsp页面,对客户端而言它意识不到是hello.jsp页面响应它。
     request对象和response对象是一样的,当然你的参数就可以传递过去了。

    你使用response.sendRedirect("/hello.jsp");转到hello.jsp之后,request对象是新建的,你的属性值自然没有了。但是如果你使用session代替request就还是可以的。
     session.setAttribute("user","1234");
     session.getAttribute("user");

    #####################################################################################

    4.request.getParameter() 和request.getAttribute() 区别

    (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里有

    <form name="form1" method="post" action="2.jsp">
     请输入用户姓名:<input type="text" name="username">
     <input type="submit" name="Submit" value="提交">
     </form>

    的话在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" />

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

    5.request.getAttribute()与request.setAttribute()

    request.getAttribute("nameOfObj")可得到JSP页面一表单中控件的Value。其实表单控件中的Object的 name与value是存放在一个哈希表中的,所以在这里给出Object的name会到哈希表中找出对应它的value。

    而不同页面间传值使用request.setAttribute(position, nameOfObj)时,只会从a.jsp到b.jsp一次传递,之后这个request就会失去它的作用范围,再传就要再设一个 request.setAttribute()。而使用session.setAttribute()会在一个过程中始终保有这个值。

    P.S:JavaScript与JSP中不能相互传值,因为JavaScript运行在客户端,而JSP运行在服务器端。若想使它们之间可以相互传递参数,可以在JSP中设置一个hidden控件,用它的value结合上面所说的用法来传递所需的数值。

  • 相关阅读:
    事务和异常处理
    普通三层结构示例
    Viewstate与Static
    oracle 9i 的数据类型
    XSD数据集
    ASP.NET中的错误处理和程序优化
    PL/SQL程序设计
    ASP.NET 2.0中的异步页面
    Oracle中RowNum的用法
    .NET单元测试
  • 原文地址:https://www.cnblogs.com/zheh/p/3936425.html
Copyright © 2011-2022 走看看