servlet的两种重定向方法的区别及应用
servlet跳转页面的几种方法
servlet跳转页面的几种方法一直对Servlet的几种页面跳转方式,理解的糊里糊涂的,今天在网上搜了一把,找到一遍比较好的,记下来,以后看看。
跳转分两部分,一是发生在servlet,一是在JSP,其实JSP也就是servlet,不过还是有点差异滴。
Servlet:当然,在servlet中,一般跳转都发生在doGet, doPost等方法里面。
1) redirect 方式response.sendRedirect("/a.jsp");页面的路径是相对路径。
sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如:response.sendRedirect("");跳转后浏览器地址栏变化。
这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。
2) forward方式RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp"); dispatcher .forward(request, response);页面的路径是相对路径。
forward方式只能跳转到本web应用中的页面上。
跳转后浏览器地址栏不会变化。
使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttributeJSP:1) response.sendRedirect();和servlet的response.sendRedirect()方式一样。
此语句前不允许有out.flush(),如果有,会有异常:ng.IllegalStateException: Can't sendRedirect() after data has committed to the client.atcom.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpRes ponse.java:558)...跳转后浏览器地址栏变化如果要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了;如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转;2) response.setHeader("Location","");此语句前不允许有out.flush(),如果有,页面不会跳转。
servlet请求方法
servlet请求方法Servlet是用Java编写的服务器端程序,它可以处理来自客户端(浏览器)的请求并生成相应的响应。
在Servlet中,我们可以使用不同的请求方法来处理不同类型的请求。
下面是一些相关参考内容,介绍了常用的Servlet请求方法。
1. doGet方法:doGet方法用于处理客户端的GET请求。
在这种情况下,查询字符串会被附加到URL后面,并且可以通过getParameter方法来访问这些参数的值。
这个方法通常用于获取信息,而不是对服务器上的数据进行修改。
例如,一个简单的例子可以是根据用户的请求来返回一个HTML页面。
2. doPost方法:doPost方法用于处理客户端的POST请求。
与GET请求不同,POST请求将数据作为请求体的一部分发送给服务器。
在Servlet中,可以使用getParameter方法来访问这些参数的值。
这个方法通常用于在服务器上创建或更改数据。
例如,当用户提交一个表单时,表单数据会通过POST请求发送给服务器。
3. doPut方法:doPut方法用于处理客户端的PUT请求。
PUT请求用于向服务器添加新的资源或更新现有资源。
在Servlet中,可以使用getInputStream方法来读取请求的正文,并使用请求参数来访问表单字段的值。
这个方法通常用于在服务器上更新数据。
4. doDelete方法:doDelete方法用于处理客户端的DELETE请求。
DELETE请求用于删除服务器上的资源。
在Servlet中,可以使用getParameter方法来访问请求参数的值。
例如,当用户点击"删除"按钮时,可以通过发送DELETE请求来删除特定的数据。
5. doOptions方法:doOptions方法用于处理客户端的OPTION请求。
OPTION请求用于获取服务器支持的请求方法、请求头字段和响应头字段。
在Servlet中,可以使用setHeader方法来设置响应头字段,并使用getHeader方法来获取请求头字段的值。
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()⽅法得到的,是属于请求对象的⽅法。
Servlet的应用
Servlet的应用一、Servlet的应用1. 一个Servlet类应该继承HttpServlet并且覆盖doGet或doPost方法,这取决于数据的发送方式是get 还是post。
若要在一个Servlet中同时处理get 和post请求,并且对每个请求的处理动作相同,可以简单地在doGet方法中调用doPost方法,反之亦然。
doGet和doPost方法都有两个参数:HttpServletRequest 和HttpServletResponse。
可以通过HttpServletRequest类提供的方法获得引入的信息,比如表单数据、客户主机名等;HttpServletResponse类提供输出信息的能力,比如,通过HttpServletResponse得到一个PrintWriter向客户发送文档内容。
2. doGet、doPost及其它doXxx方法是Servlet的主体,大部分时间都只用关心get和post 请求,所以只需覆盖doGet、doPost方法。
如果需要,也可以为处理delete请求而覆盖doDelete 方法;为处理put请求而覆盖doPut方法;为处理options请求而覆盖doOptions方法;为处理trace请求而覆盖doTrace方法。
注意,没有doHead方法,因为系统自动用状态列和header 设置来回复head 请求。
3. 一个简单的Servlet最主要的功能就是用println语句输出一个预期的页面。
因为doGet 和doPost会抛出两个异常,因此要引处相关的类:java.io——因为要用到PrintWriter等javax. servlet——因为要用到HttpServlet等javax. servlet.http——因为要用到HttpServletRequest 和HttpServletResponse等二、Servlet的编译、配置和调用1. 环境变量CLASSPA TH要包含了标准的Servlet类,比如:.;%JA V A_HOME%\lib\dt.jar;%JA V A_HOME%\lib\tools.jar;E:\Program Files\Apache SoftwareFoundation\T omcat 6.0\lib\servlet-api.jar2. 用“javac”命令编译Servlet,将生成的Servlet类(即.class 文件)放到正确路径,比如:ROOT\WEB-INF\classes3. 若生成的Servlet类(即.class文件)放在ROOT\WEB-INF\classes,则必须使用ROOT\WEB-INF目录下的web.xml文件进行注册。
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中请求转发和请求重定向的区别以及使⽤的⽂章就介绍到这了,更多相关请求转发和请求重定向内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
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和forward用法
Redirect和forward是网络通信中常用的两个概念,在网页设计和服务器端编程中经常会涉及到它们的使用。
本文将就这两个概念进行详细的解释和比较,以帮助读者更好地理解它们的用法和作用。
一、Redirect的用法1.1 定义Redirect是指将用户从一个URL位置区域自动重定向到另一个URL 位置区域。
当用户访问某个网页时,如果该网页已经被重定向到另一个URL,那么用户将会被自动跳转到新的URL位置区域上。
1.2 作用Redirect的主要作用是帮助全球信息站进行页面跳转,当某个网页位置区域发生变化或者需要将用户引导到其他页面时,可以通过Redirect来实现。
1.3 实现方式在服务器端编程中,可以通过HTTP响应头中的Location字段来实现Redirect。
当服务器收到一个请求后,如果需要进行重定向,就可以在响应头中添加Location字段,告诉浏览器要跳转的新位置区域。
二、Forward的用法2.1 定义Forward是指将用户请求转发到另一个URL位置区域,但是在浏览器位置区域栏中不会显示新的URL位置区域。
用户发送的请求会被服务器转发到另一个位置区域,但是用户并不会察觉到这一过程。
2.2 作用Forward的作用是实现服务器内部的页面跳转和数据传递。
在服务器端编程中,可以利用Forward将用户请求转发给其他处理程序,实现多个页面之间的数据共享和交互。
2.3 实现方式在Java的Servlet编程中,可以通过RequestDispatcher的forward 方法来实现Forward。
当服务器收到一个请求后,可以将该请求对象和响应对象传递给另一个Servlet,实现页面的内部转发和数据共享。
三、Redirect和Forward的区别3.1 URL位置区域Redirect会改变浏览器位置区域栏中的URL位置区域,而Forward 不会改变URL位置区域。
3.2 请求方式Redirect是通过GET方式发送新的请求,而Forward是在服务器内部完成的页面转发。
servlet请求转发的三种方式
servlet请求转发的三种方式servlet中的请求转发主要有三种方式:1、 forward:是指转发,将当前request和response对象保存,交给指定的url 处理。
并没有表示页面的跳转,所以地址栏的地址不会发生改变。
2、 redirect:是指重定向,包含两次浏览器请求,浏览器根据url请求一个新的页面,所有的业务处理都转到下一个页面,地址栏的地址会变发生改变。
3、 include:意为包含,即包含url中的内容,进一步理解为,将url中的内容包含进当前的servlet当中来,并用当前servlet的request和respose来执行url中的内容处理业务.所以不会发生页面的跳转,地址栏地址不会发生改变。
测试如下:首先编写三个html界面:分别是登录界面:login.html;登录成功界面:success.html;登录失败界面:fail.html.之后,处理登录逻辑的servlet类如下:Java代码运行后如果输入正确的用户名密码,则执行include方法,界面显示:include 包含。
登录成功!并且地址栏地址未改变,若是输入错误登录名或者密码,界面显示:登录失败!并且地址栏地址改变。
其中要注意的是sendRedirect方法中在要跳转的页面url前必须加上当前web程序路径名,这个路径通过request.getContextPath()可以得到。
如果吧其中include方法改为forward方法:Java代码登录时输入正确信息,则跳转的页面地址不变,显示:登录成功!不包含url中的内容。
总结如下:redirect与include、forward的区别在于是不是同一个Request,redirect会有两次交互。
include与forward的区别在于输出的内容,include包含本身servlet与跳转页面内容的结果,而forward不包含本身servlet的内容。
转发和重定向区别
转发和重定向区别页⾯跳转的两种实现⽅式:请求转发和重定向;请求转发:客户⾸先发送⼀个请求到服务器端,服务器端发现匹配的servlet,并指定它去执⾏,当这个servlet执⾏完之后,它要调⽤getRequestDispacther()⽅法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的,⽽且是在同⼀个请求⾥⾯完成的,因此servlet和jsp共享的是同⼀个request,在servlet⾥⾯放的所有东西,在student_list中都能取出来,因此,student_list能把结果getAttribute()出来,getAttribute()出来后执⾏完把结果返回给客户端。
整个过程是⼀个请求,⼀个响应。
重定向:客户发送⼀个请求到服务器,服务器匹配servlet,servlet处理完之后调⽤了sendRedirect()⽅法,⽴即向客户端返回这个响应,响应⾏告诉客户端你必须要再发送⼀个请求,去访问student_list.jsp,紧接着客户端收到这个请求后,⽴刻发出⼀个新的请求,去请求student_list.jsp,这⾥两个请求互不⼲扰,相互独⽴,在前⾯request⾥⾯setAttribute()的任何东西,在后⾯的request⾥⾯都获得不了。
可见,在sendRedirect()⾥⾯是两个请求,两个响应。
(服务器向浏览器发送⼀个302状态码以及⼀个location消息头,浏览器收到请求后会向再次根据重定向地址发出请求)请求转发:request.getRequestDispatcher("/test.jsp").forword(request,response);重定向:response.sendRedirect("/test.jsp");区别:1、请求次数:重定向是浏览器向服务器发送⼀个请求并收到响应后再次向⼀个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到⼀个新的地址;重定向⾄少请求两次,转发请求⼀次;2、地址栏不同:重定向地址栏会发⽣变化,转发地址栏不会发⽣变化;3、是否共享数据:重定向两次请求不共享数据,转发⼀次请求共享数据(在request级别使⽤信息共享,使⽤重定向必然出错);4、跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;5、发⽣⾏为不同:重定向是客户端⾏为,转发是服务器端⾏为;使⽤:1、可以利⽤request的域对象的特点,由源组件向其中存放写数据;2、可以让⽤户访问到存放在WEB-INF⽬录中的⽬标资源;3、重定向的速度⽐转发慢,因为浏览器还得发出⼀个新的请求,所以如果在使⽤转发和重定向都⽆所谓的时候建议使⽤转发;4、因为转发只能访问当前WEB的应⽤程序,所以不同WEB应⽤程序之间的访问,特别是要访问到另外⼀个WEB站点上的资源的情况,这个时候就只能使⽤重定向了。
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);页面的路径是相对路径。
web.xmlservlet、servlet-mapping配置
web.xmlservlet、servlet-mapping配置Servlet 常称为服务器端⼩程序,即运⾏在服务器端的程序,⽤于处理及响应客户的请求。
Servlet类是个特殊的java类,继承于HttpServlet。
---------------------------------------------------------------⽅法客户端通常只有GET和POST两种请求⽅式,Servlet为了响应则两种请求,必须重写doGet()和doPost()⽅法。
⼤部分时候,Servlet对于所有的请求响应都是完全⼀样的,此时只需要重写service()⽅法即可响应客户端的所有请求。
另外,HttpServlet还有两个⽅法:(1). init(ServletConfig config):创建Servlet实例时,调⽤该⽅法的初始化Servlet资源。
(2). destroy():销毁Servlet实例时,⾃动调⽤该⽅法的回收资源。
通常⽆需重写init()和destroy()两个⽅法,除⾮需要在初始化Servlet时,完成某些资源初始化的⽅法,才考虑重写init()⽅法,如果重写了init()⽅法,应在重写该⽅法的第⼀⾏调⽤super.init(config),该⽅法将调⽤HttpServlet的init()⽅法。
如果需要在销毁Servlet之前,先完成某些资源的回收,⽐如关闭数据库连接,才需要重写destory⽅法()。
---------------------------------------------------------------Servlet创建时机(1). 客户端第⼀次请求某个Servlet时,系统创建该Servlet的实例,⼤部分Servlet都是这种Servlet。
(2). Web应⽤启动时⽴即创建Servlet实例,即load-on-start Servlet。
---------------------------------------------------------------Servlet的⽣命周期(1). 创建Servlet实例。
转发和重定向路径问题
转发和重定向路径问题精髓:开发过程中建议使⽤绝对路径。
“/”使⽤的三个最重要的地⽅: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()⽅法获得。
转发(forward)和重定向(sendRedirect)
转发(forward)和重定向(sendRedirect)⼀. RequestDispatche是⼀个Web资源的包装器,可以⽤来把当前的Request传递给该资源,或者把新的资源包括到当前的相应中。
详细来说:RequestDispatch 对象从客户端获取请求request,并把他们传递到服务器上的servlet、html、jsp。
有两个⽅法,include()/forward()1. include()void include(ServletRequest request,ServletResponse response)⽤来记录保留request和response,以后不能再修改response⾥表⽰状态的信息。
2. forward() 转向void forward(ServletRequest request,ServletResponse response)// 1. 跳转到指定的页⾯“dealWith.jsp”;String url = "dealWith.jsp";//2. 获取请求转发器对象,该转发器的指向通过getRequestDisPatcher()的参数设置RequestDispatcher requestDispatcher = request.getRequestDispatcher(url);// 3. 执⾏跳转,将参数request和response传递给这个页⾯requestDispatcher.forward(request, response);⼆.重定向的两种⽅法⽐较:forward & sendRedirect1. HttpServletResponse.sendRedirect(location)1)作⽤:该⽅法将相应定向到参数location指定的新的URL。
2)location:可以是绝对地址,也可以是相对URL。
注意:Redirect能够防⽌某些情况下客户端Refresh造成的⼀些未知后果(例如连续删除)2. forward & sendRedirect ⽐较本质 地址栏显⽰数据共享运⽤地⽅效率⼯作流程forward 服务器请求资源,服务器直接访问⽬标地址的URL,读取该URL的相应内容,然后把这些内容再发给服务器不变(转发路径必须是同⼀个web容器下的URL)转发页⾯和转发到的页⾯可以共享request⾥⾯的数据.⼀般⽤于⽤户登陆的时候,根据⾓⾊转发到相应的模块.⾼⼀次请求sendRedirect 客户端⾏为,服务端根据逻辑,发送⼀个状态码,告诉浏览器重新去请求那个地址新的URL(Location可以是任意地址)不能共享⼀般⽤于⽤户注销登陆时返回主页⾯和跳转到其它的⽹站等.低⾄少两次请求其中两个动作的⼯作流程:1. 转发过程(forward):客户浏览器发送Http请求——>web服务器接受该请求——>调⽤内部的⼀个⽅法在容器内完成请求处理和转发动作——>将⽬标资源发送给客户上⾯直接转发请求的过程:1)浏览器向Servlet1发出请求2)Servlet1调⽤forward()⽅法,在服务器端将请求转发给Servlet23)最终由Servlet2做出相应举例:A向B借钱,B没有钱,向C借钱,借没有借到钱都会将消息回复给A在这⾥,转发的路径必须是同⼀个web容器下的url,其不能转向到其他的web路径上去,中间传递的是⾃⼰的容器内的request。
forward和redirect的区别
RequestDispatcher rd = new RequestDispatcher();
rd.forward(request, response);
跳转方式
http://localhost:8080/Test应用
运用forward方法只能重定向到同一个Web应用程序中的一个资源。而sendRedirect方法可以让你重定向到任何URL。
rd.forward(request, response);提交至http://localhost:8080/Test/ooo
RequestDispatcher rd = getServletContext().getRequestDispatcher( “/ooo “);
rd.forward(request, response);提交至http://localhost:8080/Test/ooo
重定向后浏览器地址栏URL不变.
只有在客户端没有输出时才可以调用forward方法。如果当前页面的缓冲区(buffer)不是空的,那么你在调用forward方法前必须先清空缓冲区。
“/ “代表相对与web应用路径
RequestDispatcher rd = request.getRequestDispatcher( “/ooo “);
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response。
2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
include 和forward和SendRedirect
其实sendredict就是重定向,而requestDispatcher则是转发。
我认为两个最主要的区别在于重定向是返回数据到客户端之后客户端再向另外的地址发送请求,这样一个来回就发送两次请求,接受两次响应,客户端知道请求发生了变化;而转发则是在服务器端直接发送请求到另外的地址,然后将响应返回到客户端,这样只有一次请求,一次响应,而客户端是不知道请求已经发生变化的。
Servlet中,利用RequestDispatcher对象,可以将请求转发给另外一个Servlet或JSP页面,甚至是HTML页面,来处理对请求的响应。
一,RequestDispatcher接口方法简介1,RequestDispatcher对象由Servlet容器来创建,封装一个由路径所标识的服务器资源。
2,RequestDispatcher接口中定义了二种方法用于请求转发:forward(ServletRequest,ServletResponse)方法:将请求转发给服务器上另外一个Servlet,JSP页面,或者HTML文件这个方法必须在响应被提交给客户端之前调用,否则抛出异常。
方法调用后在响应中的没有提交的内容被自动消除。
include(ServletRequest,ServletResponse)方法:用于在响应中包含其他资源(Servlet,JSP页面或HTML文件)的内容。
即请求转发后,原先的Servlet还可以继续输出响应信息,转发到的Servlet对请求做出的响应将并入原先Servlet的响应对象中。
3,forward方法和include方法的区别:forward方法调用后在响应中的没有提交的内容被自动消除。
将请求转发给其他的Servlet后,由被调用的Servlet负责对请求做出响应,而原先Servlet的执行则终止。
include方法使原先的Servlet和转发到的Servlet都可以输出响应信息,即原先的Servlet还可以继续输出响应信息二,得到RequestDispatcher对象三种方法可以得到RequestDispatcher对象:1,利用ServletRequest接口中的getRequestDispatcher(String path)方法。
请求重定向与请求转发
ServletContext sc = this.getServletContext(); //ServletContext对象的获取
//RequestDispatcher对象的获取
--RequestDispatcher dis = sc.getNamedDispatcher("/servlet2");
[注: 传递给该方法的参数是在WEB应用程序部署描述符中声明过的Servlet或jsp的映射名称]
2) RequestDispatcher对象的获取[通过ServletRequest对象]:
在ServletRequest接口中也定义了一个 getRequestDispatcher(String param) 方法来获取
4) 用include方法实现资源包含
dis.include(request, response); //[两个页面中的request与response是相同的]
2: HttpServletResponse 接口(请求重定向)
HttpServletResponse 接口中定义了一些用于将请求再次定向到新的资源下的方法,最主要的是
源作为当前响应内容的一部分包含进来.
1) RequestDispatcher对象的获取[通过ServletContext对象]:
ServletContext 接口中定义了两个用于获取 RequestDispatcher对象的方法
(1) getRequestDispatcher(String param)
RequestDispatcher对象,它与ServletContext.getRequestDispatcher()方法的区别在于:
传递给这个方法的参数除了可以采用以"/"开头的路径字符串,还可以采用非"/"开头的相对路径.
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”。
sendredirect 和 encoderedirecturl参数
sendredirect 和 encoderedirecturl参数在 Java Servlet 中,`sendRedirect`和`encoderedirectURL`参数是用于处理 URL 重定向和编码的方法。
下面是它们的简要介绍:- `sendRedirect`方法用于发送重定向响应,将浏览器重定向到指定的 URL。
在调用`sendRedirect`方法之前,应该先调用`encodeRedirectURL`方法对 URL 进行编码,以确保会话跟踪的正确性。
否则,可能会丢失 Session 信息。
- `encodeRedirectURL`方法用于对 URL 进行编码,以便在`sendRedirect`方法中使用。
它的主要作用是在需要时在 URL 中添加`jsessionid`参数。
如果不需要编码,则直接返回原始 URL。
该方法的编码逻辑如下:- 首先判断当前的 Servlet 是否执行了`HttpSession`对象的`invalidate()`方法。
如果已经执行,返回参数 URL。
- 接下来判断客户端是否禁用了Cookie。
如果禁用,在参数URL 中附加`jsessionid`,并返回编码后的 URL。
- 如果前两个条件都不满足,即没有执行`invalidate()`方法且客户端没有禁用Cookie,直接返回参数 URL。
总体来说,`sendRedirect`方法用于发送重定向响应,而`encodeRedirectURL`方法用于对重定向的 URL 进行编码。
在使用 URL 重写时,为了保证会话跟踪的正确性,所有的链接和重定向语句中的 URL 都需要调用`encodeURL`或`encodeRedirectURL`方法进行编码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
servlet的两种重定向方法的区别及应用一问题:在servlet/JSP编程学习中,发现有两种方法可以实现服务端输出重定向,一种是通过forward方法(例如JSP中的<jsp:forwardpage=”OtherPage.jsp”/>),另一种则是通过运用javax.servlet.http.HttpServletResponse接口的sendRedirect方法(例如response.sendRedirect(“OtherPage.jsp”);这两种方法有什么区别和联系呢?让我们看下面的分析。
二分析:<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则还没有。
(2)response.sendRedirect(“OtherPage.jsp”)该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。
该方法可以接受绝对的或相对的URLs。
如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。
如果地址是相对的,没有一个’/’,那么Web container就认为它是相对于当前的请求URI的。
因为这个方法是通过修改HTTP协议的HEADER实现的重定义功能,而下面的方法也能改变HTTP HEADER属性,他们的原理是一样的.<%response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);String newLocn="/index.html";response.setHeader("Location",newLocn);%>补充知识:HTTP应答头Web服务器响应浏览器或其他客户程序的请求时,其应答一般由以下几个部分组成:一个状态行,几个应答头,一个空行,内容文档。
下面是一个最简单的应答:HTTP/1.1 200 OKContent-Type: text/plainHello World1设置状态信息状态行包含HTTP版本、状态代码、与状态代码对应的简短说明信息。
在大多数情况下,除了Content-Type之外的所有应答头都是可选的。
Servlet可以利用状态代码来实现许多功能。
例如,可以把用户重定向到另一个网站,就像我们上边所看到的那个例子。
下面我们就通过这个机会具体讨论各种状态代码的含义以及利用这些代码可以做些什么。
如前所述,HTTP应答状态行包含HTTP版本、状态代码和对应的状态信息。
由于状态信息直接和状态代码相关,而HTTP版本又由服务器确定,因此需要Servlet 设置的只有一个状态代码。
先给出常见的HTTP 1.1状态代码以及它们对应的状态信息和含义,具体的使用方法我们接下来再做详细的介绍。
100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。
(HTTP 1.1新)101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)200 OK 一切正常,对GET和POST请求的应答文档跟在后面。
如果不用setStatus 设置状态代码,Servlet默认使用202状态代码。
201 Created 服务器已经创建了文档,Location头给出了它的URL。
202 Accepted 已经接受请求,但处理尚未完成。
203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。
204 No Content 没有新文档,浏览器应该继续显示原来的文档。
如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。
用来强制浏览器清除表单输入内容(HTTP 1.1新)。
206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。
300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。
如果服务器要提出优先选择,则应该在Location应答头指明。
301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。
注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”,而HttpServletResponse中相应的常量是SC_MOVED_TEMPORARILY,而不是SC_FOUND。
出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。
为此,Servlet提供了一个专用的方法,即sendRedirect。
使用response.sendRedirect(url)比使用response.setStatus(response.SC_MOVED_TEMPORARILY)和response.setHeader("Location",url)更好。
这是因为:首先,代码更加简洁。
第二,使用sendRedirect,Servlet会自动构造一个包含新链接的页面(用于那些不能自动重定向的老式浏览器)。
最后,sendRedirect能够处理相对URL,自动把它们转换成绝对URL。
注意这个状态代码有时候可以和301替换使用。
例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器返回301,有的则返回302。
严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。
请参见307。
303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。
304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。
服务器告诉客户,原来缓冲的文档还可以继续使用。
305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。
307 Temporary Redirect 和302(Found)相同。
许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。
由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST 请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。
注意,HttpServletResponse中没有为该状态代码提供相应的常量。
(HTTP 1.1新)400 Bad Request 请求出现语法错误。
401 Unauthorized 客户试图未经授权访问受密码保护的页面。
应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。
403 Forbidden 资源不可用。
服务器理解客户的请求,但拒绝处理它。
通常由于服务器上文件或目录的权限设置导致。
404 Not Found 无法找到指定位置的资源。
这也是一个常用的应答,HttpServletResponse专门提供了相应的方法:sendError(message)。
405 Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE 等)对指定的资源不适用。
(HTTP 1.1新)406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet 头中所指定的不兼容(HTTP 1.1新)。
407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。
(HTTP 1.1新)408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。
客户可以在以后重复同一请求。
(HTTP 1.1新)409 Conflict 通常和PUT请求有关。
由于请求和资源的当前状态相冲突,因此请求不能成功。
(HTTP 1.1新)410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。
它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。
(HTTP 1.1新)411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length 头。