zoukankan      html  css  js  c++  java
  • JSP request.setAttribute()详解及实例

     javascript request.setAttribute()详解

    request.setAttribute()怎么用的?

    JSP1代码

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

    JSP2代码

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

    为什么JS P2中会找不到test?

    用来在同一个request周期中保存变量使用。比如servlet调用后,推出JSP页面,这是一个request周期,如果在Jsp页面需要servlet中的一些 处理结构,就从request.getAttribute中获取。

    sendRedirect()方法是通过浏览器重定向的,所以第二个JSP页面中获得的request并非是前一个页面的request(两次请求生成了前后两个不同的 request对象了)。

    用RequestDispatcher接口的forward()方法试试看。

    都在一起使用

    1
    2
    3
    4
    5
    6
    List list = new CommonsDao().getAllCommons();
    request.setAttribute("CommonsList", list);
    request.getRequestDispatcher("View.jsp").forward(request, response);
      
    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结合上面所说的用法来传递所需的数值。

    1. request.getRequestDispatcher()是请求转发,前后页面共享一个request
    2. response.sendRedirect()是重新定向 前后页面不是一个request
    3. sendRedirect是通知IE再次提交一个http请求, dispatcher是直接转到目的地址,最直接得表现,应该是dispatcher后的IE地址栏地址是不变的
    4. request.getRequestDispatcher()是服务器端跳转
    5. response.sendRedirect()是客户端跳转

    关于request.request.getRequestDispatcher().forward()方法的一点看法

    今天在调试一个Servlet程序的时候,报了以下错误!

    1
    java.lang.IllegalStateException: Cannot forward after response has been committed

    根据字面理解的话,意识是在response已经提交后程序不能再一次的跳转!

    研究代码以后发现,是因为前面已经执行过一次request.request.getRequestDispatcher().forward()

    但是后面的request.request.getRequestDispatcher().forward()依然被执行到了!

    那么很有理由相信request.request.getRequestDispatcher().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页面的

    request.sendRedirect 与 request.getRequestDispatcher.forward 的区别

    1.forward重定向是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变,而sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。

    2.forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。即参数的传递方式不一样:forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。

    3.sendRedirect能够处理相对URL,自动把它们转换成绝对URL,如果地址是相对的,没有一个‘/',那么Web container就认为它是相对于当前的请求URI的。比如,如果为response.sendRedirect("login.jsp"),则会从当前servlet 的URL路径下找login.jsp: http://localhost:8081/dms/servlet/Servlet 重定向的URL: http://localhost:8081/dms/servlet/login.jsp,如果为response.sendRedirect("/login.jsp")则会从当前应用径下查找url:http://localhost:8081/login.jsp。而forward不能这样处理相对路径。

     
    java freemarker视频教程 17课
    动力节点-王勇-百度云-javaweb成绩管理系统
    Hadoop源码解析视频教程
    尚学堂白贺翔java互联网架构师视频教程 attach_img
    java版系列设计模式视频教程
    黑马javaee10期[共79.9G]
    Spring Cloud微服务+SpringBoot视频教程 attach_img
    全文搜索 SOLR资料 从基础到高级 视频教程
    一套不可多得的Lucene视频教程带课程源码
    大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程
    某某培训机构32期JavaEE系列视频教程就业班视频教程
    达内2017Java全套最新价值2万元视频教程  ...2
    北京动力节点——java SSM框架项目视频教程
    传智播客35期JavaEE工程师从基础到实战视频
    Python和Java结合的项目实战
    北京黑马就业班32期JavaEE视频教程完整版[2016.07月-12月]
    全网首套Spring Boot视频教程下载带源码
    Java视频教程(马士兵)合集
    D脑—数据结构与算法(java版)
    传智Java32期视频教程
  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/veromcae/p/10017981.html
Copyright © 2011-2022 走看看