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分装的⼀些类和⽅法。
java redirect 的实现过程

java redirect 的实现过程Java中的重定向(redirect)是一种常见的技术,用于在Web应用程序中将用户请求从一个URL转发到另一个URL。
在本文中,我们将详细讨论Java中实现重定向的过程,从而帮助读者深入了解这一机制。
一、重定向的基本概念重定向是一种将用户请求从一个URL转发到另一个URL的机制。
它在Web开发中非常常见,用于实现各种功能,如页面跳转、登录验证以及错误处理等。
重定向通常使用HTTP的302状态码来代表请求的转发操作。
当浏览器收到服务器返回的302状态码时,会自动向新的URL发起请求。
二、在Servlet中实现重定向在Java的Web应用程序中,我们通常使用Servlet来处理用户的请求和响应。
Servlet提供了重定向的方法,使我们能够方便地实现该功能。
1. 使用HttpServletResponse对象进行重定向在Servlet中,我们可以通过HttpServletResponse对象的sendRedirect方法来实现重定向。
首先,我们需要在Servlet中获取该对象,可以通过doGet或doPost方法的参数来获取。
然后,调用sendRedirect方法并传入目标URL,即可完成重定向。
以下是一个简单的示例:javaprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.sendRedirect("targetURL");}2. 使用RequestDispatcher对象进行重定向除了使用HttpServletResponse对象进行重定向外,Servlet还提供了RequestDispatcher对象来实现跳转。
RequestDispatcher对象可以将请求转发给另一个Servlet或JSP页面,从而实现重定向的效果。
Servlet 跳转 redirect与forward跳转的区别

Servlet 跳转redirect与forward跳转的区别Servlet:当然,在servlet中,一般跳转都发生在doGet, doPost等方法里面。
一、原理1) redirect 方式response.sendRedirect("/a.jsp");页面的路径是相对路径。
sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如:response.sendRedirect("");跳转后浏览器地址栏变化。
这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。
这种方式是在客户端作的重定向处理。
该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。
该方法可以接受绝对的或相对的URLs。
如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。
public void doPost(HttpServletRequestrequest,HttpServletResponse response) throws ServletException,IOException {response.setContentType("text/html; charset=UTF-8");response.sendRedirect("/index.jsp");}2) forward方式RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp");dispatcher .forward(request, response);页面的路径是相对路径。
转发和重定向路径问题

转发和重定向路径问题精髓:开发过程中建议使⽤绝对路径。
“/”使⽤的三个最重要的地⽅: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()⽅法获得。
总结JSP与servlet之间的传值

总结JSP与servlet之间的传值JSP与servlet之间的传值有两种情况:JSP -> servlet,servlet -> JSP。
通过对象request和session (不考虑application)完成传值。
一、JSP -> servletJSP页面有3种方法向servlet传值:form表单、URL 、其他<!-- JSP page -->...<%......session.setAttribute("testSession","Hello session");reqeust.setAttribute("testRequest","Hello request");%><a href="JspServlet?action=toServlet">click me</a><form action="JspServlet?action=toServlet" method="post" name="form"><input name="username" type="test" /><input type="submit" value="submit"></form>...1、对于该JSP页面form表单的内容,如<input>标签,在servlet可用request.getParameter("username");获取。
2、URL:比如这里的<a>标签的href属性与<form>标签的action属性的值"JspServlet?action=toServlet",在servlet同样用request.getParameter("action")获取;所要注意的是这里的url 要和servlet在web.xml里的<url-pattern>标签的路径所对应。
请求转发与重定向的区别

请求转发(Forward)和重定向(Redirect)之间区别与联系一个比喻:小张向小李发送一次请求,想让他完成某项工作,当小李接受到请求时,发现自己完成不了,又请求小王帮忙,小王接收到小李请求之后最终完成了该项工作,并把最后的结果交给了小张。
这个过程就是请求转发,在此期间,小张只发送了一次请求,他只知道把任务交给了小李,至于小李是如何完成的,小张并不知道,他只等待最终的结果。
重定向则不同,首先小张向小李发送请求,想让他完成某项工作,当小李接收到这个请求时,发现自己完成不了,他立即通知小张,并推荐小王可以完成任务,于是小张又联系小王,最终小王完成了该项任务。
区别:1、浏览器地址栏显示不同(表面区别)无论进行多少次请求,如果使用请求转发来实现,浏览器地址栏中只显示第一次发送请求的地址;如果使用重定向来实现,浏览器地址栏显示的是每次请求的新地址。
这只是表面上看到的不同地方。
2、组件之间可否共享信息不同(本质区别)从本质上讲,请求转发时,从发送第一次到最后一次请求的过程中,WEB容器只创建一次request和response对象,请求之间始终共享这两个对象,所以每个请求可以访问他之前请求中的参数和属性的值;而重定向时,浏览器每发送一次请求,WEB容器都会重新创建新的request和response对象,所以请求之间不能共享信息,即不能在请求中访问到他之前请求中的参数和属性的值。
3、实现方式不同请求转发的实现步骤:•说明将要转发的资源;•获取请求转发的对象;•调用请求转发对象中forward()方法Java代码1.String forward = "/a.jsp";2.RequestDispatcher rd = request.getRequestDispatcher(forward);3.rd.forward(request, reponse);重定向的实现步骤:•说明将要重定向的资源;•调用response对象中sendRedirect方法Java代码1.String resource = request.geContextPath() + "/a.jsp";2.response.sendRedirect(resource);4、知情人不同请求转发时转发的过程只有WEB服务器知道,而浏览器不知道进行了多少次转发,以及都转发给哪些组件(servlet,JSP),它只是在等待WEB服务器最终的结果。
重定向和转发的区别

