一、转向(Forward)
1.要点说明
参数必须以“/”开始。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自己的路径时,就会定时自动刷新本页面。