你的位置:首页 > Java教程

[Java教程]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.

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.20       RequestDispatcher d = request.getRequestDispatcher("/WEB-INF/web.);21       d.forward(request, response);22     }else if("jsp".equals(destination)){//跳转到UploadFile.jsp23       RequestDispatcher dispatcher = request.getRequestDispatcher("/page/UploadFile.jsp");24       dispatcher.forward(request, response);25     }else if("servlet".equals(destination)){//跳转到另一个Servlet26       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.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.

跳转到jsp:

二、重定向(Redirect)

 1.重点说明

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

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

2.代码实践

web.

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 log20     // Put your code here21     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()){//遍历map47         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 here66     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自己的路径时,就会定时自动刷新本页面。