重定向和转发的区别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引擎把该JSP文件转换成为一个servlet。
而这个引擎本身也是一个servlet,在JSWDK或WEBLOGIC中,它就是JspServlet。
JSP引擎先把该JSP文件转换成一个Java源文件,在转换时如果发现jsp文件有任何语法错误,转换过程将中断,并向服务端和客户端输出出错信息;如果转换成功, JSP引擎用javac把该Java源文件编译成相应的class文件。
然后创建一个该SERVLET的实例,该SERVLET的jspInit()方法被执行,jspInit()方法在servlet的生命周期中只被执行一次。
然后jspService()方法被调用来处理客户端的请求。
对每一个请求,JSP 引擎创建一个新的线程来处理该请求。
如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。
每个客户端请求对应一个线程。
以多线程方式执行可大大降低对系统的资源需求,提高系统的并发量及响应时间.但应该注意多线程的编程限制,由于该servlet始终驻于内存,所以响应是非常快的。
如果.jsp文件被修改了,服务器将根据设置决定是否对该文件重新编译,如果需要重新编译,则将编译结果取代内存中的servlet,并继续上述处理过程。
虽然JSP效率很高,但在第一次调用时由于需要转换和编译而有一些轻微的延迟。
此外,如果在任何时候如果由于系统资源不足的原因,JSP引擎将以某种不确定的方式将servlet从内存中移去。
当这种情况发生时jspDestroy()方法首先被调用, 然后servlet实例便被标记加入"垃圾收集"处理。
jspInit()及jspDestory()格式如下:可在jspInit()中进行一些初始化工作,如建立与数据库的连接,或建立网络连接,从配置文件中取一些参数等,在jspDestory()中释放相应的资二、服务端的输出缓冲区缺省情况下:服务端要输出到客户端的内容,不直接写到客户端,而是先写到一个输出缓冲区中.只有在下面三中情况下,才会把该缓冲区的内容输出到客户端上:三、服务端输出重定向有以下3种方法可以做到输出重定向:四、、JSP中正确应用类:应该把类当成JA VA BEAN来用,不要在<% %> 中直接使用. 如下的代码(1)经过JSP引擎转化后会变为代码(2):从中可看出如果把一个类在JSP当成JA V A BEAN 使用,JSP会根据它的作用范围把它保存到相应的内部对象中.如作用范围为request,则把它保存到request对象中.并且只在第一次调用(对象的值为null)它时进行实例化. 而如果在<% %>中直接创建该类的一个对象,则每次调用JSP时,都要重新创建该对象,会影响性能.五、JSP的调试JSP的调试比较麻烦,特别是当bean是在一个session中存在时,更加困难。
Jsp页面跳转和js控制页面跳转的几种方法

Jsp页⾯跳转和js控制页⾯跳转的⼏种⽅法Jsp 页⾯跳转的⼏种⽅法1. RequestDispatcher.forward()在服务器端起作⽤,当使⽤forward()时,Servlet engine传递HTTP请求从当前的Servlet或者是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);}或request.getRequestDispatcher(" /index.jsp ").forward(request, response);//转发到index .jspgetServletConfig().getServletContext().getRequestDispatcher("/index.jsp ").forward(request, response);//转发到 index .jsp通常在servlet中使⽤,不在jsp中使⽤。
Java考试题2

