转发与重定向的区别

合集下载

JSP上机课之转发&重定向

JSP上机课之转发&重定向

JSP上机课之转发&重定向Eclipse项目结构C:.│.classpath│.project│├─.settings│.jsdtscope│org.eclipse.jdt.core.prefs│ponent│mon.project.facet.core.xml│org.eclipse.wst.jsdt.ui.superType.container││├─build│└─classes│└─com│└─example│└─controller│UserServlet.class│├─src│└─com│└─example│└─controller│UserServlet.java│└─WebContent│calculate.jsp│index.jsp│├─META-INF│MANIFEST.MF│└─WEB-INF│web.xml│└─lib主要用到了四个文件,分别是index.jsp、calculate.jsp、web.xml、UserServlet.java //index.jsp<%@page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"><title>index</title></head><body><!--作业:1.重定向,转发练习编写一个JSP页面,输入圆的半径提交给一个Servlet.Servlet对半径进行判定,若为null或<=0的数,重定向到jsp页面若为>0的值,则转发到另一个页面,计算面积、周长--><form action="UserServlet"method="post"><table><tr><td>半径:</td><td><input type="text"name="radius"></td></tr><tr><td></td><td><input type="submit"value="提交"></td></tr></table></form></body></html>//calculate.jsp<%@page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"><title>calculate</title></head><body><%!double radius;%><% radius = Double.parseDouble(request.getParameter("radius"));%><table><tr><td>圆的面积:</td><td><%=Math.PI*radius*radius%></td></tr><tr><td>圆的周长:</td><td><%=Math.PI*radius*2%></td></tr></table></body></html>//web.xml<?xml version="1.0"encoding="UTF-8"?><web-app xmlns="/xml/ns/javaee" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_3_0.xsd"version="3.0"metadata-complete="true"><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>UserServlet</servlet-name><servlet-class>erServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>UserServlet</servlet-name><url-pattern>/UserServlet</url-pattern></servlet-mapping></web-app>//UserServlet.javapackage com.example.controller;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class UserServlet*/@WebServlet("/UserServlet")public class UserServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public UserServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response)*/protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoPost(request, response);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse* response)*/protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubString str = request.getParameter("radius");double radius;try {radius = Double.valueOf(str);} catch (NumberFormatException e) {// e.printStackTrace();radius = -1;}if (str.isEmpty() || radius <= 0) {response.sendRedirect("index.jsp");} else {request.getRequestDispatcher("calculate.jsp").forward(request,response);}}}转换成tomcat的目录结果如下D:.│calculate.jsp│index.jsp│└─WEB-INF│web.xml│├─classes│└─com│└─example│└─controller│UserServlet.class│UserServlet.java│└─lib。

转发和重定向的区别

转发和重定向的区别
提到转发和重定向就不得不提到request作用域。很多初学者都知道当我们提交一个表单时,就创建了一个新的请求。实际上,当我们点击一个链接时,也创建了一个新的请求。那么一个请求的作用于到底有多大呢?例如:
在页面a.jsp中有一个链接<a href="b.jsp?id=1">这是指向b的一个链接,而且还带了一个参数</a>。当我们点击这个连接的时候,就产生了一个请求,为了明确起见,我们把它叫做requestA->B。现在,在b.jsp页面中我们就可以从这个请求中获取信息了。在b.jsp中你可以写入out.println(request.getParameter("id"))进行测试。下面更复杂一点,我们在b.jsp页面中增加下面的语句:
</body>
</html>
c.jsp
<%@ page contentType="text/html; charset=GBK" %>
<html>
<body bgcolor="#ffffff">
<%
out.println("id=" + request.getParameter("id"));
d.jsp
<%@ page contentType="text/html; charset=GBK" %>
<html>
<body bgcolor="#ffffff">
requestB-C的魔爪已经伸到了d.jsp页面

跟我学《Web组件与框架开发技术》——深入学习和掌握页面转发和重定向两种跳转方式之间的差别及编程应用

跟我学《Web组件与框架开发技术》——深入学习和掌握页面转发和重定向两种跳转方式之间的差别及编程应用

1跟我学《Web组件与框架开发技术》——深入学习和掌握页面转发和重定向两种跳转方式之间的差别及编程应用1.1.1JSP Web页面转发和重定向相关的实现技术及编程应用1、区分页面转发和重定向两种跳转方式之间的差别请求转发允许把请求转发给同一个Web应用程序中的其他Web组件(如JSP页面、Servlet程序等)。

