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能获得该请求参数。

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

  1. IT兄弟连 JavaWeb教程 请求转发案例

    CheckServlet类与OutputServlet类之间为请求转发关系.在web.xml文件中,为CheckServlet映射的URL为"/check",为OutputServ ...

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

    案例需求:定义一个javaBean叫XdlUser,有四个字段int id.String name.int age.double salary.写一个jsp页面,在页面中构建一个列表对象,里面存放几个 ...

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

    JSP静态包含(<%@ include>和JSP动态包含<jsp:include>同样都可以用来包含文件,但是他们之间是存在很大差别的.下面将对include指令与includ ...

  4. IT兄弟连 JavaWeb教程 经典案例3

    案例需求:写一个用户登录的html页面有账号和密码,并在登录的Servlet中获取登录的账号和密码,如果账号是abc密码是123则重定向到main.html,否则重定向到login.html. 案例实 ...

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

    案例需求:编写用户登陆页面的验证码模块,在用户进行登陆时,输入验证码后不需要点击提交按钮,使用AJAX异步地向服务器发送验证验证码的请求.如果验证码正确,可以点击提交按钮,如果验证码输入错误,提示用户 ...

  6. IT兄弟连 JavaWeb教程 AJAX以及JSON字符串经典案例

    案例需求:客户端发送AJAX请求服务器端获取用户信息的数据. 案例实现: 在服务器端要将Java对象转换成JSON字符串,如果使用拼接JSON字符串的方式非常繁琐,并且非常容易出错,所以一般会借助第三 ...

  7. IT兄弟连 JavaWeb教程 经典案例

    案例需求:编写一个jsp servlet程序,在login.jsp发起login.do登录请求,当输入的用户名是abc密码是123时,则判断是登录成功,其它暂时认为是登录失败.当用户登录成功时,将用户 ...

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

    案例需求:使用MVC模式编写一个程序,当发起一个deptList.do请求时,在servlet中准备一个部门列表对象,把这个列表对象放入request作用域中转发到deptlist.jsp,使用JST ...

  9. IT兄弟连 JavaWeb教程 JSP内置对象经典案例

    案例需求:使用MVC模式编写一个程序当发起一个deptList.do请求时在servlet中准备一个部门列表对象,把这个列表对象放入request作用域中,然后转发到deptlist.jsp,使用js ...

随机推荐

  1. 走入asp.net mvc不归路:[5]Action的返回

    asp.net mvc提供了多种返回方式,一方面使得视图可以重用,另一方面灵活强大,有直接返回视图,返回Json,返回文件流,返回到相同Controller的Action,返回到另一个Controll ...

  2. javascript之scrollTop

    下面的演示中,外层元素的高度值是200px,内层元素的高度值是300px.很明显,“外层元素中的内容”高过了“外层元素”本身.当向下拖动滚动条时,有部分内容会隐没在“外层元素的上边界”之外,scrol ...

  3. Linux环境下如何查找哪个线程使用CPU最长

    top -H -p pid 查看端口是否被占用: netstat -apn|grep 80

  4. openwrt 配置rsync服务

    一: rsyn简介 remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息. rsync是用 “rsyn ...

  5. 远程连接mysql速度慢的解决方法:skip-name-resolve取消DNS的反向解析

    PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接MYSQL正常,出现这种问题的主要原因是,默认安装的 MYSQL开启了DNS的反向解析,在MY.INI(WINDOW ...

  6. Android Menu开源项目整合工程

    本实例整合了关于Android Menu的优秀开源代码,方便有需要用到Menu开源项目的小伙伴使用. 一.整合的项目有: SlidingMenu:https://github.com/jfeinste ...

  7. 用redis实现动态时间段内统计排序

    问题描述 需要根据某类数据在动态时间段内的统计值对这些数据进行排名.例如按过去24小时内点赞数排名的帖子,每隔一小时计算一次结果.以下描述均针对这个例子展开. 解决思路 针对这种问题,我的第一反应是直 ...

  8. HDU 5651xiaoxin juju needs help

    xiaoxin juju needs help Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  9. ES6的相关新属性

    ES6  引入了类这个概念. 1.class……extends es6中的class与es5 中的function差不多: class Student extends People , student ...

  10. css的书写规范,有哪些注意点

    一.框架为先,细节次之. 先写一些浮动,然后高与宽,然后再是细节方面的书写. 比如写一个浮动容器的样式,我们应该先让这个容器的框架被渲染出来,让大家看到基本的 网站框架.然后再再去渲染容器里面的内容. ...