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

1 <!-- 转向(Forward) -->
2   <servlet>
3     <servlet-name>ForwardServlet</servlet-name>
4     <servlet-class>com.servlet.ForwardServlet</servlet-class>
5   </servlet>
6 <servlet-mapping>
7     <servlet-name>ForwardServlet</servlet-name>
8     <url-pattern>/servlet/ForwardServlet</url-pattern>
9   </servlet-mapping>

ForwardServlet.java

 1 package com.servlet;
 2
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5
 6 import javax.servlet.RequestDispatcher;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11
12 public class ForwardServlet extends HttpServlet {
13
14     public void doGet(HttpServletRequest request, HttpServletResponse response)
15             throws ServletException, IOException {
16
17         request.setCharacterEncoding("UTF-8");
18         String destination = request.getParameter("destination");
19         if("file".equals(destination)){//跳转到/WEB-INF/web.xml
20             RequestDispatcher d = request.getRequestDispatcher("/WEB-INF/web.xml");
21             d.forward(request, response);
22         }else if("jsp".equals(destination)){//跳转到UploadFile.jsp
23             RequestDispatcher dispatcher = request.getRequestDispatcher("/page/UploadFile.jsp");
24             dispatcher.forward(request, response);
25         }else if("servlet".equals(destination)){//跳转到另一个Servlet
26             RequestDispatcher dispatcher =  request.getRequestDispatcher("/servlet/LifeCycleServlet");
27             dispatcher.forward(request, response);
28         }else{
29             response.setCharacterEncoding("UTF-8");
30             response.setContentType("text/html");
31             response.getWriter().println("缺少参数。用法:"+request.getRequestURI()+
32                     "?destination=jsp或者file或者servlet");
33         }
34
35     }
36
37 }

Forward.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11
12     <title>My JSP ‘Forward.jsp‘ starting page</title>
13
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22
23   </head>
24
25   <body>
26     <div align="center">
27     <input type="button" onclick=‘location="<%=basePath%>servlet/ForwardServlet"
28     +"?destination=servlet";‘ value=‘跳转到LifeCycleServlet‘>
29     <input type="button" onclick=‘location="<%=basePath%>servlet/ForwardServlet"
30     +"?destination=file";‘ value=‘跳转到web.xml‘>
31     <input type="button" onclick=‘location="<%=basePath%>servlet/ForwardServlet"
32     +"?destination=jsp";‘ value=‘跳转到JSP‘>
33     </div>
34   </body>
35 </html>

3.效果截图

Forward.jsp:

跳转到servlet:

跳转到web.xml:

跳转到jsp:

二、重定向(Redirect)

1.重点说明

重定向是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器端会返回一个状态码。服务器端通过HttpServletResponse的setStatus()方法设置状态码。

HttpServletResponse状态码
状态码 意义
1xx 信息状态码。表示该请求已经被接受,正在被处理。
2xx 正确状态码。表示该请求已经被正确接收并处理,没有错误等发生。例如:200表示一切正确。
3xx 重定向状态码。例如301(永久性重定向),302(零时性重定向)表示该资源已经不存在或者换了地址,客户端需要重新定向到一个新的资源。服务器响应中会附带这个新资源地址。
4xx 请求错误。例如401表示没有权限访问,404表示资源不存在,405表示访问方式错误(如Servlet只接受GET,POST方式访问但是客户端却以DELETE方式访问)
5xx 服务器错误。例如500表示程序出现异常而中途停止运行。

2.代码实践

web.xml

1 <!-- 重定向(Redirect) -->
2   <servlet>
3     <servlet-name>RedirectServlet</servlet-name>
4     <servlet-class>com.servlet.RedirectServlet</servlet-class>
5   </servlet>
6 <servlet-mapping>
7     <servlet-name>RedirectServlet</servlet-name>
8     <url-pattern>/servlet/RedirectServlet</url-pattern>
9   </servlet-mapping>

RedirectServlet.java

 1 package com.servlet;
 2
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 import java.util.HashMap;
 6 import java.util.Map;
 7 import java.util.Map.Entry;
 8
 9 import javax.servlet.ServletException;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 public class RedirectServlet extends HttpServlet {
15
16     Map<String,Integer> map = new HashMap<String, Integer>();
17
18     public void destroy() {
19         super.destroy(); // Just puts "destroy" string in log
20         // Put your code here
21         map = null;
22     }
23
24     public void doGet(HttpServletRequest request, HttpServletResponse response)
25             throws ServletException, IOException {
26
27         String filename = request.getParameter("filename");
28         if(filename != null){//统计下载次数
29             int hit = map.get(filename);//取下载次数
30             map.put(filename, ++hit);//下载次数+1后保存
31             response.sendRedirect(request.getContextPath()+filename);//重定向到文件
32         }else{//显示下载次数
33             response.setCharacterEncoding("UTF-8");
34             response.setContentType("text/html");
35             PrintWriter out = response.getWriter();
36             out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
37             out.println("<HTML>");
38             out.println("  <HEAD><TITLE>文件下载</TITLE></HEAD>");
39             out.println("  <BODY>");
40             out.println("<table width=100%>");
41             out.println("<tr>");
42             out.println("<td><b>文件名</b></td>");
43             out.println("<td><b>下载次数</b></td>");
44             out.println("<td><b>下载</b></td>");
45             out.println("</tr>");
46             for(Entry<String, Integer> entry : map.entrySet()){//遍历map
47                 out.println("<tr>");
48                 out.println("<td>"+entry.getKey()+"</td>");
49                 out.println("<td>"+entry.getValue()+"</td>");
50                 out.println("<td><a href=‘"+request.getRequestURI()+
51                         "?filename="+entry.getKey()+"‘ target=‘blank‘ "+
52                         "onclick=‘location=location;‘>下载</a></td>");
53                 out.println("</tr>");
54             }
55             out.println("</table>");
56             out.println("</legend>");
57             out.println("  </BODY>");
58             out.println("</HTML>");
59             out.flush();
60             out.close();
61         }
62     }
63
64     public void init() throws ServletException {
65         // Put your code here
66         map.put("/uploadfile/1.txt", 0);
67         map.put("/uploadfile/2.txt", 0);
68         map.put("/uploadfile/3425.jpg", 0);
69     }
70
71 }

