Servlet_JSP服务器端的重定向
重定向和转发的代码

重定向和转发的代码
重定向和转发是Web应用开发中常用的两种跳转方式。
重定向指的是服务器向客户端返回一个特殊的响应,告诉客户端要跳转到另一个URL。
这个过程经常用于一些需要跳转到其他页面来完成一定操作的场景,比如用户登录后跳转到个人中心页面。
重定向的过程中,客户端发送一个请求给服务器,服务器向客户端返回一个HTTP响应,告诉客户端去请求另一个URL。
由于是两次请求,所以重定向会产生较大的网络开销。
重定向的实现方式,可以使用服务器端的Forward和Redirect。
转发是指服务器接收到客户端的一个请求,然后将该请求交给另一个组件(比如另一个servlet、jsp或者html页面)来处理,处理完成之后再将结果返回给客户端。
转发过程不会像重定向那样生成多余的请求,因此相对于重定向而言,转发的性能开销会更小。
在实现转发的时候,服务器端所采用的技术是
request.getRequestDispatcher().forward()方法。
以下是Java Web中实现重定向和转发的代码:
1. 重定向
//使用response对象重定向
response.sendRedirect("要跳转到的URL");
2. 转发
//使用request对象转发
request.getRequestDispatcher("要转发的页面
").forward(request, response);
在实际开发过程中,需要根据具体的需求选择何种跳转方式。
重定向适用于有状态转移的操作,转发适用于访问同一Web应用内的不同资源,如多个servlet之间的跳转。
重定向

重定向1.什么是重定向所谓的重定向是将请求重新定个方向转到其他位置。
例如,客户端访问AServlet,然后立刻自动访问BServlet。
这个过程其实就是重定向。
下面通过一张图来了解重定向,如图1-1所示:客户端Aservlet Bservlet1.客户端请求Aservlet2.Aservlet响应302状态码及Location:…/Bservlet3.客户端请求Bservlet4.Bservlet响应给客户端图1-1 重定向由图1-1可知,重定向共有两次请求,两次响应。
当客户端接收到AServlet的响应之后立刻去请求BServlet,这个过程很迅速。
可以发现,地址栏发生变化,由AServlet变成BServlet。
2.重定向案例练习了解了重定向的原理,现在使用302状态码和Location响应头来完成重定向案例,具体步骤如下所示:(1)创建web应用,Example02。
在该应用下新建一个Servlet类,LocationServlet,代码如例1-1所示:例1-1 LocationServlet.javapublic class LocationServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("LoactionServlet......");response.setHeader("Location", "/Example02/TargetServlet");response.setStatus(302);}}例1-1中,Location 响应头的值为”/Example02/TargetServlet ”。
Java请求转发和重定向的区别

Java请求转发和重定向的区别Java请求转发和重定向的区别1、请求转发:request.getRequestDispatcher(URL地址).forward(request, response)处理流程:1. 客户端发送请求,Servlet做出业务逻辑处理。
2. Servlet调⽤forword()⽅法,服务器Servlet把⽬标资源返回给客户端浏览器。
2、重定向:response.sendRedirect(URL地址)处理流程:1. 客户端发送请求,Servlet做出业务逻辑处理。
2. Servlet调⽤response.sendReadirect()⽅法,把要访问的⽬标资源作为response响应头信息发给客户端浏览器。
3. 客户端浏览器重新访问服务器资源xxx.jsp,服务器再次对客户端浏览器做出响应。
3、转发和重定向的区别:1、转发使⽤的是getRequestDispatcher()⽅法; 重定向使⽤的是sendRedirect();2、转发:浏览器URL的地址栏不变。
重定向:浏览器URL的地址栏改变。
request.getRequestDispatcher()是容器中控制权的转向,在客户端浏览器地址栏中不会显⽰出转向后的地址;服务器内部转发,整个过程处于同⼀个请求当中。
response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。
这样,从浏览器的地址栏中可以看到跳转后的链接地址。
不在同⼀个请求。
重定向,实际上客户端会向服务器端发送两个请求。
所以转发中数据的存取可以⽤request作⽤域:request.setAttribute(), request.getAttribute(),重定向是取不到request中的数据的。
只能⽤session。
3、转发是服务器⾏为,重定向是客户端⾏为;4、转发是浏览器只做了⼀次访问请求。
重定向是浏览器做了⾄少两次的访问请求;5、转发2次跳转之间传输的信息不会丢失,重定向2次跳转之间传输的信息会丢失(request范围)6、RequestDispatcher是通过调⽤HttpServletRequest对象的getRequestDispatcher()⽅法得到的,是属于请求对象的⽅法。
JavaWeb网站设计期末复习资料-简答题