这种技术通常应用于Web应用系统中的控制层的Servlet程序中的流程控制,根据请求的数据或业务逻辑层组件处理后的结果,并将请求转发到合适的目标组件,目标组件执行对请求的附加处理操作,并最终生成响应的结果。

请求转发过程中客户端浏览器只向服务器产生1次请求,而重定向则是2次请求;请求转发时在浏览器的URL地址栏中的信息不会发生改变,仍然为最初请求的URL信息,如下示例图(a)和如下示例图(b)所示。

本示例初始请求的URL信息为responseUserLogin.jsp 页面文件,由于是应用请求转发方式实现跳转,因此在登录成功和失败的两种情况下的URL 地址都为最初请求的URL信息。

图(a) 登录成功时的结果信息图(b) 登录失败时的结果信息而重定向时在浏览器的URL地址栏中的信息会改变为重定向的目标URL地址,如下示例图(a)和如下示例图(b)所示。

由于是应用重定向方式实现跳转,因此在登录成功和失败的两种情况下的URL地址分别为登录成功和登录失败所对应的页面信息的URL地址信息。

图(a) 登录成功时的结果信息图(b) 登录失败时的结果信息2、Http请求转发及实现的代码示例在Servlet程序中可以直接使用java.servlet.RequestDispatcher接口中的forward()方法来转发它所收到的Http请求。

如下示例图为java.servlet.RequestDispatcher接口中的forward()方法的定义及功能说明。

而在JSP页面中,则可以利用<jsp:forward>动作标签实现对请求的转发。

JavaWeb中请求转发和请求重定向的区别以及使用

JavaWeb中请求转发和请求重定向的区别以及使用

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不管用请求转发还是重定向的方法,第一个页面点击提交后,都能顺利转到第三个页面:但是其实实际进行的操作还是很不同的,看下面的例子。

java Servlet请求转发和重定向

java Servlet请求转发和重定向

