IT兄弟连 JavaWeb教程 请求重定向案例

Check2Servlet类与Output2Servlet类之间为请求转发关系。在web.xml文件中,为Check2Servlet映射的URL为"/check2",为Output2Servlet映射的URL为"/outout2"。

public class Check2Servlet extends HttpServlet{

public void service(HttpServletRequest request,

        HttpServletResponse response)throws ServletException,IOException{

     PrintWriter out = response.getWriter();

     String username = request.getParameter("username");

     String message = null;

     if(username == null){

          message = "Please input username";

     }else{

          message = "Hello," + username;

     }

     request.setAttribute("msg",username);

     out.println("Output from Check2Servlet before redirecting.");

     System.out.println("Output from Check2Servlet before redirecting");

     response.sendRedirect("/helloapp/output2?msg="+message);

     out.println("Output from Check2Servlet after redirecting.");

     System.out.println("Output from Check2Servlet after redirecting.");

}

}

public class Output2Check extends HttpServlet{

public void service(HttpServletRequest request,

     HttpServletResponse response)throws ServletException,IOException{

     String message = (String)request.getAttribute("msg");

     System.out.println("请求范围内的消息:" + message);

     message = request.getParameter("message");

     System.out.println("请求参数中的消息:" + message);

     PrintWriter out = response.getWriter();

     out.println("message");

     out.close();

}

}

Check2Servlet与上个例子中的CheckServlet有些相似,Check2Servlet先检查客户端是否提供username请求参数,在依据此生成一条消息,用变量message表示,接下来把这条消息作为属性保存到ServletRequest对象中,在重定向到Output2Servlet。与重定向相关的代码为:

response.sendRedirect("/helloapp/output2?msg="+message);

response.sendRedirect(String location)方法具有以下特点:

Servlet源组件生成的响应结果不会被发送到客户端。request.sendRedirect(String location)方法一律返回状态码为302的响应结果,浏览器端接收到的这种响应结果后,再立即自动请求访问重定向的目标Web组件,客户端最后接收到的是目标Web组件的响应结果。

如果源组件在进行重定向之前,已经提交了响应结果(例如调用ServletResponse的flushBuffer()方法,或者调用与SerlvetResponse关联的输出流的close()方法),那么sendRedirect()方法会掏出IllegalStateException。为了避免该异常,不应该在源组件中提交响应结果。

在Servlet源组件中调用response.sendRedirect()方法之后的代码块也会被执行。

源组件和目标组件不共享同一个ServletRequest对象,因此不共享请求范围内的共享数据。

对于response.sendRedirect(String location)方法中的参数location,如果以"/"开头,表示相对于当前服务器根路径的URL,如果以http://开头,表示一个完整的URL。

目标组件不必是同一个服务器上的同一个Web应用中的组件,它可以是Interner上的任意一个有效的网页。

sendRedirect()方法是在HttpSerlvetResponse接口中定义的,而在ServletResponse接口中没有sendRedirect()方法,因此重定向机制是由HTTP协议规定的。

在浏览器中访问http://localhost:8080/helloapp/check2,其中helloapp是项目名称,/check2是请求路径,浏览器中会出现"Please input username"。

浏览器实际上发出了两次请求,第一次请求访问Check2Servlet,第二次请求访问Output2Servlet,浏览器最终展示的是Output2Servlet生成的HTML页面。

Check2Servlet在调用sendRedirect()方法之前和之后,都试图向浏览器端及服务器的控制台输出一些数据:

out.println("Output from Check2Servlet before redirecting.");

System.out.println("Output from Check2Servlet before redirecting");

response.sendRedirect("/helloapp/output2?msg="+message);

out.println("Output from Check2Servlet after redirecting.");

System.out.println("Output from Check2Servlet after redirecting.");

从浏览器中显示的页面可以看出,Check2Servlet作为源组件,它所生成的响应结果不会被发送到客户端。

此外,在Tomcat服务器的控制台,会显示调用response.sendRedirect()方法之前及之后的System.out.println()语句的打印结果。由此可见,在Servlet源组件中调用response.sendRedirect()方法之后的代码也会被执行。

另外,Output2Servlet也向控制台打印了如下内容:

请求范围内的消息: null

请求参数中的消息:Please input username.

由于Output2Servlet与Check2Servlet不共享请求范围内的数据,因此尽管Check2Servlet向请求范围内存放了消息,Output2Servlet却无法从请求范围内获得该消息。Check2Servlet还把消息作为请求参数传给Output2Servlet,Output2Servlet能获得该请求参数。

原文地址:https://blog.51cto.com/14311187/2389713

时间: 2024-08-30 14:37:57

IT兄弟连 JavaWeb教程 请求重定向案例的相关文章

IT兄弟连 JavaWeb教程 JSP经典案例