1、请列举至少5种javaEE技术,并简述其作用。
解析:javaEE是一系列的技术,主要包扩13种。
对于开发人员来说,了解几种主要的技术是非常必要的,例如JDBC、JSP、Servlet、XML、JNDI、JMS、JTA等。
参考答案:(1)JDBC(Java Database Connectivity):用来访问数据库的API。
(2)JavaServlet :是一种小型的Java程序,扩展了web服务器的功能。
(3)JSP(Java Server Pages):JSP页面由HTM代码和嵌入其中的Java代码组成,用来实现动态视图。
(4)JNDI(Java Name and Directory Interface): JNDI API被用于访问名字和目录服务。
(5)EJB(Enterprise JavaBean):实现业务逻辑的组件,可以构成分布式系统。
(6)RMI(Remote Method Invoke):调用远程对象方法。
(7)Java IDL/CORBA:将Java和CORBA集成在一起。
(8)XML(Extensible Markup Language):可以用它来定义其他标记语言的语言。
(9)JMS(Java Message Service):用于和消息中间件相互通信的API。
(10)JTA(Java Transaction Achitecture):一种标准的API,可以访问各种事务管理器。
(11)JTS(Java Transaction Service):是CORBA OTS事务监控的基本实现。
(12)JavaMail:用于存取邮件服务的API。
(13)JAF(JavaBeans Activation Framework):JavaMail利用JAF来处理MIME编码的邮件附件。
2、在web.xml文件中配置Servlet时,主要配置哪些信息?解析:使用IDE开发Servlet时,配置信息可以通过可视化方式定义。
转发重定向例子

转发重定向例子【篇一:转发重定向例子】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请求转发和重定向