•请求转发☐请求转发是指将请求再转发到另一资源(一般为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请求转发和重定向,cookie

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.重定向访问服务器两次,转发只访问服务器一次。

2.重定向可以看见目标页面的URL,转发只能看见第一次访问的页面URL,以后的工作都是有服务器来做的。

3.重定向跳转后必须加上return,要不然页面虽然跳转了,但是还会执行跳转后面的语句,转发是执行了跳转页面,下面的代码就不会在执行了。

4.在request级别使用信息共享,使用重定向必然出错5.还有一个大的区别就是,重定向可以访问自己web应用以外的资源一、调用方式我们知道,在servlet中调用转发、重定向的语句如下:request.getRequestDispatcher("new.jsp").forward(request, response);//转发到new.jsp response.sendRedirect("new.jsp");//重定向到new.jsp在jsp页面中你也会看到通过下面的方式实现转发:<jsp:forward page="apage.jsp" />当然也可以在jsp页面中实现重定向:<%response.sendRedirect("new.jsp");//重定向到new.jsp%>二、本质区别解释一一句话,转发是服务器行为,重定向是客户端行为。

为什么这样说呢,这就要看两个动作的工作流程:转发过程:客户浏览器发送http请求----》web服务器接受此请求--》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。

在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。

转发行为是浏览器只做了一次访问请求。

重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器--》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。

转发和重定向路径问题

转发和重定向路径问题

转发和重定向路径问题精髓:开发过程中建议使⽤绝对路径。

“/”使⽤的三个最重要的地⽅:1,web.xml中使⽤“/”,给servlet指定url-partner是为servlet指定通过什么路径能够访问到当前的servlet⽐如我们设置“/test”,那其实我们需要通过localhost:8080/projectname(项⽬名称)/test才能够访问到servlet,所以这⾥的/表⽰的是”localhost:8080/projectname(项⽬名称)/“。

“/"可以理解为⼀个缩写。

2,转发和重定向他们的路径都可以是相对路径,如果是相对路径,在转发和重定向中都⼀样,但是如果他们使⽤绝对路径就不⼀样了转发中“/”表⽰”localhost:8080/projectname(项⽬名称)/“,但是在重定向中使⽤“/”,这个表⽰的是localhost:8080/,也就是到达webapp。

3,在HTML中绝对路径“/”表⽰的是到达tomcat的webapp,不包括当前项⽬路径,只要是HTML前端的“/”到达的都是:localhost:8080"。

从需求⾓度记忆,在可以跨域的地⽅“/”表⽰的是到达localhost:8080,如果不能跨域的地⽅表⽰的就是localhost:8080/projectname(项⽬名称)/。

1,a标签:<a href="/day53/index.jsp">跳转</a> 的路径如果是"/"开头,"/"则相当于"localhost:8080"。

2,form表单:<form action= "/"></form>3,<script type="text/javascript" src="/"></script>4,<link rel="stylesheet" type="text/css" href="/" />5,<script type="text/javascript" >window.location.href="/"</script>以上"/"都表⽰:localhost:8080=================================================⼀、请求转发与响应重定向的种类有两种⽅式获得Servlet转发对象(RequestDispatcher):⼀种是通过HttpServletRequest的getRequestDispatcher()⽅法获得,⼀种是通过ServletContext的getRequestDispatcher()⽅法获得。

请求转发与重定向的区别

请求转发与重定向的区别

请求转发与重定向的区别先是看上去不同,他们的调用分别如下: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。

请求重定向跟请求转发的区别

请求重定向跟请求转发的区别

请求转发与重定向的区别:请求转发与重定向的区别:请求重定向与请求转发的比较,HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有很大的区别。

1.RequestDispatcher.forward方法只能将请求转发给同一个Web应用中的组件,HttpServletResponse.sendRedirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序的资源,甚至是使用绝对URL重定向到其他站点的资源。

对于sendRedirect如果传递的URL以"/"开头,他是相对于整个Web站点的根目录;对于forward如果传递的URL以"/"开头,它是相对于当前Web应用程序的根目录。

2.sendRedirect对浏览器做出的响应是重新发出对另外一个URL的访问请求,forward在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果3.3.forward的调用者与被调用者之间共享相同的request对象和response对象,他们属于同一个访问请求和响应过程;sendRedirect的调用者与被调用者使用各自的request和response对象,属于两个独立的访问请求和响应过程总结来说转发与重定向之间的区别如下:区别一:重定向时浏览器上的网址改变转发时浏览器上的网址不变区别二:重定向实际上产生了两次请求转发只有一次请求区别三:重定向时的网址可以是任何的网址转发时的网址必须是本站网址让浏览器获得另外一个URL所指向的资源可以使用请求转发(RequestDispatcher.forward)或则是重定向技术(HttpServletResponse.sendRedirect),但是两者的内部机制有很大的区别:1 请求转发只能将请求转发给同一个WEB应用中的组件,而重定向还可以重新定向到同一站点不同应用程序中的资源,甚至可以定向到一绝对的URL。

重定向和转发的区别

重定向和转发的区别

重定向和转发的区别1. 重定向与转发的区别:1.重定向访问服务器两次,转发只访问服务器⼀次。

2.转发页⾯的URL不会改变,⽽重定向地址会改变3.转发只能转发到⾃⼰的web应⽤内,重定向可以重定义到任意资源路径。

4.转发相当于服务器跳转,相当于⽅法调⽤,在执⾏当前⽂件的过程中转向执⾏⽬标⽂件,两个⽂件(当前⽂件和⽬标⽂件)属于同⼀次请求,前后页共⽤⼀个request,可以通过此来传递⼀些数据或者session信息,request.setAttribute()和 request.getAttribute()。

⽽重定向会产⽣⼀个新的request,不能共享request域信息与请求参数5.由于转发相当于服务器内部⽅法调⽤,所以转发后⾯的代码仍然会执⾏(转发之后记得return);重定向代码执⾏之后是⽅法执⾏完成之后进⾏重定向操作,也就是访问第⼆个请求,如果是⽅法的最后⼀⾏进⾏重定向那就会马上进⾏重定向(重定向也需要return)。

6.⽆论是RequestDispatcher.forward⽅法,还是HttpServletResponse.sendRedirect⽅法,在调⽤它们之前,都不能有内容已经被实际输出到了客户端。

如果缓冲区中已经有了⼀些内容,这些内容将被从缓冲区中移除。

可以这么理解: 转发相当于,张三向你借钱,但是你兜⾥没钱,所以你去找李四借到钱之后借给张三。

对于张三⽽⾔并不知道你的钱是和李四借的。

重定向相当于,张三向你借钱,你兜⾥没钱,你告诉他李四有钱,所以张三再次去找李四借钱。

2. 调⽤⽅式转发和重定向在Java中的⽅法如下:request.getRequestDispatcher("/SecondServlet?addParam=newParam").forward(request, response);response.sendRedirect("/WebSocket/SecondServlet"); WebSocket相当于项⽬名称,SecondServlet是具体的servlet请求。

JSP中的请求转发与重定向

JSP中的请求转发与重定向

JSP中的请求转发与重定向在说请求转发和重定向之前,得了解下JSP九⼤内置对象中的response和request response:将服务器端数据发送到客户端,可通过在客户端浏览器中显⽰,⽤户浏览页⾯的重定向以及在客户端创建Cookies等实现; 重定向:response.sendRedirect(url) (把响应发送到另⼀个指定的页⾯进⾏处理)。

request:可以对在客户请求中给出的信息进⾏访问,包含了所有有关当前浏览器的请求信息。

请求转发:request.getRequestDispatcher(url).forward(request,response)。

差异:1. 请求的次数:重定向⽐请求转发多请求⼀次,下⾯以例⼦说明。

如果现在有⼀个需求:A⾸先向B发出请求,然后B再向C发出请求。

先看重定向⽅式(B->C):⾸先A向B发出请求(第⼀次),然后B通过重定向的⽅式跳转到C,但不会直接向C发出请求,⽽是先返回到A,通过A向C 发出请求(第⼆次),具体看下⾯这张图。

然后看请求转发⽅式(B->C):⾸先A向B发出请求(第⼀次),然后B通过请求转发的⽅式跳转到C,这就不会通过A来跳转,⽽是B⾃⼰直接向C发出请求,具体看下⾯这张图。

2.地址栏是否改变:(还是以上⾯的A.jsp,B.jsp,C.jsp为例)如果现在A要请求B,然后B要请求C。

3.是否保留第⼀次请求时的数据:再说保留数据之前,先复习⼀下4种范围对象:pageContext,request,session,application(范围越来越⼤,造成的性能损耗也越⼤,所以尽量使⽤最⼩的)这四种范围对象有⼏个很重要的共同的⽅法:(⽆论是重定向还是请求转发都要使⽤到 setAttribute来赋值和 getAttribute来取值,只不过前者是session调⽤并且⽤session来取得数据,后者是request调⽤并且⽤request取得数据)Object getAttribute(String name);//根据属性名返回属性值,注意返回类型 void setAttribute(String name,Object obj);//根据属性名设置属性值,如果没有改属性,则新建⼀个属性,然后赋值void removeAttribute(string name);//根据属性名删除属性值1. pageContext:仅仅是当前页⾯有效(只要跳转了,就失效,null),下⽅的代码就会输出world1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>2<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">3<html>4<head>5<title>test</title>6</head>7<body>8 <%9 pageContext.setAttribute("hello", "world");10 %>1112 <%=pageContext.getAttribute("hello")%>13</body>14</html>2. request:同⼀次请求有效(⽐如请求转发,就是同⼀次请求,⽽重定向属于两次请求),下⽅的代码就是通过请求转发的⽅式传送数据,也就是说请求转发会保存数据(即使B.jsp再次跳转到其他页⾯,通过request还是可以取到数据)1<!-- A.jsp -->2 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>3<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">4<html>5<head>6<title>test</title>7</head>89<body>10 <%11 request.setAttribute("hello", "world");12 request.getRequestDispatcher("B.jsp").forward(request,response);13 %>1415</body>16</html>1<!-- B.jsp -->2 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>3<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">4<html>5<head>6</head>78<body>9 <%=request.getAttribute("hello")%>10</body>11</html>但如果利⽤重定向的⽅式跳转到B.jsp,将不会把数据传过去,但如果还是想⽤重定向,可以利⽤下⾯这个内置对象session3. session:同⼀次会话有效(只要浏览器不关,都属于同⼀次会话,⽆论是重定向还是请求转发,都有效;关闭或切换浏览器后⽆效;),session是存在于服务器端的,所以如果使⽤重定向的⽅式跳转,可以利⽤session来获取数据(并不是重定向传了数据,⽽是获取了服务器端的数据)1<!--A.jsp -->2 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>3<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">4<html>5<head>6<title>test</title>7</head>89<body>10 <%11 session.setAttribute("hello", "world");12 response.sendRedirect("B.jsp");13 %>14</body>15</html>1<!-- B.jsp -->2 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>3<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">4<html>5<head>6</head>7<body>8 <%=session.getAttribute("hello")%>9</body>10</html>4. application:全局变量,整个项⽬运⾏期间都有效(浏览器切换仍然有效,但关闭浏览器后在启动浏览器是⽆效的),但只对当前项⽬有效(其他项⽬是⽆法访问的)此处不贴代码。

详细聊聊SpringMVC重定向与转发

详细聊聊SpringMVC重定向与转发

详细聊聊SpringMVC重定向与转发⽬录重定向和转发常⽤处理⽅式String 重定向ModelAndView 重定向RedirectView 重定向带参跳转redirect 和 forward 的区别附:请求转发与重定向的区别图例总结重定向和转发重定向经过客户端,⽽转发没有,因此相对来说转发更快速。

但有时采⽤重定向更⽅便,如:1. 重定向到外部⽹站;2. 避免⽤户重新加载页⾯时再次调⽤同样的动作。

return "redirect:/view/"+saveUser.getId();这⾥使⽤重定向来防⽌当前⽤户重新加载页⾯时'''saveUser'''被⼆次调⽤。

但是使⽤重定向⽆法轻松地给⽬标页⾯传值,因此,在Spring3.1后提供了Flash属性,详情见后⽂。

常⽤处理⽅式Controller 视图⽅法间的跳转,⽆⾮就是带参跳转和不带参跳转。

常⽤的⽅法有通过 String 映射 RequestMapping 实现重定向,或者通过 ModelAndView 对象,⼜或者是 RedirectView 对象,下⾯逐⼀说明。

String 重定向是 return 映射到另⼀个 Controller ⽅法的字符串。

如果有请求参数,就拼接在 RequestMapping 映射的字符串后⾯。

// 返回字符串映射的⽅式@RequestMapping("hello")public String hello(HttpServletRequest req, HttpServletResponse resp) {doSomething();return "redirect:/bye";// return "redirect:/bye?username=sudoz";}ModelAndView 重定向另⼀种⽅法是通过返回 ModelAndView 对象来实现跳转。

转发与重定向

转发与重定向

深入理解Servlet/JSP之“转发和重定向”闻听“Bear”同学求职之时被问及“Servlet/JSP之间转发和重定向有何区别?”其实此问题不甚高明,但凡要谈区别的,必然二者非常相似并略有不同。

“转发”和“重定向”本质相差甚远,答此问题只需言明二者分别为何物即可。

一、转发转发的原理,可以通过下图展示:浏览器的请求发送给组件1,组件1经过一些处理之后,将request和response对象“传递”给组件2,由组件2继续处理,然后输出响应(当然,也可以继续向其他组件“传递”),这个传递的过程称之为“转发”。

整个过程只涉及一次浏览器和服务器之间的“请求-响应”,转发过程中的组件共享同一个请求(request)和响应(response)对象。

转发的意义在于可以实现组件的“分工”。

在基于MVC,多层结构的Web应用中,经常需要多个组件协同完成一次“请求-响应”工作,例如:用户要获取“设备列表信息”,提交请求至控制器组件(Servlet),该Servlet调用适当的JavaBean获取了“设备列表”数据然后再转发至JSP组件去显示信息。

RequestDispatcher对象封装了转发操作。

通过request的getRequestDispatcher(String path)方法获得RequestDispatcher对象,其中String类型参数path表示要转发到的地址。

调用Dispacther 对象的forward(request, response)方法实现转发。

关于转发的具体操作,有如下几点需要注意:1、转发只能在同一个应用的组件之间进行,不可以转发给其他应用的地址。

2、转发的地址可以用“相对地址”方式,也可以用“绝对地址”方式。

但需要注意的是:用绝对地址方式时,应从应用名后(Context path)开始。

例如:要转发到的地址为:(其中tst为应用名),对应的绝对地址为:“/jsp/somewhere.jsp”。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

转发与重定向的区别
我们知道,请求转发和请求包含都是在一个请求内,涉及到多个Servlet。

既然转发和包含都在一个请求内,那么说明多个Servlet共用同一个request对象和response对象。

这个时候就存在request域。

1.request域
Servlet的三大域对象:request,session,application。

其中request域是三大域对象中范围最小的域对象,application对象其实就是ServletContext对象,在ServletContext功能详解中我们对它的域功能做了详细的介绍;session域会在后面学习。

request域只会在请求转发和请求包含时存在。

它的域范围就是整个请求链,如图1-1所示。

例如:由AServlet请求转发到BServlet,这时在AServlet中向request域中存放数据,然后在BServlet中从request 域中获取数据。

如果BServlet又转发给其他的Servlet,那么在其他Servlet中也可以从request域中获取数据。

转发过程中经过的这些Servlet都在一个请求链中。

图1-1请求转发
2.request域相关方法介绍
以后只要是域对象,那么它必然会有以下三个方法:
●void setAttribute(String name,Object value)
该方法是向域中保存域属性,例如:setAttribute(“username”,”zhangsan”),其中,username 是域属性的名称,zhangsan是域属性的值。

如果多次调用该方法,且属性名称相同,那么后保存的数据会覆盖先保存的数据。

●Object getAttribute(String name)
该方法是根据属性名称从域中获取域属性的值,如果之前没有调用setAttribute()方法保存数据,那么调用getAttribute()方法返回值是null。

●void removeAttribute(String name)
该方法是从域中移出指定名称的域属性,如果该名字的域属性不存在,则该方法什么都不做。

3.域属性和请求参数的区别
很多人在学习域属性的时候会将域属性和请求参数弄混淆,认为域属性就是请求参数。

其实这个认知是错误的。

下面我们来看域属性和请求参数有哪些区别:
(1)来源不同
请求参数是由客户端发送给服务器的,而域属性是在服务器内部,在Servlet中向域中添加的;
(2)相关方法不同
请求参数只能获取,不能修改、删除和添加,而域属性在获取的基础上还可以添加和删除。

为了让大家更加直观的区分它们,下面我们来看一张图,图1-2:
图1-2请求参数和域属性的区别
由图1-2可知,域属性是请求转发或请求包含时,在Servlet之间传递的数据。

4.请求转发和重定向的区别
在学习重定向时,我们已经了解了重定向的一些特点,现在根据请求转发的特性,我们将请求转发和重定向做了以下比较:
(1)请求转发是一次请求一次响应,而重定向是两次请求两次响应;
(2)请求转发地址栏不会改变,而重定向地址栏会显示第二次请求的地址;
(3)请求转发只能转发给本项目的其他资源,而重定向不仅可以重定向到本项目的其他资源,还可以重定向到其他项目;
(4)请求转发是服务器端的行为,转发时只需要给出转发的资源路径即可,如Servlet的访问路径;而重定向需要给出全路径,即路径要包含项目名;
(5)请求转发比重定向的效率高,因为请求转发是一个请求。

在以后的开发中,如果需要地址栏的地址发生改变,就选择重定向;如果需要在Servlet之间通过request 域进行数据通信,就选择请求转发。

下面通过一个案例来了解request域属性的设置和获取,如下所示:
(1)创建web应用,Example11,在该应用下新建一个Servlet类,FirstServlet,主要代码如例1-1所示:
例1-1FirstServlet.java
public class FirstServlet extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
System.out.println("FirstServlet...");
request.setAttribute("username","zhangsan");
request.getRequestDispatcher("/SecondServlet").forward(request,
response);
}
}
例1-1中,先在控制台打印“FirstServlet…”,然后向request域中添加域属性,最后再进行转发。

需要注意的是,添加域属性的代码不能放在转发代码的后面,否则在SecondServlet中将会获取不到域属性。

(2)再次新建一个Servlet类,SecondServlet,主要代码如例1-2所示:
例1-2SecondServlet.java
public class SecondServlet extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
System.out.println("SecondServlet...");
System.out.println(request.getAttribute("username"));
}
}
例1-2中,先在控制台上打印“SecondServlet…”,再打印从域中取出的域属性的值。

(3)FirstServlet在web.xml中的访问路径配置为:“/FirstServlet”;SecondServlet在web.xml中的访问路径配置为:“/SecondServlet”。

(4)将Example11发布到Tomcat中,然后启动服务器,在浏览器地址栏上输入:http://localhost:8080/Example11/FirstServlet,控制台打印结果如图1-3所示:
图1-3控制台打印结果
request域在请求转发和请求包含时存在,因为转发和包含都是在同一个请求中,而重定向是两个请求,
当我们在第一个请求中,往request域中存放数据,当发送第二次请求时,服务器又会创建一个新的request 对象,由于第一个request对象就已经死亡,所以它里面的域属性自然也就不存在了。

相关文档
最新文档