IT兄弟连 JavaWeb教程 请求转发案例
CheckServlet类与OutputServlet类之间为请求转发关系。在web.xml文件中,为CheckServlet映射的URL为"/check",为OutputServlet映射的URL为"/outout"。
public class CheckServlet extends HttpServlet{
public void service(HttpServletRequest request,
HttpServletResponse response)throws ServletException,IOException{
String username = request.getParameter("username");
String message = null;
if(username == null){
message = "Please input username.";
}else{
message = "Hello," + username;
}
// request.setAttribute("msg",message);
// servletContext context = getServletContext();
RequestDispatcher dispatcher =
request.getRequestDispatcher ("output");
PrintWriter out = response.getWriter();
out.println("Output from CheckServlet before forwarding request");
System.out.println(
"Output from CheckServlet before forwarding request");
// out.close();
dispatcher.forward(request,response);
out.println("Output from CheckServlet after forward request.");
System.out.println(
"Output from CheckServlet after forwarding request.");
}
}
public class OutputServlet extends HttpServlet{
public void service(HttpServletRequest request,
HttpServletResponse response)thrwos ServletException,IOException{
String message = (String)request.getAttribute("msg");
PrintWriter out = response.getWriter();
out.println(message);
out.close();
}
}
CheckServlet先检查客户端是否提供了username请求参数,再根据此生成一条消息,用变量message表示,接下来把这条消息作为属性保存到ServletRequest对象中,再把请求转发给OutputServlet。与请求转发相关的代码为:
RequestDispatcher dispatcher = request.getRequestDispatcher("output");
dispatcher.forward(request,response);
以上dispatcher.forward(request,response)方法的处理流程如下。
● 清空用于存放响应正文数据的缓冲区。
● 如果目标组件为Servlet或JSP,就调用它们的service()方法,把该方法产生的响应结果发送到客户端;如果目标组件为文件系统中的静态HTML文档,就读取文档中的数据并把它发送到客户端。