•请求转发☐请求转发是指将请求再转发到另一资源(一般为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共享的对象在应用程序的生存期中可被访问。
理解客户端重定向(Redirect)和服务端重定向(Dispatch)

理解客户端重定向(Redirect)和服务端重定向(Dispatch)这是两个常常被放在⼀起进⾏⽐较的概念,今天对这两个概念再重新回顾⼀下,前者发⽣在客户端(浏览器),后者发⽣在服务器端?,因此也有⼈把前者称为客户端重定向,把后者称为服务器端重定向,虽然对于后者这种称谓并不算贴切。
本⽂原⽂链接:转载请注明出处!Redirect(客户端重定向)标准意义上的“重定向”指的是HTTP重定向,它是HTTP协议规定的⼀种机制。
这种机制是这样⼯作的:(没有涉及request,只有response)1. 当client向server发送⼀个请求、要求获取⼀个资源时,2. 在server接收到这个请求后发现请求的这个资源实际存放在另⼀个位置,3. 于是server在返回的response中写⼊那个请求资源的正确的URL,并设置reponse的状态码为301(表⽰这是⼀个要求浏览器重定向的response),4. 当client接受到这个response后就会根据新的URL重新发起请求。
重定向有⼀个典型的特症,即,当⼀个请求被重定向以后,最终浏览器上显⽰的URL往往不再是开始时请求的那个URL了。
这就是重定向的由来。
(解决了为什么需要重定向这个功能?)http重定向的⼀种典型应⽤是防⽌表单重复提交,其原理是:假如当前是⼀个⽤户信息编辑页⾯,表单通过Post提交给saveUser.action, 当该请求提交后,可返回⼀个重定向的response,地址可以是viewUser.action,即定向到⽤户详情页⾯(不能修改和提交)。
当然这种防⽌页⾯重复提交的⽅法作⽤是有限的,如果⽤户返回表单页⾯,重新提交表单,或是⽤户在服务器端响应到达之前,多次点击提交按钮(可通过JavaScript控制提交按钮点击次数)等等。
在Servlet⾥,实现客户端重定向的⽅法是:response.sendRedirect()Dispatch(服务器端重定向)Dispatch(Forward)指的是服务器在处理request的过程中将request先后委托多个servlet或jsp接替进⾏处理的过程。
SpringMVC使用ModelAndView进行重定向

SpringMVC使⽤ModelAndView进⾏重定向1、Servlet重定向forward与redirect:使⽤servlet重定向有两种⽅式,⼀种是forward,另⼀种就是redirect。
forward是服务器内部重定向,客户端并不知道服务器把你当前请求重定向到哪⾥去了,地址栏的url与你之前访问的url保持不变。
redirect则是客户端重定向,是服务器将你当前请求返回,然后给个状态标⽰给你,告诉你应该去重新请求另外⼀个url,具体表现就是地址栏的url变成了新的url。
2、ModelAndView重定向:使⽤Spring MVC通常是使⽤ModelAndView⽤来返回视图。
ModelAndView其实也是⽀持Servlet中的两种重定向⽅式。
⽐如404页⾯我们⼀般采⽤redirect重定向⽅式,像下⾯的代码就是redirect重定向:public ModelAndView getPage404MV() {ModelAndView mv = new ModelAndView("redirect:/404.htm");return mv;}要使⽤forward重定向就只需把redirect换成forward即可,特别的ModelAndView默认使⽤forward重定向⽅式。
1. 需求背景需求:spring MVC框架controller间跳转,需重定向。
有⼏种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页⾯也能显⽰。
本来以为挺简单的⼀件事情,并且个⼈认为⽐较常⽤的⼀种⽅式,⼀百度全都有了,这些根本不是问题,但是⼀百度居然出乎我的意料,⼀堆都不是我想要的结果。
⽆奈啊,⾃⼰写⼀篇⽐较全都供以后⼤家⼀百度吧,哈哈哈。
是这些写的不是很全都⼈们给了我写这篇博客的动⼒。
2. 解决办法需求有了肯定是解决办法了,⼀⼀解决,说明下spring的跳转⽅式很多很多,我这⾥只是说⼀些⾃我认为好⽤的,常⽤的,spring分装的⼀些类和⽅法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Servlet/JSP服务器端的重定向服务器端的重定向RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect() 方法的区别是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。
这样,从浏览器的地址栏中可以看到跳转后的链接地址。
所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。
在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 HttpServletResponse.sendRequest()方法。
forward和redirect的区别答:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。
这样,从浏览器的地址栏中可以看到跳转后的链接地址。
所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。
在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。
a页面-------->b页面(-->代表两种方法的一种)a页面里有一个动作:request.setAttribute("temp",object);Response.forward()---->用这个方法到达b,可以在b里通过request.getAttribute("temp")得到存储的object对象,这个方法扩大了request里保存的值的作用范围;Response.redirect()---->用这个方法到达b,object对象将丢失。
如果想到达b页面(无论是哪个方法)而有想得到object对象,则最好将object对象保存在request.getSession()里,也就是Session对象里通常,在一个设计良好的Web应用中,都会综合使用Servlet和JSP技术。
Servlet控制业务流转,JSP则负责业务处理结果的显示。
此时,将大量用到重定向技术。
重定向技术可以分为两类,一类是客户端重定向,一类是服务器端重定向。
客户端重定向可以通过设置特定的HTTP头,或者写JavaScript脚本实现。
本文主要探讨服务器端重定向技术的实现。
服务器端的重定向相关类服务器端的重定向相关类服务器端的重定向技术涉及到javax.servlet.ServletContext、javax.servlet.RequestDispatcher、javax.servlet.http.ServletRequest、javax.servlet.http.ServletResponse等几个接口。
图1是这几个接口之间的关系图。
图 1重定向相关类关系图服务器端的重定向方式服务器端的重定向方式服务器端的重定向可以有两种方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法。
下面对这两种方式进行介绍。
HttpServletResponse.sendRedirect()方法方法HttpServletResponse.sendRedirect()方法HttpServletResponse接口定义了可用于转向的sendRedirect()方法。
代码如下: public void sendRedirect(ng.String location)throws java.io.IOException这个方法将响应定向到参数location指定的、新的URL。
location可以是一个绝对的URL,如response.sendRedirect("")也可以使用相对的URL。
如果location以“/”开头,则容器认为相对于当前Web应用的根,否则,容器将解析为相对于当前请求的URL。
这种重定向的方法,将导致客户端浏览器的请求URL 跳转。
从浏览器中的地址栏中可以看到新的URL 地址,作用类似于上面设置HTTP 响应头信息的实现。
RequestDispatcher.forward()RequestDispatcher.forward()方法方法方法RequestDispatcher 是一个Web 资源的包装器,可以用来把当前request 传递到该资源,或者把新的资源包括到当前响应中。
RequestDispatcher 接口中定义了两个方法,参见如下代码:public interface RequestDispatcher {void forward(ServletRequest request, ServletResponse response);void include(ServletRequest request, ServletResponse response);}forward()方法将当前的request和response 重定向到该RequestDispacher 指定的资源。
这在实际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。
比如,通常业务处理在Servlet 中处理,处理的结果转向到一个JSP 页面进行显示。
这样看起来类似于Servlet 链的功能,但是还有一些区别。
一个RequestDispatcher 对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个Servlet。
include()方法将把Request Dispatcher 资源的输出包含到当前输出中。
注意,只有在尚未向客户端输出响应时才可以调用forward()方法,如果页面缓存不为空,在重定向前将自动清除缓存。
否则将抛出一个IllegalStateException 异常。
如何得到RequestDispatcherRequestDispatcher有三种方法可以得到Request Dispatcher 对象。
1.javax.servlet. ServletRequest 的getRequestDispatcher(String path)方法,其中path 可以是相对路径,但不能越出当前Servlet 上下文。
如果path 以“/”开头,则解析为相对于当前上下文的根。
2.javax.servlet. ServletContext 的getRequestDispatcher(String path)方法,其中path 必须以“/”开头,路径相对于当前的Servlet 上下文。
可以调用ServletContext 的getContext(String uripath)得到另一个Servlet 上下文,并可以转向到外部上下文的一个服务器资源链接。
3.使用javax.servlet. ServletContext 的getNamedDispatcher(String name)得到名为name 的一个Web 资源,包括Servlet 和JSP 页面。
这个资源的名字在Web 应用部署描述文件web.xml中指定。
这三种方法的使用有细微的差别。
比如,下面是一个应用的配置文件web.xml:<?xml version="1.0" ?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN""/j2ee/dtds/web-app_2_2.dtd"><web-app><servlet><servlet-name>FirstServlet</servlet-name><servlet-class>org. javaresearch.redirecttest.ServletOne</servlet-class></servlet><servlet><servlet-name>SecondServlet</servlet-name><servlet-class>org.javaresearch. redirecttest.ServletTwo</servlet-class></servlet><servlet-mapping><servlet-name>FirstServlet</servlet-name><url-pattern>/servlet/firstservlet/</url-pattern></servlet-mapping><servlet-mapping><servlet-name>SecondServlet</servlet-name><url-pattern>/servlet/secondservlet/</url-pattern></servlet-mapping></web-app>其中定义了两个Servlet,名字分别为FirstServlet和SecondServlet,对应的类分别为org.javaresearch. redirecttest.ServletOne和org. javaresearch.redirecttest.ServletTwo。
可以在浏览器中通过类似于下面的链接访问:http://localhost:8080/servlet/firstservlet/使用1中方法,例如在firstservlet可以写入下面的代码:RequestDispatcher rd = request.getRequestDispatcher("secondservlet");rd.forward(request, response);此时控制权将转向到第二个Servlet了。