总结一下内容。
直观的感觉,使用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),通常通过`request.getRequestDispatcher("xx.jsp").forward(request,response);`这样的方式来实现。页面转发是在服务器端内部完成的一次跳转,不会像页面转向那样重新发起请求,也不会导致...
在实际项目开发中,Struts2的转发功能是核心概念之一,对于理解Web应用的请求处理流程至关重要。本项目实战主要探讨了如何在Struts2框架下实现页面间的转发。 1. Struts2转发基础: 在Struts2中,转发(Forward)...
总结,Struts1.3中的页面跳转是通过Action类、struts-config.xml配置以及ActionForward、ActionRedirect等类实现的。理解并熟练运用这些概念和方法,能帮助开发者更高效地构建基于Struts1.3的应用程序。在实际项目中...
本文将详细讲解如何在Servlet中实现请求转发以及用户登录验证。 首先,我们来理解请求转发(Request Forward)。在Servlet中,请求转发是一种在服务器内部将一个请求从一个资源传递到另一个资源的技术。这种方式是...
网站页面自动跳转是网页开发中的常见功能,用于在用户打开一个页面后,经过一段时间或者特定条件触发,自动转向另一个页面。这种技术在各种场景下都有应用,比如页面更新、错误处理、重定向等。本篇文章将深入探讨...
总结来说,这个资源包提供了一个JSP分页和页面跳转的实战案例,结合了数据库操作,可以帮助开发者深入理解这些关键概念,并能将其应用到自己的项目中。通过分析和学习源码,你可以了解到如何在实际环境中有效地处理...
总结来说,请求转发适用于多个资源共同处理一个请求的情况,而请求包含则常用于在页面上组合多个小片段,如包含头部、底部等公共部分。理解并熟练掌握这两种技术对于优化JavaWeb应用程序的架构和性能至关重要。在...
#### 七、Forward(请求转发)与Redirect(重定向) - **Forward**: - 在服务器内部进行资源定位和控制权的转移。 - 客户端地址栏不会改变。 - **Redirect**: - 由服务器返回一个新的地址给客户端,客户端再发起新...
- **Forward**:服务器端转发,地址栏不变。 - **Redirect**:客户端重定向,地址栏变化。 ##### 7. 什么情况下调用doGet()和doPost()? - **doGet**:处理GET请求。 - **doPost**:处理POST请求。 ##### 8. ...
总结,实现带有验证码的登录界面涉及前端界面设计、后端服务器逻辑以及用户交互的处理。`forward`和`redirect`是处理这些交互的关键技术,它们确保了用户请求的正确路由和安全的登录流程。在实际开发中,根据需求,...
- **forward**:由于是在服务器内部进行的跳转,因此请求和响应之间可以共享同一个`HttpServletRequest`对象,即可以在转发前后的页面间共享数据。 - **redirect**:客户端需要重新发起请求,因此转发前后的请求之间...
- `<c:redirect>` 和 `<c:forward>`: 页面重定向和转发。 ### JSTL的fmt标签库 - `<fmt:formatDate>`: 格式化日期和时间。 - `<fmt:formatNumber>`: 格式化数字。 - `<fmt:message>`: 获取资源包中的消息,支持...
- **转发(forward)**:服务器内部操作,只发生一次请求,地址栏不会改变。 - **重定向(redirect)**:客户端操作,发生两次请求,地址栏会发生变化。 ##### JQurey总结 - **选择器**:如`$("#id")`选择ID为id的元素...
* 转发:request.getRequestDispatcher("转发路径").forward(request, response)。 五、JSP 内置对象 * JSP 内置对象共有九个:request、response、out、session、application、pageContext、config、page、...
在 Struts 应用程序中,`struts-config.xml` 文件是核心配置文件,它定义了应用的行为、控制器(Actions)、数据源(Form Beans)以及视图(JSP 页面)之间的关系。本文将深入探讨 `struts-config.xml` 的主要元素和...
8. 转发与重定向:在服务器端,转发(Forward)是将请求从一个Servlet传递到另一个Servlet或JSP页面,而重定向(Redirect)则是让浏览器向新的URL发起新的请求。在购物车系统中,可能通过转发实现内部操作,如添加...
- `FORWARD`和`REDIRECT`:分别用于标识页面转发和重定向。 4. **MVC设计模式**: - **Model(模型)**:`com.qf.entity`包下的实体类,负责处理数据和业务逻辑。 - **View(视图)**:JSP页面,负责展示数据。 ...
该应用可能使用了两种常见的HTTP请求处理方式——重定向(Redirect)和转发(Forward),来实现用户从登录界面到登录后的页面跳转。 首先,让我们深入了解一下JSP中的登录实现。在Web应用中,登录通常涉及到验证...
- `<c:redirect>`和`<c:forward>`:控制请求的转发和重定向。 四、JSTL练习实例 "ch15"这个文件可能代表了第15章的练习内容,通常会包含多个JSTL应用的示例,比如: - 使用`<c:forEach>`遍历列表并显示元素。 - ...