转发流程图
从Dispatcher.forward(request,response)方法的处理流程可以看出,请求转发具有以下特点。
由于forward()方法先清空用于存放响应正文数据的缓冲区,因此Servlet源组件生成的响应结果不会被发送到客户端,自由目标组件生成的响应结果才会被发送到客户端。
如果源组件在进行请求转发之前,已经提交了响应结果(例如调用ServletResponse的flushBuffer()方法,或者调用与ServletResponse关联的输出流的close()方法),那么forward()方法会抛出IllegalStateException。为了避免该异常,不应该在源组件中提交响应结果。
案例中的OutputServlet类作为转发目标组件,先从ServletRequest对象中读取msg属性,然后把它作为响应结果发送到客户端。下面按照如下步骤演示本案例:
1.通过浏览器访问http://localhost:8080/helloapp/check,其中helloapp是项目名称,/check是请求路径,浏览器中会出现"Please input username"。
CheckServlet负责生成消息,而OutputServlet负责把消息发送给客户端。由此可见,CheckServlet与OutputServlet既分工明确,各行其职,又紧密协作,来响应同一个客户请求。
CheckServlet在调用dispatcher.forward(request,response)方法之前和之后,都试图向浏览器以及服务器的控制台输出一些数据:
out.println("Output from CheckServlet before forwarding request");
System.out.println("Output from CheckServlet before forwarding request");
dispatcher.forward(request,response);
out.println("Output from CheckServlet after forward request.");
System.out.println("Output from CheckServlet after forwarding request.");
从浏览器中显示的页面可以看出,CheckServlet作为源组件,它所生成的响应结果不会被发送到客户端。
此外,在Tomcat服务器的控制台,会显示调用forward()方法之前及之后的System.out.println()语句的打印结果。由此可见,在Servlet源组件中调用forward()方法之后的代码也会被执行。
2.修改CheckServlet类的代码,在CheckServlet类中调用forward()方法之前先关闭输出流:
out.close();
dispatcher.forward(request,response);
再次通过浏览器访问CheckServlet,浏览器端仅接收到了由CheckServlet输出的内容:
Output from CheckServlet before forward request;
这是因为CheckServlet的out.close()方法先把CheckServlet输出的内容提交给客户端,然后再关闭输出流。接下来调用forward()方法会抛出异常。
IT兄弟连 JavaWeb教程 请求转发案例的更多相关文章
- IT兄弟连 JavaWeb教程 请求重定向案例
Check2Servlet类与Output2Servlet类之间为请求转发关系.在web.xml文件中,为Check2Servlet映射的URL为"/check2",为Output ...
- IT兄弟连 JavaWeb教程 Servlet转发
Servlet对象由Servlet容器创建,并且Servlet对象的service()方法也由容器调用,一个Servlet对象可否直接调用另一个Servlet对象的service()方法呢?答案是否定 ...
- IT兄弟连 JavaWeb教程 JSP经典案例
案例需求:定义一个javaBean叫XdlUser,有四个字段int id.String name.int age.double salary.写一个jsp页面,在页面中构建一个列表对象,里面存放几个 ...
- JavaWeb中请求转发和请求重定向的区别
针对于JavaWeb中请求与重定向的一个cheatsheep: 1.转发 1)完成一次转发,用户浏览器发送一次请求 2)转发之后,浏览器URL地址栏不改变(服务器帮忙完成) 3)请求域中数据不丢失 4 ...
- IT兄弟连 JavaWeb教程 JSP内置对象1
JSP内置对象定义 JSP提供了由容器实现和管理的内置对象,也可以称之为隐含对象,这些内置对象不需要通过JSP页面编写来实例化,在所有的JSP页面中都可以直接使用,它们起到了简化页面的作用,JSP的内 ...
- IT兄弟连 JavaWeb教程 JSP静态包含和动态包含的区别
JSP静态包含(<%@ include>和JSP动态包含<jsp:include>同样都可以用来包含文件,但是他们之间是存在很大差别的.下面将对include指令与includ ...
- IT兄弟连 JavaWeb教程 JSP动作指令
JSP动作指令语法 JSP动作指令语法格式如下: <jsp:动作名 属性名1="属性值1" 属性名2="属性值2" ... %> JSP具体动作指令 ...
- IT兄弟连 JavaWeb教程 EL与JSTL表达式经典案例
案例需求:使用MVC模式编写一个程序,当发起一个deptList.do请求时,在servlet中准备一个部门列表对象,把这个列表对象放入request作用域中转发到deptlist.jsp,使用JST ...
- IT兄弟连 JavaWeb教程 JSP内置对象经典案例
案例需求:使用MVC模式编写一个程序当发起一个deptList.do请求时在servlet中准备一个部门列表对象,把这个列表对象放入request作用域中,然后转发到deptlist.jsp,使用js ...
随机推荐
- HDU 1003 Max Sum (动规)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- java基础知识汇总6(html篇)
五.html // 定义文档类型. < html> 定义 HTML 文档. < body> 定义文档的主体. < h1> to < h6> 定义 HTM ...
- salt.states.file试用
从master往linux上的minion复制文件参考http://netkiller.sourceforge.net/linux/management/saltstack.html后半部分,他已经写 ...
- bootstrap-Table服务端分页,获取到的数据怎么再页面的表格里显示
<table class="table table-hover" id="userTable" > <thead> <tr> ...
- WPF代码注意事项,开发常见问题,知识总结
代码注意事项: 1.代码实现的样式赋值 XXX.Style = TryFindResource("StyleName") as Style; 2.WPF中FindName方法的使用 ...
- spring list map set
1 list <!-- result in a setSomeList(java.util.List) call --> <property name="someList& ...
- Shell编程——Shell中的数学运算
在Linux Shell中进行数学运算,通常能够使用的运算符有: 简单运算: let [] (()) 高级运算: expr bc 1.let命令 let命令是bash内置命令.能够实现简单的算术以及逻 ...
- luogu3384 【模板】 树链剖分
题目大意 已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作:操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z操作2: 格式: 2 x ...
- (23) java web的struts2框架的使用-struts动态调用和通配符
一,动态查找 1,配置允许动态调用 <!-- 允许动态方法调用 --> <constant name="struts.enable.DynamicMethodInvocat ...
- mysql 中varchar(50)最多能存多少个汉字
首先要确定mysql版本4.0版本以下,varchar(50),指的是50字节,如果存放UTF8汉字时,只能存16个(每个汉字3字节) 5.0版本以上,varchar(50),指的是50字符,无论存放 ...