案例需求:定义一个javaBean叫XdlUser,有四个字段int id.String name.int age.double salary.写一个jsp页面,在页面中构建一个列表对象,里面存放几个XdlUser类型的对象. 案例实现: ● XdlUser类 package com.xdl.bean; public class XdlUser { public XdlUser(int id, String name, int age, double salary) { super(); thi

IT兄弟连 JavaWeb教程 JSP静态包含和动态包含的区别

JSP静态包含(<%@ include>和JSP动态包含<jsp:include>同样都可以用来包含文件,但是他们之间是存在很大差别的.下面将对include指令与include动作的区别进行详细介绍: ●  include指令通过file属性指定被包含的文件,并且file属性不支持任何表达式:include动作标识通过page属性指定被包含的文件,而且page属性支持JSP表达式. ●  使用include指令时,被包含的文件内容会原封不动地插入到包含页中,然后JSP编译器在将合

IT兄弟连 JavaWeb教程 EL与JSTL表达式经典案例

案例需求:使用MVC模式编写一个程序,当发起一个deptList.do请求时,在servlet中准备一个部门列表对象,把这个列表对象放入request作用域中转发到deptlist.jsp,使用JSTL+EL的语法来显示这个部门列表.部门类型是XdlDept成员变量有int id.String name.String loc. 案例实现: ●  XdlDept类: package com.xdl.bean; import java.io.Serializable; public class Xd

IT兄弟连 JavaWeb教程 jQuery对AJAX的支持经典案例

案例需求:编写用户登陆页面的验证码模块,在用户进行登陆时,输入验证码后不需要点击提交按钮,使用AJAX异步地向服务器发送验证验证码的请求.如果验证码正确,可以点击提交按钮,如果验证码输入错误,提示用户.如果用户看不清验证码,点击验证码还可以刷新出新的验证码. 案例实现: 验证码原理:当页面请求一个验证码的Servlet时,这个Servlet会把数据以图片的形式传给客户端,并把数据以字符串的形式存入了session中.当用户以图片为标准输入对应的验证码并发送给对应的用来验证验证码的Servlet时

IT兄弟连 JavaWeb教程 异步请求对象的API

Ajax的核心是XMLHttpRequest对象(xhr),xhr为向服务器发送请求和解析服务器响应提供了接口,能够以异步的方式从服务器获取新数据. xhr的主要方法有: ● void open(String method,String url,Boolean async) 用于创建请求,参数说明如下: method:请求方式,字符串类型,如GET.POST.DELETE等. url:要请求的地址,字符串类型. async:是否异步,布尔类型,默认是true,异步的. ● void send(S

IT兄弟连 JavaWeb教程 使用AJAX发送POST请求并获取响应

POST请求用于向服务器发送应该被保存的数据,因此POST请求天然比GET请求多需要一份需要被保存的数据.那么这些数据应该放在何处呢?毕竟,我们的open()方法接收的三个参数都没有合适的位置. 答案是需要发送的数据会作为send()方法的参数最终被发往服务器,该数据可以是任意大小,任意类型. 使用Ajax发送POST请求需要使用setRequestHeader()方法设置请求头,代码如下: function PostRequest(){ var xhr = null; if(window.XM

IT兄弟连 JavaWeb教程 El基本语法

EL(Expression Language)表达式语言是在JSP 2.0版本中引入的新特性,它用于JSP文件中的数据访问.这种表达式语言能简化JSP文件中数据访问的代码,可用来替代传统的基于"<%="和"%>"形式的Java表达式,以及部分基于"<%"和"%>"形式的Java程序片段. 自定义JSP标签是用来代替JSP中的Java程序片段的有效途径.大多数Web应用的JSP文件常常要实现一些通用的功能

IT兄弟连 JavaWeb教程 JSP动作指令

JSP动作指令语法 JSP动作指令语法格式如下: <jsp:动作名 属性名1="属性值1" 属性名2="属性值2" ... %> JSP具体动作指令 ●  包含文件动作标识<jsp:include> JSP的动作标识<jsp:include>用于向当前页面中包含其他的文件.被包含的文件可以是动态文件,也可以是静态文件. <jsp:include>动作标识的语法格式如下: <jsp:include page=&qu

IT兄弟连 JavaWeb教程 JSP语法

在JSP页面中,脚本标识使用的最为频繁,因为他们能够方便.灵活地生成页面中的动态内容,特别是JSP程序代码块.JSP中的脚本标识包括3部分,即JSP声明区.JSP表达式和JSP程序代码块.通过这些标识,在JSP页面中可以像编写Java程序一样声明变量.定义函数或进行各种表达式运算. JSP声明区 声明标识用于在JSP页面中定义全局的变量或方法.通过声明标识定义的变量和方法被整个JSP页面访问,所以通常使用该标识定义整个JSP页面需要引用的变量或方法. 服务器执行JSP页面时,会将JSP页面转换为