Servlet之间的跳转
Servlet之间的跳转
1. 转向(Forward)
转向(forward)是通过RequestDispatcher对象的forward(HttpServletRequest request, HttpServletResponse response)来实现的。示例如下:
RequestDispatcher dispatcher = request.getRequestDispatcher( "/servlet/LifeCycleServlet" );
dispatcher.forward(request, response);
|
getRequestDispatcher()方法的参数必须以“/”开始,“/”表示本Web应用程序的根目录。如上例中,
表示要跳转的地址为http://localhost:8080/servlet/servlet/LifeCycleServlet。
forward是最常用的方式,在Structs等MVC框架中,都是用Servlet来处理用户请求,把结果通过request.setAttribute()放到request中,
然后forward到JSP中显示。
当执行forward方法时,不能有任何输出到达客户端,否则会抛出异常,也就是说,在forward之前,不要使用out.println()语句向客户端输出。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String destination = request.getParameter( "destination" );
if ( "file" .equals(destination)){
RequestDispatcher d = request.getRequestDispatcher( "/WEB-INF/web.xml" );
d.forward(request, response);
} else if ( "jsp" .equals(destination)){
request.setAttribute( "date" , new Date()); //attributes are reset between requests.
RequestDispatcher dispatcher = request.getRequestDispatcher( "/forward.jsp" );
dispatcher.forward(request, response);
} else if ( "servlet" .equals(destination)){
RequestDispatcher disp = request.getRequestDispatcher( "/servlet/LifeCycleServlet" );
disp.forward(request, response);
} else {
response.setCharacterEncoding( "UTF-8" );
response.getWriter().println( "缺少参数。用法:" +request.getRequestURI()+ "?destination=jsp或者file或者servlet" );
}
}
|
2. 重定向(Redirect)
重定向是通过服务器端返回状态码来实现的。301,302都表示重定向,区别是301表示永久性重定向,302表示临时性重定向。通过sendRedirect(String location)就可以实现重定向,下面是例子。本例子主要实现了Servlet来实现文件下载并统计下载次数。要下载的文件以及下载次数都保存在一个Map中。主要思路是:首先加载页面表单,当用户点击下载链接时,客户端发起请求,运行doGet里的if判断,实现重定向。
重定向和跳转的区别:跳转是在服务器端实现的,客户端浏览器并不知道该浏览动作,而使用Redict跳转时,跳转是在客户端实现的,也就是说客户端浏览器实际上请求了2次服务器。
public class RedictServlet extends HttpServlet {
Map<String,Integer> map = new HashMap<String,Integer>(); //new一个Map
public void init() throws ServletException { //放在init中,加载servlet时运行此方法,把文件内容放到map中去
map.put( "/download/setup.exe" , 0 );
map.put( "/download/application.zip" , 0 );
map.put( "/download/01.mp3" , 0 );
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filename = request.getParameter( "filename" );
if (filename!= null ){
int hit = map.get(filename); //取下载次数
map.put(filename, ++hit); //下载次数加1后保存
response.sendRedirect(request.getContextPath()+filename); //重定向到文件
} else {
response.setCharacterEncoding( "UTF-8" );
PrintWriter out = response.getWriter();
response.setContentType( "text/html" );
out.println( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">" );
out.println( "<HTML>" );
out.println( " <HEAD><TITLE>文件下载</TITLE></HEAD>" );
out.println( " <link rel='stylesheet' type='text/css' href='../css/style.css'>" );
out.println( " <BODY><br/>" );
out.println( "<fieldset align=center style=width:90%><legend>文件下载</legend>" ); //绘制页面表单
out.println( "<table width=100%>" );
out.println( " <tr>" );
out.println( " <td><b>文件名" + "</b></td>" );
out.println( " <td><b>下载次数</b></td>" );
out.println( " <td><b>下载</b></td>" );
out.println( " </tr>" );
for (Entry<String,Integer> entry: map.entrySet()){ //遍历map的方法
out.println( "<tr>" );
out.println( " <td>" +entry.getKey()+ "</td>" );
out.println( " <td>" +entry.getValue()+ "</td>" );
out.println( " <td><a href = '" +request.getRequestURI()+ "?filename=" +entry.getKey()+ "'target = '_blank' onclick ='location = location;'>下载</a></td>" ); //target='_blank'目标地址在无标题的新页面中打开。onclick ='location = location;'页面刷新
out.println( "</tr>" );
}
out.println( "</table>" );
out.println( " </legend>" );
out.println( " </BODY>" );
out.println( "</HTML>" );
out.flush();
out.close();
}
}
public void destroy() {
super .destroy(); // Just puts "destroy" string in log
// Put your code here
map = null ;
}
}
|
结果图:
Servlet之间的跳转相关推荐
- jsp与servlet之间页面跳转及参数传递实例
1.从一个jsp页面跳转到另一个jsp页面时的参数传递 (1)使用request对象获取客户端提交的信息 login.jsp页面代码如下: [java] view plaincopy < ...
- 11. jsp与servlet之间页面跳转及参数传递实例
1.从一个jsp页面跳转到另一个jsp页面时的参数传递 (1)使用request对象获取客户端提交的信息 login.jsp页面代码如下: [java] view plain copy < ...
- .jsp与servlet之间页面跳转及参数传递实例
1.从一个jsp页面跳转到另一个jsp页面时的参数传递 (1)使用request对象获取客户端提交的信息 login.jsp页面代码如下: [java] view plaincopy &l ...
- (转载)jsp与servlet之间页面跳转及参数传递实例
兴致所来,重温动态web开发的基本mvc架构,从servlet开始 ,发现如下博客所介绍的清晰明了,故而转载. http://blog.csdn.net/ssy_shandong/article/de ...
- Servlet之间跳转
Servlet之间跳转 Servlet之间的跳转: 转发Forward 请求转发原理 Forward相关方法 重定向Redirect 重定向和请求转发的区别 Servlet之间的跳转: Servlet ...
- JSP与servlet之间的传值方式
总结JSP与servlet之间的传值 JSP与 servlet之间的传值有两种情况:JSP -> servlet, servlet -> JSP. 通过对象 request和 se ...
- jsp form提交到后台中文乱码_JSP与servlet之间的数据传递
[51] Jsp与Servlet之间的传值有两种,一种是Jsp传值给Sevlet,另一种是Servlet传值给Jsp:使用request.response对象完成传值,具体实现如下: Jsp与Serv ...
- Jsp与Servlet之间传值方式
JSP与servlet之间的传值方式 JSP与 servlet之间的传值有两种情况:JSP -> servlet, servlet -> JSP. 通过对象 request和 sessio ...
- JSP与Servlet之间传值
JSP与Servlet之间传值 Jsp与Servlet之间的传值有两种,一种是Jsp传值给Sevlet,另一种是Servlet传值给Jsp:使用request.response对象完成传值,具体实现如 ...
最新文章
- 机器学习(MACHINE LEARNING)协方差与相关系数
- UrlPager免费分页控件2.0版发布!
- php fetchassoc 跨表,php-mysqli_fetch_assoc-如果同时更改数据会怎样?
- centos 日志审计_Linux\CentOS中auditd安全审计工具的使用
- java readline最后一行_java – 如何在reader.readLine()中检测第一行和最后一行?
- php黄页,PHP 黄页的url
- 在pycharm中导入anaconda的库
- 做柱状图加数据标签_Origin绘图:如何优雅的绘制堆叠柱状图
- 制造业一声叹息!干30年实业不如炒股?
- 通过CMD命令行获取文件夹下的所有文件名称(电脑小白专用)
- 【MySQL】Unknown column 'column_name' in 'field list'
- Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
- JAVA_WEB程序设计教程 pdf
- 用Python绘制了若干张词云图,惊艳了所有人
- Java微服务和分布式区别
- p1007无线打印服务器,把你的打印机共享出来:Hardlink 固网 打印服务器HP-1007
- 双硬盘双win10互不干扰_win10系统安装双硬盘却无法显示另一个硬盘的技巧介绍...
- IIO子系统(Linux驱动开发篇)
- 1离线TiDB-Ansible 部署问题-总结
- patch 和 put 方法区别
热门文章
- 最短路径问题 --- Dijkstra算法详解
- 写代码之前应该做的几件事
- linux编程之pipe()函数
- nginx rtmp代码架构1 hook点总结
- centos下安装ruby,删除ruby
- 网络抓包工具 wireshark教程
- Error: java.lang.RuntimeException: java.lang.NoSuchMethodException: com.henu.WC $WCMapper.init()
- leetcode 396. Rotate Function | 396. 旋转函数(错位相减)
- 【设计模式】装饰器模式的使用
- 【算法笔记】重刷PAT 题解合集