Servlet的页面跳转
Servlet的跳转
内部跳转
req.getRequestDispatcher()
Server--->AServlet--->BServlet
两个Servlet共用一个request,response
include(req,resp)输出流合并
forward(req,resp)out清空,输出后者Servlet的输出,request,response其他信息不变
在服务器内部由一个Servlet跳转到另外一个Servlet
这两个Servlet共用同一个request,response
如果include(req,resp)
输出流合并
a: out.print("hello ");
b: out.println("world");
hello world
在跳转之前out.flush() 不会报错
在跳转之前out.close() 不会报错,只显示第一个servlet内容
如果forword(req,resp);
输出流清空
a: out.print("hell ");
跳转的时候,清空out
b: out.println("world");
world
在跳转之前out.flush() 报错
!从一个Servlet跳转Servlet
AServlet -> BServlet
AServlet -> JSP(servlet)
从一个Servlet跳转到html(输出流)
特点:
1.浏览器地址栏的地址不会发生变化 a-b a
2.跳转发生在服务器的内部,实际上浏览器只向服务器发送了一次请求
外部跳转(重定向)
resp.sendRedirect()
AServlet--->Server
Server--->BServlet
response.sendRedirect();
1.浏览器地址栏的地址发生变化 a-b b
2.浏览器实际上向服务器发送了两次请求
多次访问同一个servlet,由于Servlet是单例,所以访问的是同一个对象
但是request,response对象,每次访问都会产生一个新对象
一个形象的例子说明转发与重定向:
A同学问B老师问题,然后B老师回答了一半,提供一些必要信息,它将剩下的交给C老师帮忙解答。 include(req,resp).在客观立场上是A问B老师的问题,虽然C老师也参与了,但只是幕后,所以;浏览器网址为Bservlet的网址。将A老师的答案和B老师的答案综合才是正确答案。
A同学问B老师问题,然后B老师前面回答了一点却无法往下走,他将剩下的交给C老师帮忙解答。C老师利用了B老师提供的一些必要信息。C老师解答出来推翻了B老师所有推论,所以结果仅仅是C老师的答案。 forward(req,resp),客观上还是A问B老师的问题,浏览器地址栏不变,将B的outflush掉了显示的只是C老师的内容。
A同学问B老师问题,B老师由于种种原因没有答出来。然后A同学去问C老师。 resp.sendRedirect() 前后是两个事件了,没有任何联系。B中的信息在C中完全没有使用,单纯的成为了A和C之间的问题。所以浏览器地址栏发生了变化。向浏览器发送了两次请求。
代码:
package com.etc.hh; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class AServlet extends HttpServlet{ /**
*
*/
private static final long serialVersionUID = -7797104755858628468L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("AServlet---");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
PrintWriter out=resp.getWriter();
out.write("hello ");
//RequestDispatcher dispatcher=req.getRequestDispatcher("b");
//dispatcher.include(req, resp);//输出流合并
/**
* 这里需要注意一个问题:
* 就是out的关闭和flush,在dispatcher之前不应该out.flush或者out.close
* 我的理解:tomcat服务器进行通信使用response对象有点类似于前面网络编程的Socket套接字,使用同一个套接字客户端不可以在服务器未反馈之前关闭
*/ //dispatcher.forward(req, resp);//转发。将前面的out中数据默认flush清空,只显示后者out中的数据
/**
* 如果在关闭或者flushout之后进行跳转操作会报错:
* java.lang.IllegalStateException: Cannot forward after response has been committed
*/ /**
* 外部跳转(重定向)
* respnse.sendRTedirect()
* 不接受前面的request和response信息,与前面的Servlet毫无相关,重新进入了一个其他Servlet
* 内容只是新Servlet的内容。
* 因为与跳转前信息无关,所以地址栏改变成重定向后的页面地址
*/
resp.sendRedirect("b"); out.flush();
out.close();
}
}
package com.etc.hh; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class BServlet extends HttpServlet{ /**
*
*/
private static final long serialVersionUID = -7797104755858628468L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("bServlet-----");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
PrintWriter out=resp.getWriter();
out.write("world");
out.flush();
out.close();
}
}
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.etc.hh.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>BServlet</servlet-name>
<servlet-class>com.etc.hh.BServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BServlet</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
Servlet的页面跳转的更多相关文章
- Jsp与servlet之间页面跳转及参数传递实例(转)
原网址:http://blog.csdn.net/ssy_shandong/article/details/9328985 11. jsp与servlet之间页面跳转及参数传递实例 分类: Java ...
- 熟悉servlet的页面跳转
jspweb里面用到的servlet跳转页面的方法 使用的jar包只有 commons-lang3-3.5.jar 运行时,tomcat会先根据web.xml里面的信息,查找servlet <? ...
- 【转】(超详细)jsp与servlet之间页面跳转及参数传递实例
初步学习JavaEE,对其中jsp与Servlet之间的传值没弄清楚,查看网上资料,发现一篇超详细的文章,收获大大,特此记录下来.具体链接:http://blog.csdn.net/ssy_shand ...
- java servlet 几种页面跳转的方法及传值
java servlet 几种页面跳转的方法及传值 java web 页面之间传值有一下这几种方式1.form 表单传递参数2.url地址栏传递参数3.session4.cookie5.appli ...
- Servlet、JSP中页面跳转的方式
一.Servlet:当然,在servlet中,一般跳转都发生在doGet, doPost等方法里面.1) redirect 方式response.sendRedirect("success ...
- Servlet页面跳转实现方法的区别
一直对Servlet页面跳转的几种方式理解的糊里糊涂的,今天在网上搜了一把,找到一遍比较好的,记下来,以后看看. Servlet页面跳转分两部分,一是发生在Servlet,一是在JSP,其实JSP也就 ...
- 乱码问题-页面跳转方式-Servlet配置文件
1.HttpServletRequest a)HttpServletRequest是一个接口,继承了ServletRequest接口: b)HttpServletRequest对象由服务器创建,并作为 ...
- jsp/servlet页面跳转丢失样式问题
问题:使用servlet,如何处理在多路径页面跳转中servlet转发页面样式丢失问题?(例如访问 http://localhost/project/listUser.action后转到http:// ...
- JSP、Servlet中的相对路径和绝对路径 页面跳转问题
转自:http://blog.csdn.net/wym19830218/article/details/5503533/ 1.JSP.Servlet中的相对路径和绝对路径 前提:假设你的Http地址为 ...
随机推荐
- call by reference and copy/restore
转自:http://stackoverflow.com/questions/8848402/whats-the-difference-between-call-by-reference-and-cop ...
- C#反射Assembly 详细说明
1.对C#反射机制的理解2.概念理解后,必须找到方法去完成,给出管理的主要语法3.最终给出实用的例子,反射出来dll中的方法 反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等 ...
- GSM、3G、LTE、4G
3GPP(The 3rd Generation Partnership Project)3GPP的目标是实现由2G网络到3G网络的平滑过渡,保证未来技术的后向兼容性,支持轻松建网及系统间的漫游和兼容性 ...
- ubuntu系统使用minicom终端操作说明
http://blog.chinaunix.net/uid-22030783-id-3350834.html 在linux下,使用minicom作为串口终端工具,默认的串口设备是/dev/ttyS0, ...
- iOS开发--控件
iOS知识点整理-提示器 http://www.jianshu.com/p/ac7e13d36e32 iOS知识点整理-RunLoop http://www.jianshu.com/p/e4fc6ac ...
- ios开发--企业帐号发布
这两天需要发布一个ipa放到网上供其他人安装,需要用到企业级开发者账号. 首先详细说明一下我们的目标,我们需要发布一个ipa放到网上,所有人(包括越狱及非越狱设备)可以直接通过链接下载安装,不需要通过 ...
- TestDirector域或工程用户的管理
一.添加用户 单击界面上的"Users"按钮,进入如下图: 我们可以添加新用户,删除用户,导入用户,修改用户密码,用户的详细信息. 1.单击"New"按钮为域或 ...
- 扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法
扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法 在C#中对泛型的扩展,输入参数是泛型本身的内容,返回值则是bool.基于这一点, ...
- PageLayoutControl的基本操作
整理了下对PageLayoutControl的基本功能操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...
- 《MySQL悲观锁总结和实践》乐观锁
mysql乐观锁总结和实践 博客分类: MyBatis 数据库 mysql数据库乐观锁悲观锁 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景 ...