总结一下内容。
直观的感觉,使用forward可以使用request来传递参数进入下一个页面,而使用sendRedirect使用request无货传递到下一个页面,我们要使用session来传递。
另外我想先谈谈对于session的理解。
其实我们的session该你是这样的,是一个浏览器的作用范围(生命周期),即就是当我们打开浏览器访问页面时,服务器会在初次访问时给每个进程设置一个可以记录的标志,就是SessionID,存放于服务器端并且通过加载于HTTP头部发送客户端,在以后每次这个浏览器与服务器交互的时候,会带着这个SessionID与服务器来回话操作。
于是问题出现了,当我们将浏览器关闭的时候,是不会给服务器发送任何消息的,也即是说服务器无法获取我们客户端将浏览器关闭的事件。因此,迫使服务器端不得不采取这样一种设计方案,设置session的过期时间,问题就这样解决了。
另外还有一个平常的误区就揭开了,我们关闭了一个浏览器session就销毁了,这个session现在是无法获取了的(除非采用另外一种简单的方法,下边会介绍),服务器端会为我们解决,但是它不是随着浏览器的关闭而消亡,浏览器的关闭对他影响不大。
其实上述的讨论只是一种类型的session,常常概念上叫做会话session。要是我们将浏览器关闭了,在下次进来的时候还想保持以前的状态呢?这时候采用了Cookie技术,他简单的保留了我们的sessionId,当然似乎有些什么绑定的信息,以后再研究,也就是说他记录了我们访问过的网页的一些历史信息,最重要的是sessionID,我们在下次访问这个页面的时候,首先查找看有没有关于他的信息,有的话取出来,直接发送给服务器,要是服务器上这个sessionId还存活的话,就可以获取历史信息了,及我们要保存的信息。此种一般我们称之为保持session.
我们登录网站时一般会询问是不是要保留,并且多长时间,实际上均是保持session做的事,像Javaeye也是如此。当时以为它(javaeye)的设计有问题,为什么我选择了那个永久登录,在重新打开时有时候会失去我的信息,最后发现,是我的失误:我使用魔法兔子清除了一些垃圾文件,当然有时候也就吧那个信息给清除了。
好了言归正传。
1.RequestDispatcher.forward()
是在服务器端起作用,他只是服务器内部的一种自动转向,对于外部(客户端)是检测不到的,因此我们的外在表现即为:浏览器的地址没有变化,但是我们赚到了另外一个页面,并且参数也通过request传了过去。
在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在b.jsp都可以获得,参数自动传递。但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面,也就是说不能通过parameter传递而只能通过attribute在request中记录传递。
因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。比如,通常业务处理在Servlet中处理,处理的结果转向到一个 JSP页面进行显示,类似于Servlet链的功能。
例:servlet文件中重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
ServletContext sc = getServletContext();
request.setAttribute("info","info");
RequestDispatcher rd = sc.getRequestDispatcher("/index.jsp");
rd.forward(request, response);
}
2.response.sendRedirect()
是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,且在浏览器地址栏上会出现重定向页面的URL,此时假如你还用简单的attribute传递的时候,问题出现了,每次均为空?于是我们改进方案,拿出来我们的session,用request获取session信息,在此处可以采用attribute传递了,相当于将attribute提升了一个更高的层次,在浏览器的作用范围内。
他实际上的表现效果相当于用户在页面直接输入一个网址,然后按那个转向键。
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
request.getSession().setAttribute("newsxmlinfo", list);
request.getSession().setAttribute("flag", "news");
response.sendRedirect(request.getContextPath()+ "/pages/news/news.jsp?info=info&info=info");
}
这个方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如response.sendRedirect ("http://java.sun.com")也可以使用相对的URL。如果location以"/"开头,则容器认为相对于当前Web应用的根,这种重定向的方法,将导致客户端浏览器的请求URL跳转,地址栏中可以看到新的URL地址。
3.继续思考
RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。
这样,从浏览器的地址栏中可以看到跳转后的链接地址。现在你还在为参数的传递烦恼么?? 对于过度使用session传递的问题,应当深思。
对于向导式页面,session是无法替代的,否则参数传递太复杂了。
对于一般不太复杂的小型项目,session也是不会有太大的影响。其实还不是我以前认识的那么恐怖,只是控制好就可以了。 什么时候清楚这个session的问题?考虑中,最佳时机。不然每次request不是很臃肿??
有没有好的建议?谢谢。
分享到:
相关推荐
forward转发与redirect重定向的区别
forward与redirect!转发和重定向 解析
转发和重定向的区别 forward和redirect的区别 request.getRequestDispatcher()..forward(request,response);和 response.sendRedirect();的区别详解
JSP之使用jsp:forward实现用户信息验证的页面跳转 参考博客地址:https://blog.csdn.net/qq_36631076/article/details/79709868
IPv6 Fundamentals: A Straightforward Approach to Understanding IPv6 作者 Rick Graziani 2017年cisco出版, 有章节目录 可打印
OpenAI-Forward 提供如下功能: 全能代理: 具备转发几乎所有类型请求的能力 用户流量控制: 实现用户请求速率限制(RPM)和流式Token速率限制(TPM) 自定义秘钥: 允许用户用自定义生成的密钥替代原始API密钥 实时...
RequestDispatcher对象的forward方法在使用时应注意的问题
用户向服务器发送了一次HTTP请求,该请求肯能会...根据转发方式的不同,可以区分为直接请求转发(Forward)和间接请求转发(Redirect)两种有何区别呢?本篇在回答该问题的同时全面的讲解两种请求转发方式的原理和区别。
解决了<jsp:forward/>跳转no fond 的问题
还有,转发是在web应用程序之内进行的,可以访问web应用程序所设定的内部目录,像是WEB-INF目录,只能在Web应用程序中进行,不能指定至其它的Web应用程序的地址。 redirect就是服务端根据逻辑,发送一个状态码,告诉...
<jsp:forward>元素可以用来转发控制,而Response对象 的sendRedicreat()方法用来重定向请求
NULL 博文链接:https://dreamzhong.iteye.com/blog/1128006
初学struts2,个人初次遇到的一些有关struts2的乱码配置以及jsp页面的forward404问题的解决(配置 png图片)
dispcter和forward的区别 RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()...2、forward与include基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源,如: req.sendRedriect
-Forward.jsp: 根据用户类型,进行任务转发。如果是教师类型,把任务转发给Teacher.jsp;如果是学生类型,把任务转发给Student.jsp -Teacher.jsp: 如果用户名和密码都等于TEACHER,把用户名写入到Session中,同时...
cmake 、代理模式与pimpl模式混用实例、std::move、std::forward()应用。用于学习C++设计模式,cmake程序编译。
这是实验课写的,主要运用了jsp:forward方法实现!能运行!
ActionForward的使用 1、理解全局和局部ActionForward的概念 2、redirect的使用 3、struts-config.xml文件不允许动态修改 4、理解动态ActionForward,动态的ActionForward是可以运行期修改的
Go语言开发的端口转发工具 for port data forward (TavenLi) port-forward Go语言开发的端口转发工具 for port data forward 开发语言:GO 控制台框架:beego 数据库:sqlite3 最近更新 v1.3.6 发布,重新增加 TCP...
小程序 :fast-forward_button: :fast-forward_button: :fast-forward_button: :fast-forward_button: :fast-forward_button: :fast-forward_button: :fast-forward_button: :fast-forward_button: AWT :fast-forward...