请求重定向
在某些情况下,针对客户端的请求,一个Servlet类可能无法完成全部工作。这时,可以使用请求重定向来完成。所谓请求重定向,指的是Web服务器接受到客户端的请求后,可能由于某些条件限制,不能访问当前请求URL所指向的Web资源,而是指定了一个新的资源路径,让客户端重新发送请求。
为了实现请求重定向,在HttpServletResponse接口中,定义了一个sendRedirect()方法,该方法用于生成302响应码和Location响应头,从而通知客户端重新访问Location响应头中指定的URL,sendRedirect()方法的完整语法如下所示:
public void sendRedirect(java.lang.String location) throws java.io.IOException
需要注意的是,参数location可以使用相对URL,Web服务器会自动将相对URL翻译成绝对URL,再生成Location头字段。
为了使大家更好地了解sendRedirect()方法如何实现请求重定向,接下来,通过一个图例来描述sendRedirect()方法的工作原理,如图1所示。
图1 sendRedirect()方法的工作原理
在图1中,当客户端访问Servlet1时,由于在Servlet1中调用了sendRedirect()方法将请求重定向到Servlet2中,因此,Web服务器在收到Servlet1的响应消息后,立刻向Servlet2发送请求。Servlet2对请求处理完毕后,再将响应消息回送给客户端。
了解了sendRedirect()方法的工作原理,接下来,通过一个用户登录的案例,分步骤讲解sendRedirect()方法的使用,具体如下:
(1)编写用户登录的界面login.html和登录成功的界面welcome.html,如例1、例2所示。
例1 login.html
1 <!--把表单内容提交到chapter05工程下的LoginServlet-->
2 <form action="/chapter05/LoginServlet" method="post">
3 用户名: <input type="text" name="username" /><br>
4 密 码: <input type="password" name="password" /><br>
5 <input type="submit" value="登录" />
6 </form>
例2 welcome.html
1 <html>
2 <head>
3 <title>Insert title here</title>
4 </head>
5 <body>
6 欢迎你,登录成功!
7 </body>
8 </html>
(2)编写处理用户登录请求的LoginServlet,如例3所示。
例3 LoginServlet.java
1 package cn.itcast.chapter05.response;
2 import java.io.*;
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 public class LoginServlet extends HttpServlet {
6 public void doGet(HttpServletRequest request,
HttpServletResponse response)
7 throws ServletException, IOException {
8 response.setContentType("text/html;charset=utf-8");
9 // 用HttpServletRequest对象的getParameter()方法获取用户名和密码
10 String username = request.getParameter("username");
11 String password = request.getParameter("password");
12 // 假设用户名和密码分别为:itcast和123
13 if (("itcast").equals(username) &&
("123").equals(password)) {
14 // 如果用户名和密码正确,重定向到 welcome.html
15 response.sendRedirect("/chapter05/welcome.html");
16 } else {
17 // 如果用户名和密码错误,重定向到login.html
18 response.sendRedirect("/chapter05/login.html");
19 }
20 }
21 public void doPost(HttpServletRequest request,
HttpServletResponse response)
22 throws ServletException, IOException {
23 doGet(request, response);
24 }
25 }
在例3中,判断表单中如果输入的用户名为“itcast”,密码为“123”,将请求重定向到welcome.jsp页面,否则重定向到login.html页面。
(3)在web.xml中配置完LoginServlet映射后,启动Tomcat服务器,在浏览器的地址栏中输入URL地址http://localhost:8080/chapter05/login.html
访问login.html,浏览器显示的结果如图2所示。
图2 运行结果
(4)在图2所示的界面填写用户名“itcast”,密码“123”,点击登录按钮,浏览器显示的结果如图3所示。
图3 运行结果
从图3中可以看出,当用户名和密码输入正确后,浏览器跳转到了welcome.html页面。但是,如果用户名或者密码输入错误,则会跳转到如图2所示的页面。