3.效果截图

三、自动刷新(Refresh)

1.重点说明

自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,还可以实现一段时间之后自动刷新本页面。Servlet中通过HttpServletResponse对象设置Header属性实现自动刷新效果。

2.代码实践

1 response.setHeader("Refresh", "1000; URL=http://localhost:8080/King/servlet/Forward.jsp");

其中1000为时间,单位毫秒。当URL设置的路径为Servlet自己的路径时,就会定时自动刷新本页面。

时间: 2024-10-19 16:23:03

Java开发之Servlet之间的跳转的相关文章

Jsp与servlet之间页面跳转及参数传递实例(转)

原网址:http://blog.csdn.net/ssy_shandong/article/details/9328985 11. jsp与servlet之间页面跳转及参数传递实例 分类: Java Web2013-07-17 16:24 16461人阅读 评论(12) 收藏 举报 jsp servlet传递参数 目录(?)[-] 1从一个jsp页面跳转到另一个jsp页面时的参数传递 2jsp页面传递参数给servlet 3从servlet到jsp页面中传递参数 4从一个servlet到另一个s

Java开发之I/O读取文件实例详解

在java开发或者android开发中,读取文件是不可避免的,以下对java开发中读取文件做了归纳和详解: 1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fileName) { File file = new File(fileN

Java开发之Mybatis框架

mybasits配置文件书写1.configer文件配置<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><

Java Web开发之Servlet、JSP基础

有好多年不搞Java Web开发了,这几天正好国庆放假,放松之余也有兴趣回头看看Java Web开发技术的基础. 我们都知道,Servlet是Java Web开发的重要基础,但是由于Servlet开发相对繁琐,代码量庞大而且不易维护,美工无法参与界面设计开发等不足,于是就诞生了jsp.jsp是对servlet开发模型的重要升级.有了jsp,Java Web开发技术才真正被广泛使用. 一.Servlet 在Java Web开发当中,新建一个类继承(派生)自HttpServlet类即可创建一个Ser

Java Web开发之Servlet获取ckeditor内容

js: <!-- ckeditor插件 --> <script type="text/javascript" src="js/ckeditor/ckeditor.js"></script> window.onload = function(){ //将textarea替换ckeditor var yjfx = null;//研究方向 var jj = null;//简介 jj = CKEDITOR.replace('jj'); y

web开发之Servlet 三

昨天我们学习了Servlet的运行过程和生命周期,那么今天我们学习下Servlet中非常重要的两个类:ServletConfig  ServletContext 我们可以看到,与顶层Servlet主动关联的是ServletConfig  ServletRequest ServletResponse ,它们通过容器传递给Servlet;其中Servlet初始化时候使用ServletConfig,另外两个是请求时调用传给Servlet. 一.ServletConfig 讲解 ServletConfi

Java-web开发之Servlet

1.环境搭建 Apache软件基金会(Apache Software Foundation,ASF)是专门为支持开源软件项目而办的一个非盈利性组织. Apache Tomcat 是一个可以执行Java Servlet和JavaServer网页技术的开源软件.地址:tomcat.apache.org 2.Servlet简介 Servlet是用Java程序编写的服务端程序.Servlet主要运行在服务端,并由服务器调用. 3.Servlet程序实现 继承HttpServlet类 复写doGet( )

web开发之Servlet 一

因为最近在研究公司一套新的框架,发现这套框架的底层是对Struts2,Spring 封装后的WEB应用框架,而我发现如果仅仅是利用这个框架开发,确实很容易快速上手,做业务来说是没有问题的,但我觉得如果只对上层如何去用熟悉是不行,必须要学习其底层是如何玩的,而任何一套WEB应用框架的开发,肯定都是基于Servlet 对象中各个方法的生命周期来进行的,因此对Servlet的研究是有必要,虽然以前学过,但是很多原理都遗忘了,为此决定重新学习一下. 本人的开发工具和环境是:Myeclipse + Tom

Java开发之Socket编程详解

本文从3个方面对Socket编程进行详解: 一,网络编程中两个主要的问题 二,两类传输协议:TCP:UDP 三,基于Socket的java网络编程 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机.而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要