选择题(没有注明多选,则为单选),每题2分1.下面哪个不是Form的元素? ( )A.Input B: textarea C: select D: table2. HTML页面中,下面哪个表示空格( )A.&B. C.©D.<3.<td align=”XXX”>中的align属性是什么含义? ( )A.加粗 B 斜体 C 对齐方式 D 边框样式4.单选按钮是下列哪一个? ( )A.<input name=”sex” type=”text” value=”0” />B. <input name=”sex” type=”checkbox” value=”0” />C. <input name=”sex” type=”option” value=”0” />D.<input name=”sex” type=”radio” value=”0” />5.下边哪个不是JSP内置对象? ( )A.Session B request C cook D out6.下边哪个是JSP指令标记( )A.<%……%>B. <%!……%>C. <%@……%>D.<%=……%>7.当在JSP文件中要使用到ArrayList对象时,应在JSP文件中加入以下哪个语句?( )A.<jsp:include file=”java.util.*” />B. <jsp:include page=”java.util.*” />C. <%@ page import=”java.util.*” />D.<%@ page include=”java.util.*” />8.关于JavaBean的说法,哪个是正确的?( )A.JavaBean的具体类可以不是public的B.JavaBean可以只提供一个带参数的构造器C.JavaBean可以象Html标记一样不关闭D.JavaBean可以保存状态9. JavaBean的生命周期中,哪个是用来跟踪用户会话的( )A.sessionB.requestC.pageD.application10.要在session对象中保存属性,可以使用以下哪个语句( )A.session.getAttribute(“key”,”value”)B.session.setAttribute(“key”,”value”)C.session.setAttribute(“key”)D.session.getAttribute(“key”)11.Jsp:forward 和sendredirect 都是用来做页面跳转的,描述错误的是?( )A.forward之后可以使用原来的request对象,而且效率更高。
servlet的两种重定向方法的区别及应用

servlet的两种重定向方法的区别及应用一问题:在servlet/JSP编程学习中,发现有两种方法可以实现服务端输出重定向,一种是通过forward方法(例如JSP中的<jsp:forwardpage=”OtherPage.jsp”/>),另一种则是通过运用javax.servlet.http.HttpServletResponse接口的sendRedirect方法(例如response.sendRedirect(“OtherPage.jsp”);这两种方法有什么区别和联系呢?让我们看下面的分析。
二分析:(1)<JSP:FORWORD>该方法是利用服务器端先将数据输出到缓冲区的机制,在把缓冲区(buffer)的内容发送到客户端之前,原来的不发送,改为发送该页面的内容,如果在<JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意.补充知识:输出缓冲区缺省情况下:服务端要输出到客户端的内容,不直接写到客户端,而是先写到一个输出缓冲区中.只有在下面三中情况下,才会把该缓冲区的内容输出到客户端上:1该JSP网页已完成信息的输出2输出缓冲区已满3JSP中调用了out.flush()或response.flushbuffer()输出缓冲区的大小可以用:<%@page buffer="none"|"nkb"%>或response.setBufferSize()设置,如下:1设置输出缓冲区的大小为1KB。
<%@page buffer="1kb"%>或response.setBufferSize(1);2设置输出缓冲区的大小为0,即不缓冲。
<%@page buffer="none" %>或response.setBufferSize(0);用response.getBufferSize()或out.getBufferSize()可取的输出缓冲区的大小,单位为字节.用response.isCommitted()可检查看服务端是否已将数据输出到客户端. 如果返回值是TRUE则已将数据输出到客户端,是FALSE则还没有。
转发与重定向

深入理解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”。
JSP面试题及答案

JSP面试题及答案1.浏览器jsp,html之间的关系1.JSP与Java Servlet一样,是在服务器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览2.在大多数Browser/Server结构的Web应用中,浏览器直接通过HTML或者JSP的形式与用户交互,响应用户的请求3.JSP在服务器上执行,并将执行结果输出到客户端浏览器,我们可以说基本上与浏览器无关2.自定义标签要继承哪个类这个类可以继承TagSupport或者BodyTagSupport,两者的差别是前者适用于没有主体的标签,而后者适用于有主体的标签。
如果选择继承TagSupport,可以实现doStartTag和doEndTag两个方法实现Tag 的功能,如果选择继承BodyTagSupport,可以实现doAfterBody这个方法。
3.过滤器Filter的作用及配置过滤器的作用:过滤器是一个对象,可以传输请求或修改响应。
它可以在请求到达Servlet/JSP之前对其进行预处理,而且能够在响应离开Servlet/JSP之后对其进行后处理。
所以如果你有几个Servlet/JSP需要执行同样的数据转换或页面处理的话,你就可以写一个过滤器类,然后在部署描述文件(web.xml)中把该过滤器与对应的Servlet/JSP联系起来。
你可以一个过滤器以作用于一个或一组servlet,零个或多个过滤器能过滤一个或多个servlet。
一个过滤器实现java.servlet.Filter接口并定义它的三个方法:1.void init(FilterConfig config) throws ServletException:在过滤器执行service前被调用,以设置过滤器的配置对象。
2 void destroy();在过滤器执行service后被调用。
3 Void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;4.forward,与redirect 的区别?有哪些方式实现forward是把另一个页面加载到本页面,不改变浏览器的路径,redirect是跳转到另一个页面,会改变浏览器的路径重定向: response.sendRedirect("重定向的路径")转发: request.getRequestDispatcher("转发路径").forward(request, response);5.jsp内置对象和作用?有九个内置对象:request、response、out、session、application、pageContext、config、page、exception作用如下:(1) HttpServletRequest类的Request对象作用:代表请求对象,主要用于接受客户端通过HTTP协议连接传输到服务器端的数据。
- 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了。