请求转发与重定向的区别
- 格式:doc
- 大小:48.00 KB
- 文档页数:5
请求转发(Forward)和重定向(Redirect)的区别请求转发(Forward)和重定向(Redirect)的区别forward(转发):是服务器请求资源,服务器直接访问⽬标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪⾥来的,因为这个跳转过程实在服务器实现的,并不是在客户端实现的所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址.redirect(重定向):是服务端根据逻辑,发送⼀个状态码,告诉浏览器重新去请求那个地址.所以地址栏显⽰的是新的URL.转发是服务器⾏为,重定向是客户端⾏为。
区别:1. 从地址栏显⽰来说forward是服务器请求资源,服务器直接访问⽬标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪⾥来的,所以它的地址栏还是原来的地址.redirect是服务端根据逻辑,发送⼀个状态码,告诉浏览器重新去请求那个地址.所以地址栏显⽰的是新的URL.2. 从数据共享来说forward:转发页⾯和转发到的页⾯可以共享request⾥⾯的数据.redirect:不能共享数据.3. 从运⽤地⽅来说forward:⼀般⽤于⽤户登陆的时候,根据⾓⾊转发到相应的模块.redirect:⼀般⽤于⽤户注销登陆时返回主页⾯和跳转到其它的⽹站等4. 从效率来说forward:⾼.redirect:低.本质区别:解释⼀:⼀句话,转发是服务器⾏为,重定向是客户端⾏为。
为什么这样说呢,这就要看两个动作的⼯作流程:转发过程:客户浏览器发送http请求----》web服务器接受此请求–》调⽤内部的⼀个⽅法在容器内部完成请求处理和转发动作----》将⽬标资源发送给客户;在这⾥,转发的路径必须是同⼀个web容器下的url,其不能转向到其他的web路径上去,中间传递的是⾃⼰的容器内的request。
《JavaWeb程序设计》练习题参考答案第一章:Servlet基础1、下列选项中属于动态网站技术的是_________(多选)答:PHP/ASP/JSPA、PHPB、ASPC、JavaScriptD、JSP参考答案:PHP(Hypertext Preprocessor):超文本预处理器,其语法大量借鉴C、Java、Perl等语言,只需要很少的编程知识就能使用PHP建立一个真正交互的Web站点,由于PHP开放源代码,并且是免费的,所以非常流行,是当今Internet上最为火热的脚本语言之一。
ASP(Active Server Pages):是一种类似HTML、Script与CGI结合体的技术,他没有提供自己专门的编程语言,允许用户使用许多已有的脚本语言编写ASP应用程序局限于微软的IIS,般只适用于中小型站点,但目前ASP升级演变而来的支持大型网站的开发。
JSP(Java ServerPages):是基于Java Servlet以及Java体系的Web开发技术。
能在大部分服务器上运行,而且易于维护和管理,安全性能方面也被认为是三种基本动态网站技术中最好的。
2、下列关于Servlet的说法正确的是_______(多选)A、Servlet是一种动态网站技术B、Servlet运行在服务端C、Servlet针对每个请求使用一个进程来处理D、Servlet与普通的Java类一样,可以直接运行,不需要环境支持参考答案:Servlet是一种动态网站技术,是运行在服务器端,Servlet针对每个请求使用一个线程来处理,而不是启动一个进程,传统的CGI为每次请求启动一个进程来处理。
所以Servlet 的效率更高3、下列关于Servlet的编写方式正确的是______(多选)A、必须是HttpServlet的子类B、通常需要覆盖doGet() 和doPost()方法或其一C、通常需要覆盖service()方法D、通常要在web.xml文件中声明<servlet>和<servlet-mapping>两个元素参考答案:A、B、D必须继承Httpservlet类,不需要覆盖servlce()方法,service()方法是Servlet接口中的方法,Servlet是HttpServlet的父类,该方法会根据请求类型选择执行doGet()或doPost()方法。
JavaWeb中请求转发和请求重定向的区别以及使⽤什么是请求转发?请求转发是指,服务器收到请求后,从⼀次资源跳转到另⼀个资源的操作。
请求转发的特点1.浏览器地址栏不会发⽣变化2.他们⼀次请求,服务器完成转发操作3.共享Request域中的数据4.可以转发到WEB-INF⽬录下5.不可以访问⼯程以外的资源举个例⼦:1.⼀个公司有多个部门,其中部门1(Servlet1)向客户提供了⾃⼰能够提供的服务,但是还有⼀部分服务⾃⼰提供不了,需要其他部门的服务;2.所以部门1(Servlet1)将客户的⽂件盖⼀个章,证明部门1已经提供了服务,然后将其转交(请求转发)到部门2(Servlet2);3.部门2检查部门1是否盖过章了,如果盖过章就继续向客户提供服务…;4.直到所有服务都处理完,将客户需要的数据提供给客户(即,将数据转发给客户端**[转发到某个页⾯]**);package servlet;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class Servlet1 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.servlet1先获取请求参数,看看servlet1需要做的事String username = request.getParameter("username");System.out.println(username);//.....部门1提供⾃⼰的服务//2.servlet1设置⼀个参数证明servlet1转发的请求(部门1盖⼀个章)request.setAttribute("key1", "servlet1");//3.查询servlet2的路径,(部门1将其转交给部门1)RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");//4.把请求和响应转发给servlet2dispatcher.forward(request, response);}}package servlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class Servlet2 extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//部门2查看客户需要的服务System.out.println("Servlet2查看参数: "+request.getParameter("username"));//部门2查看部门1有没有盖章,判断是否继续服务System.out.println("Servlet2查看是否有Servlet1的证明: "+request.getAttribute("key1"));//部门2处理完⾃⼰的服务,System.out.println("Servlet处理⾃⼰的业务");}}注意1.这时候如果我们将Servlet2放在WEB_INF下,那么我们就⽆法直接访问servlet2了;2.但是我们可以通过请求转发来实现访问servlet2;思考:登录功能和这种请求转发⽅法类似,我们⽆法跳过登录界⾯直接访问系统,所有我们可以⽤这种请求转发的⽅法来实现;什么是请求重定向?请求重定向:是指客户端发送请求,然后服务器告诉客户端,我给你⼀个地址,你去新的地址访问(之前的地址可能已经被废弃,或者之前的地址[Servlet]⽆法满⾜需求);第⼀种⽅案// 设置响应状态码 302 ,表⽰重定向,(已搬迁)resp.setStatus(302);// 设置响应头,说明新的地址在哪⾥resp.setHeader("Location", http://localhost:8080);第⼆种⽅案(推荐使⽤)resp.sendRedirect(http://localhost:8080);请求重定向的特点1.浏览器的地址栏会发⽣变化2.浏览器发送了两次请求,⽽不是像调⽤request的getRequestDispatcher("/a/b/c.html").forward(request, response)⽅法实现的;所以⼀共创建了两个request对象3.两个request对象不能共享域数据4.重定向不能访问WEB-INF⾥的资源,因为两次请求都是客户端发起的,客户端⽆法直接访问到WEB-INF⾥的资源5.可以访问⼯程外的资源(⽐如说调转的百度等等)什么时候使⽤请求重定向?1.浏览会记录最后⼀次请求的所有数据,客户端可以通过刷新页⾯的⽅法,重新发起最后⼀次请求;2.⽽我们在请求转发或请求重定向之前,总会处理⼀些业务;此时,如果当本次业务是对数据库,本地⽂件的增删改操作时,就需要使⽤请求重定向;为什么呢?因为,这时如果我们使⽤请求转发(整个处理业务过程就只是⼀次请求),浏览就会记录我们这次请求(操作数据库),⼀旦客户端刷新页⾯,就会执⾏(操作数据库)的请求,这时很严重的bug,我们要避免,所有就要⽤到请求重定向;1.因为我们每次操作完数据库,都会跳转到⾸页,或者数据展⽰的页⾯,所以这时我们使⽤请求重定向跳转到这个页⾯(实际是跳转到某个Servlet查询数据库中的记录,这个Servlet再跳转到数据展⽰的页⾯);2.此时浏览器记录的最后⼀次请求就是查询数据库中记录的请求了,这时我们刷新页⾯,也只是查询数据,不再是对数据库的增删改了;总结:当我们修改数据库中的数据的之后,就需要使⽤请求重定向来避免上述的问题了;到此这篇关于JavaWeb中请求转发和请求重定向的区别以及使⽤的⽂章就介绍到这了,更多相关请求转发和请求重定向内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
转发重定向例子【篇一:转发重定向例子】httpservletresponse对象的sendredirect(ng.string location)方法称作重定向。
如果location地址前面加上 / ,则表示相对于servlet容器的根来请求,比如;如果location地址前面没有加上 / ,则表示相对于当前请求的uri来寻找地址。
requestdispatcher的:forward(servletrequest request, servletresponse response)方法叫做请求转发。
实验例子1:重定向和请求转发似乎都是造成页面跳转第一个页面first.jsp:%@ page language=java import=java.util.* pageencoding=utf-8% string path = request.getcontextpath();string basepath = request.getscheme()+://+request.getservername()+:+request.ge tserverport()+path+/; !doctype html public -//w3c//dtd html 4.01 transitional//en html head base href= %=basepath% title my jsp first.jsp starting page /title meta http-equiv=pragmacontent=no-cache meta http-equiv=cache-control content=no-cache meta http-equiv=expires content=0 meta http-equiv=keywords content=keyword1,keyword2,keyword3 meta http-equiv=description content=this is my page linkrel=stylesheet type=text/css href=styles.css /head body form action=second input type=text name=username inputtype=submit value=submit /form /body /html first.jsp第二个页面是servlet:用请求转发:package com.shengqishiwind.servlet;importjava.io.ioexception;importjavax.servlet.requestdispatcher;importjavax.servlet.servletexception;importjavax.servlet.http.httpservlet;importjavax.servlet.http.httpservletrequest;importjavax.servlet.http.httpservletresponse;public class second extends httpservlet public void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception process(request, response);public void dopost(httpservletrequest request,httpservletresponse response) throws servletexception, ioexception process(request, response); private voidprocess(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception // 请求转发requestdispatcher rd = request.getrequestdispatcher(third.jsp); rd.forward(request, response);}用重定向,则把处理方法改为:private void process(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception // 重定向 response.sendredirect(third.jsp); }第三个页面是third.jsp%@ page language=java import=java.util.* pageencoding=utf-8% string path = request.getcontextpath();string basepath = request.getscheme()+://+request.getservername()+:+request.ge tserverport()+path+/; !doctype html public -//w3c//dtd html 4.01 transitional//en html head base href= %=basepath% title my jsp third.jsp starting page /title meta http-equiv=pragmacontent=no-cache meta http-equiv=cache-control content=no-cache meta http-equiv=expires content=0 meta http-equiv=keywords content=keyword1,keyword2,keyword3 meta http-equiv=description content=this is my page linkrel=stylesheet type=text/css href=styles.css /head body thisis my third page. br /body /html不管用请求转发还是重定向的方法,第一个页面点击提交后,都能顺利转到第三个页面:但是其实实际进行的操作还是很不同的,看下面的例子。
•请求转发☐请求转发是指将请求再转发到另一资源(一般为JSP或Servlet)。
此过程依然在同一个请求范围内,转发后浏览器地址栏内容不变☐请求转发使用RequestDispatcher接口中的forward()方法来实现,该方法可以把请求转发到另外一个资源,并让该资源对浏览器的请求进行响应RequestDispatcher rd = request.getRequestDispatcher(path);rd.forward(request,response);或request.getRequestDispatcher(path) .forward(request,response);•重定向☐重定向是指页面重新定位到某个新地址,之前的请求失效,进入一个新的请求,且跳转后浏览器地址栏内容将变为新的指定地址☐重定向是通过HttpServletResponse对象的sendRedirect()来实现,该方法相当于浏览器重新发送一个请求response.sendRedirect(path);•请求转发和重定向区别如下:☐forward()只能将请求转发给同一个Web应用中的组件,而sendRedirect()方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到其他站点的资源。
☐sendRedirect()方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而调用forward()方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
☐forward()方法的调用者与被调用者之间共享相同的request对象和response对象;而sendRedirect()方法调用者和被调用者使用各自的request对象和response对象,它们属于两个独立的请求和响应过程。
•使用请求对象(request)存储数据(在servlet中存,在JSP中取)request. setAttribute(“score”,score);int score=(INTEGER)request. getAttribute(“score”);☐HttpServletRequest接口的方法:public void setAttribute(String name, Object obj)public Object getAttribute(String name)public Enumeration getAttributeNames()public void removeAttribute(String name)•使用HttpSession对象存储数据HttpSession session=request.getSession();session. setAttribute(“score”,score);int score=(Integer) session. getAttribute(“score”);☐HttpSession接口的方法public void setAttribute(String name, Object obj)public Object getAttribute(String name)public Enumeration getAttributeNames()public void removeAttribute(String name)•使用ServletContext对象存储数据ServletContext context = this.getServletContext();或ServletContext context = this.getServletConfig().getServletContext();context. setAttribute(“score”,score);int score=(Integer) application. getAttribute(“score”);ServletContext接口的方法public void setAttribute(String name, Object obj)public Object getAttribute(String name)public Enumeration getAttributeNames()public void removeAttribute(String name)简单的说,HttpServletRequest共享的对象仅在请求的生存期中可被访问,使用HttpSession共享的对象仅在会话的生存期中可被访问,使用ServletContext共享的对象在应用程序的生存期中可被访问。
response请求转发和重定向,cookie ⼀.response:响应对象提供的⽅法:void addCookie(Cookie cookie);服务端向客户端增加⼀个cookie对象void sendRedirect(String location) throws IOExcetion:页⾯跳转的⼀种⽅法void setContentType(String type):设置服务端响应的编码⽰例重定向:login.jsp—->check.jsp->success.jsp 判断登录是否合法1.login.jsp<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPE html><html><head><meta charset="ISO-8859-1"><title>Insert title here</title></head><body><form action="check.jsp" method="post">⽤户名:<input type="text" name="uname"><br /> 密码:<inputtype="password" name="upwd"><br /> <input type="submit"value="登录"></br></form></body></html>2.check.jsp<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPE html><html><head><meta charset="ISO-8859-1"><title>Insert title here</title></head><body><%request.setCharacterEncoding("utf-8");String name = request.getParameter("uname");String pwd = request.getParameter("upwd");if (name.equals("zs") && pwd.equals("abc")) {response.sendRedirect("success.jsp");} else {out.print("⽤户名或者密码错误!");}%></body></html>3.success.jsp<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPE html><html><head><meta charset="ISO-8859-1"><title>Insert title here</title></head><body>登陆成功!<br /> 欢迎您:<%String name = request.getParameter("uname");out.print(name);%></body></html>经发现重定向⽅式会导致数据丢失:⽰例请求转发:checks.jsp修改:<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPE html><html><head><meta charset="ISO-8859-1"><title>Insert title here</title></head><body><%request.setCharacterEncoding("utf-8");String name = request.getParameter("uname");String pwd = request.getParameter("upwd");if (name.equals("zs") && pwd.equals("abc")) {//response.sendRedirect("success.jsp");request.getRequestDispatcher("success.jsp").forward(request,response);} else {out.print("⽤户名或者密码错误!");}%></body></html>经运⾏发现,地址栏没有变。
1:在下述选项时,没有构成死循环的程序是A.int i=100 while (1) { i=i%100+1; if (i>100) break; }B.for (;;);C.int k=1000; do { ++k; }while(k>=10000);D.int s=36; while (s);--s;2:设有变量说明语句int a=1,b=0;则执行以下程序段的输出结果为()。
switch (a){case 1:switch (b){case 0:printf("**0**");break;case 1:printf("**1**");break;}case 2:printf("**2**");break;}printf("\n");A.**0**B.**0****2**C.**0****1****2**D.有语法错误3:What compiler switch creates an xml file from the xml comments in the files in an assembly?A./textB./docC./xmlD./help4:如果设treeView1=new TreeView(),TreeNode node=new TreeNode("根结点" ),则treeView1.Nodes.Add(node)返回的是一个 ()类型的值。
A.TreeNodeB.intC.stringD.TreeView5:以下描述错误的是:A.在C++中支持抽象类而在C#中不支持抽象类。
B.C++中可在头文件中声明类的成员而在CPP文件中定义类的成员,在C#中没有头文件并且在同一处声明和定义类的成员。
C.在C#中可使用 new 修饰符显式隐藏从基类继承的成员。
D.在C#中要在派生类中重新定义基类的虚函数必须在前面加Override。
1、POST请求和GET请求主要有如下不同:1)POST传输数据大小无限制2)POST比GET请求方式更安全2、Cookie与Session主要有如下区别:1)Cookie和HttpSession是保存会话相关数据的技术,其中Cookie将信息存储在浏览器端,是客户端技术,Session将数据保存在服务器端,是服务器端技术2)Cookie是基于HTTP协议中的Set-Cookie响应头和Cookie请求头进行工作的3)默认情况下HttpSession是基于一个名称为JSESSIONID 的特殊Cookie工作的4)浏览器对Cookie具有严格的限制,一个网站能在浏览器中保存多少Cookie是有限制的3、请求转发与重定向的异同点如下:1)请求转发和重定向都可以实现访问一个资源时转向当前应用资源2)请求转发是一次请求一次响应,而重定向为两次请求两次响应3)一般情况下应该使用请求转发,减少浏览器对服务器的访问,减轻服务器压力4)如果需要改变浏览器的地址栏,或更改浏览器的刷新按钮的功能时需要使用重定向4.1、简述过滤器的作用。
Filter被称作过滤器或者拦截器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能。
2、Servlet事件监听器的作用有如下几点:1)监听Web应用程序中ServletContext、HttpSession和ServletRequest等域对象的创建和销毁过程。
2)监听ServletContext、HttpSession和ServletRequest等域对象属性的修改。
3)感知绑定到HttpSession域中某个对象的状态。
5、JDBC的实现步骤如下:1)加载并注册数据库驱动2)通过DriverManager获取数据库连接3)通过Connection对象获取Statement对象4)使用Statement执行SQL语句5)操作ResultSet结果集String url = "jdbc:mysql://localhost:3306/jdbc";String username = "root";String password = "itcast";Connection conn = DriverManager.getConnection(url, username, password);// 3.通过Connection对象获取Statement对象Statement stmt = conn.createStatement();// 4.使用Statement执行SQL语句。
请求转发的方法正文:请求转发是指在网络通信中,将客户端发送的一个请求转发给另一个服务器进行处理的过程。
请求转发的方法有多种,下面将介绍其中几种常见的方法。
1. 重定向:重定向是最常见的请求转发方法之一。
当客户端发送请求到服务器时,服务器会返回一个HTTP状态码,指示客户端将请求重定向到另一个URL。
客户端会重新发送请求到新的URL,完成转发。
重定向可以通过HTTP状态码301和302实现,分别表示永久重定向和临时重定向。
2. 代理服务器:代理服务器是一种充当客户端与目标服务器之间中介的服务器。
当客户端发送请求时,代理服务器会接收请求并转发给目标服务器。
代理服务器可以根据不同的规则来选择目标服务器,例如根据负载均衡算法选择最合适的服务器。
3. 转发器:转发器是一种在应用程序级别进行请求转发的方法。
在Web开发中,常用的转发器是Servlet容器中的RequestDispatcher。
通过RequestDispatcher,开发人员可以将请求转发给同一Web应用程序中的另一个Servlet或JSP进行处理。
转发器可以实现请求的内部转发,对客户端是透明的。
4. 反向代理:反向代理是一种在服务器端进行请求转发的方法。
与代理服务器不同的是,反向代理是将客户端发送的请求转发给内部服务器进行处理。
客户端只知道反向代理服务器的存在,而不知道真正的服务器。
反向代理可以提供负载均衡和缓存等功能,提高服务器的性能和安全性。
总结起来,请求转发是一种将客户端的请求转发给另一个服务器进行处理的方法。
常见的请求转发方法包括重定向、代理服务器、转发器和反向代理。
不同的方法适用于不同的场景,开发人员可以根据实际需求选择最合适的方法。
请求转发(Forward)和重定向(Redirect)之间区别与联系一个比喻:小张向小李发送一次请求,想让他完成某项工作,当小李接受到请求时,发现自己完成不了,又请求小王帮忙,小王接收到小李请求之后最终完成了该项工作,并把最后的结果交给了小张。
这个过程就是请求转发,在此期间,小张只发送了一次请求,他只知道把任务交给了小李,至于小李是如何完成的,小张并不知道,他只等待最终的结果。
重定向则不同,首先小张向小李发送请求,想让他完成某项工作,当小李接收到这个请求时,发现自己完成不了,他立即通知小张,并推荐小王可以完成任务,于是小张又联系小王,最终小王完成了该项任务。
区别:1、浏览器地址栏显示不同(表面区别)无论进行多少次请求,如果使用请求转发来实现,浏览器地址栏中只显示第一次发送请求的地址;如果使用重定向来实现,浏览器地址栏显示的是每次请求的新地址。
这只是表面上看到的不同地方。
2、组件之间可否共享信息不同(本质区别)从本质上讲,请求转发时,从发送第一次到最后一次请求的过程中,WEB容器只创建一次request和response对象,请求之间始终共享这两个对象,所以每个请求可以访问他之前请求中的参数和属性的值;而重定向时,浏览器每发送一次请求,WEB容器都会重新创建新的request和response对象,所以请求之间不能共享信息,即不能在请求中访问到他之前请求中的参数和属性的值。
3、实现方式不同请求转发的实现步骤:•说明将要转发的资源;•获取请求转发的对象;•调用请求转发对象中forward()方法Java代码Java代码请求转发与重定向的区别先是看上去不同,他们的调用分别如下:request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jspresponse.sendRedirect("apage.jsp");//重定向到apage.jsp在jsp页面中你也会看到通过下面的方式实现转发:<jsp:forward page="apage.jsp" />我在初学jsp的时候,对这两个概念非常模糊,看别人的例子的时候,也是一头雾水,不知道什么时候该用哪个。
希望下面的解说能对你有所帮助。
提到转发和重定向就不得不提到request作用域。
很多初学者都知道当我们提交一个表单时,就创建了一个新的请求。
实际上,当我们点击一个链接时,也创建了一个新的请求。
那么一个请求的作用于到底有多大呢?例如:在页面a.jsp中有一个链接<a href="b.jsp?id=1">这是指向b的一个链接,而且还带了一个参数</a>当我们点击这个连接的时候,就产生了一个请求,为了明确起见,我们把它叫做requestA->B。
现在,在 b.jsp页面中我们就可以从这个请求中获取信息了。
在 b.jsp中你可以写入out.println(request.getParameter("id"))进行测试。
下面更复杂一点,我们在b.jsp页面中增加下面的语句:request.setAttribute("name","funcreal");out.println(request.getAttriblute("name"));//成功显示了name变量的值。
现在在b.jsp中再增加一个链接:<a href="c.jsp?age=23">这是指向c的一个链接,而且还带了一个参数</a>当我们点击这个连接的时候,将产生一个新的请求,这时requestA-B也就安息了,新的请求叫做requestB-C。
同样的道理,在c.jsp中,我们可以访问到的变量只有age,因为id,name这两个变量都属于requestA-B,此时他已经不存在了。
下面是源代码:a.jsp<%@ page contentType="text/html; charset=GBK" %><html><body bgcolor="#ffffff"><a href="b.jsp?id=1">指向b.jsp,而且还带了一个参数id=1。
requestA-B现在诞生了</a> </body></html>b.jsp<%@ page contentType="text/html; charset=GBK" %><html><body bgcolor="#ffffff"><%out.println("id=" + request.getParameter("id"));request.setAttribute("name","Func Real");out.println("name=" + request.getAttribute("name"));%><a href="c.jsp?age=23">requestA-B已经结束了。
指向c.jsp,而且还带了一个参数age=23</a> </body></html>c.jsp<%@ page contentType="text/html; charset=GBK" %><html><body bgcolor="#ffffff"><%out.println("id=" + request.getParameter("id"));out.println("name=" + request.getAttribute("name"));out.println("age=" + request.getParameter("age"));%></body></html>那么转发又是怎么回事呢?现在增加一个页面叫做 d.jsp,并且在 c.jsp中</body>前面增加一句<jsp:forward page="d.jsp"/>d.jsp<%@ page contentType="text/html; charset=GBK" %><html><body bgcolor="#ffffff">requestB-C的魔爪已经伸到了d.jsp页面<%out.println("age=" + request.getParameter("age"));%></body></html>运行程序,你会发现c页面中的内容没有显示出来,因为forward是自动执行的,地址栏中虽然是c.jsp 但实际上,但浏览器中显示的已经是d.jsp的内容了,而且看到了从b.jsp传过来的参数。
你可以简单得这样理解:转发,就是延长了requestB-C的作用域,<jsp:forward page="d.jsp"/>,这一句话实际上是把c.jsp和d.jsp粘到了一起,他们就像是在一个页面中。
如果你用过struts,那么你就知道为什么在Action中,最后一句几乎总是mapping.findForward("xxx");了。
因为我们在这个Action中设置的请求作用域的变量都将会在下一个页面(也许是另一个Action)中用到,所以要用转发。
总结:用重定向和转发不是一个习惯问题。
而是什么情况下必须用什么的问题。
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
有关JSP/Servlet的重定向技术综述如下[补充]1.RequestDispatcher.forward()转发是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servletor JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时 form提交的所有信息在b.jsp都可以获得,参数自动传递.但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name) 来传至下一个页面.重定向后浏览器地址栏URL不变.例:在servlet中进行重定向public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{response.setContentType("text/html; charset=gb2312");ServletContext sc = getServletContext();RequestDispatcher rd = null;rd = sc.getRequestDispatcher("/index.jsp"); //定向的页面rd.forward(request, response);}通常在servlet中使用,不在jsp中使用。
2.response.sendRedirect()是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.重定向后在浏览器地址栏上会出现重定向页面的URL例:在servlet中重定向public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{response.setContentType("text/html; charset=gb2312");response.sendRedirect("/index.jsp");}由于response是jsp页面中的隐含对象,故在jsp页面中可以用response.sendRedirect()直接实现重定位。