Java开发之Servlet之间的跳转
一、转向(Forward)
1.要点说明
转向是通过RequestDispatcher对象的forward()方法来实现的。RequestDispatcher可以通过HttpServletRequest的getRequestDispatcher()方法获得。getRequestDispatcher()方法的参数必须以“/”开始。Forward不仅可以跳转到本应用的另一个Servlet、JSP页面,也可以跳转到另一个文件,甚至WEB-INF文件夹下的文件。
转向通过request.setAttribute()把结果放到request中,然后forward到jsp中显示。
注意:当执行forward动作的时候不能有任何输出到客户端(例如:System.out.println()),否则会抛出IllegalStateException。也就是在forward之前尽量不要使用out.println()语句向客户端输出。
2.代码实践
web.xml
<!-- 转向(Forward) -->
<servlet>
<servlet-name>ForwardServlet</servlet-name>
<servlet-class>com.servlet.ForwardServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ForwardServlet</servlet-name>
<url-pattern>/servlet/ForwardServlet</url-pattern>
</servlet-mapping>
ForwardServlet.java
package com.servlet; 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 ForwardServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { request.setCharacterEncoding("UTF-8");
String destination = request.getParameter("destination");
if("file".equals(destination)){//跳转到/WEB-INF/web.xml
RequestDispatcher d = request.getRequestDispatcher("/WEB-INF/web.xml");
d.forward(request, response);
}else if("jsp".equals(destination)){//跳转到UploadFile.jsp
RequestDispatcher dispatcher = request.getRequestDispatcher("/page/UploadFile.jsp");
dispatcher.forward(request, response);
}else if("servlet".equals(destination)){//跳转到另一个Servlet
RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/LifeCycleServlet");
dispatcher.forward(request, response);
}else{
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
response.getWriter().println("缺少参数。用法:"+request.getRequestURI()+
"?destination=jsp或者file或者servlet");
} } }
Forward.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'Forward.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<div align="center">
<input type="button" onclick='location="<%=basePath%>servlet/ForwardServlet"
+"?destination=servlet";' value='跳转到LifeCycleServlet'>
<input type="button" onclick='location="<%=basePath%>servlet/ForwardServlet"
+"?destination=file";' value='跳转到web.xml'>
<input type="button" onclick='location="<%=basePath%>servlet/ForwardServlet"
+"?destination=jsp";' value='跳转到JSP'>
</div>
</body>
</html>
3.效果截图
Forward.jsp:
跳转到servlet:
跳转到web.xml:
跳转到jsp:
二、重定向(Redirect)
1.重点说明
重定向是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器端会返回一个状态码。服务器端通过HttpServletResponse的setStatus()方法设置状态码。
状态码 | 意义 |
1xx | 信息状态码。表示该请求已经被接受,正在被处理。 |
2xx | 正确状态码。表示该请求已经被正确接收并处理,没有错误等发生。例如:200表示一切正确。 |
3xx | 重定向状态码。例如301(永久性重定向),302(零时性重定向)表示该资源已经不存在或者换了地址,客户端需要重新定向到一个新的资源。服务器响应中会附带这个新资源地址。 |
4xx | 请求错误。例如401表示没有权限访问,404表示资源不存在,405表示访问方式错误(如Servlet只接受GET,POST方式访问但是客户端却以DELETE方式访问) |
5xx | 服务器错误。例如500表示程序出现异常而中途停止运行。 |
2.代码实践
web.xml
<!-- 重定向(Redirect) -->
<servlet>
<servlet-name>RedirectServlet</servlet-name>
<servlet-class>com.servlet.RedirectServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RedirectServlet</servlet-name>
<url-pattern>/servlet/RedirectServlet</url-pattern>
</servlet-mapping>
RedirectServlet.java
package com.servlet; import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class RedirectServlet extends HttpServlet { Map<String,Integer> map = new HashMap<String, Integer>(); public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
map = null;
} 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");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>文件下载</TITLE></HEAD>");
out.println(" <BODY>");
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>");
out.println("</tr>");
}
out.println("</table>");
out.println("</legend>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
} public void init() throws ServletException {
// Put your code here
map.put("/uploadfile/1.txt", 0);
map.put("/uploadfile/2.txt", 0);
map.put("/uploadfile/3425.jpg", 0);
} }
3.效果截图
三、自动刷新(Refresh)
1.重点说明
自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,还可以实现一段时间之后自动刷新本页面。Servlet中通过HttpServletResponse对象设置Header属性实现自动刷新效果。
2.代码实践
response.setHeader("Refresh", "1000; URL=http://localhost:8080/King/servlet/Forward.jsp");
其中1000为时间,单位毫秒。当URL设置的路径为Servlet自己的路径时,就会定时自动刷新本页面。
Java开发之Servlet之间的跳转的更多相关文章
- Java开发之Servlet生命周期
Servlet会在服务器启动或第一次请求该Servlet的时候开始生命周期,在服务器结束的时候结束生命周期.无论请求多少次Servlet,最多只有一个Servlet实例.多个客户端并发请求Servle ...
- Jsp与servlet之间页面跳转及参数传递实例(转)
原网址:http://blog.csdn.net/ssy_shandong/article/details/9328985 11. jsp与servlet之间页面跳转及参数传递实例 分类: Java ...
- Servlet——提交表单信息,Servlet之间的跳转
HTML表单标签:<form></form> 属性: actoion: 提交到的地址,默认为当前页面 method: 表单提交方式 有get和post两种方式,默认为get ...
- JavaWeb开发之Servlet
1. Servlet有关概念和前置知识 1.1 什么是动态网页 如果浏览器在不同时刻或不同条件下访问web服务器上的某个页面,浏览器所获得的页面内容可以发生变化,那么这个页面就称之为动态页面. 动态网 ...
- Java开发之javaEE(java2EE)的介绍,java软件工程师初步阶段知识
1. 为什么需要JavaEE 我们编写的JSP代码中,由于大量的显示代码和业务逻辑混淆在一起,彼此嵌套,不利于程序的维护和扩展.当业务需求发生变化的时候,对于程序员和美工都是一个很重的负担. 为了程序 ...
- 【转】(超详细)jsp与servlet之间页面跳转及参数传递实例
初步学习JavaEE,对其中jsp与Servlet之间的传值没弄清楚,查看网上资料,发现一篇超详细的文章,收获大大,特此记录下来.具体链接:http://blog.csdn.net/ssy_shand ...
- Java Web开发之Servlet、JSP基础
有好多年不搞Java Web开发了,这几天正好国庆放假,放松之余也有兴趣回头看看Java Web开发技术的基础. 我们都知道,Servlet是Java Web开发的重要基础,但是由于Servlet开发 ...
- Java Web开发之Servlet获取ckeditor内容
js: <!-- ckeditor插件 --> <script type="text/javascript" src="js/ckeditor/cked ...
- web开发之Servlet 三
昨天我们学习了Servlet的运行过程和生命周期,那么今天我们学习下Servlet中非常重要的两个类:ServletConfig ServletContext 我们可以看到,与顶层Servlet主动 ...
随机推荐
- Riot - 比 Facebook React 更轻量的 UI 库
Riot 是一个类似 Facebook React 的用户界面库,只有3.5KB,非常轻量.支持IE8+浏览器的自定义标签,虚拟 DOM,语法简洁.Riot 给前端开发人员提供了除 React 和 P ...
- Hybrid框架UI重构之路:五、前端那点事儿(HTML、CSS)
上文回顾 :Hybird框架UI重构之路:四.分而治之 这里讲述在开发的过程中,一些HTML.CSS的关键点. 单页模式的页面结构 在单页模式中,弱化HTML的概念,把HTML当成一个容器,BODY中 ...
- HtmlAgilityPack---Html解析框架
如果你想从一段HTML中提取出指定的标记(如:获取所有的div.获取具有指定属性的元素)如果你想编辑一段HTML,修改里面的部分元素如果你想判断一段HTML中指定元素的关系(子节点.父节点.兄弟节点. ...
- sharepoint列表如何进行随机取几条记录?
sharepoint列表如何进行随机取记录?由于itemid是不连续.可能存在删除添加等操作导致 我们可以采用随机取第几条记录.把记录集合取出来.产生随机第几条数.这里关键是如何产生不重复的随机数 方 ...
- MS15-020漏洞测试
名称:Microsoft DLL植入远程代码执行漏洞(CVE-2015-0096)(MS15-020) 了解:Microsoft Windows没有正确处理DLL文件的加载,存在远程代码执行漏洞,通过 ...
- 内网渗透测试思路-FREEBUF
(在拿到webshell的时候,想办法获取系统信息拿到系统权限) 一.通过常规web渗透,已经拿到webshell.那么接下来作重要的就是探测系统信息,提权,针对windows想办法开启远程桌面连接, ...
- 愚人节大狂欢 – ADN DevBlog谎话连篇友谊赛
愚人节过去了,你被捉弄了没有? :) 借这个机会,ADN的哥们儿也发泄狂欢了一把,我们4月1号当天在ADN DevBlog上发了一堆谎话连篇的blog,没有一个说实话的,哈哈.这是我们team内部进行 ...
- 服务 {49A27252-A326-4EF1-B698-6EBC7068833C} 的计时器作业 id {573BE459-DF82-481C-84BD-CA14D287450B} 配置刷新的上一个实例仍在运行,因此将跳过当前的实例。请考虑增加作业之间的时间间隔。
在SharePoint2007的错误日志中发现大量如下错误: 07/02/2013 16:17:25.99 OWSTIMER.EXE (0x0958) 0x097C Window ...
- yii create url (二)
在Yii中经常要生成URL,不管是为了自动跳转还是仅仅是一个链接.下面对Yii中的URL生成做了一个总结.提示:以下controllerX代表控制器X,actionX代表方法X.在Controller ...
- 【读书笔记】iOS网络-测试与操纵网络流量
一,观测网络流量. 观测网络流量的行为叫做嗅探或数据包分析. 1,嗅探硬件. 从iOS模拟器捕获数据包不需要做特别的硬件或网络配置.如果需要捕获这些数据包,那么可以使用嗅探软件来监听回送设备或是用于连 ...