在实际的网站开发中,页面的跳转是最常见的。Servlet中的页面跳转可以通过转发或者重定向来实现。
使用response对象提供的sendRedirect()方法,可以将网页重定向到另一个页面。SendRedirect()方法的语法格式:response.sendRedirect(String path)。参数path指的是目标的路径,这个路径可以是相对的,也可以是不同主机的其他URL地址。
接下来使用response.sendRedirect(String path)来进行页面的重定向:
创建login.jsp,编写一个简单的登录表单
<form action="<%=basePath%>servlet/LoginServlet" method="post" id="form">
<table>
<tr>
<th>用户名:</th>
<td><input name="UserNuber" type="text" />
</td>
</tr>
<tr>
<th>密码:</th>
<td><input name="password" type="password" />
</td>
</tr>
<tr>
<th></th>
<td>
<button type="button" id="login">登录</button>
</td>
</tr>
<tr>
<th></th>
<td>
<a href="jsp/register.jsp">没有账号?去注册--></a>
</td>
</tr>
</table>
</form>
接下来在LoginServlet中接收参数
public void doPost(HttpServletRequest request, HttpServletResponse response) {
response.setCharacterEncoding("utf-8");
String UserNuber = request.getParameter("UserNuber");//接收页面参数
String password = request.getParameter("password");
try {
UserVo userVo = userImpl.selectUserByUser(UserNuber);
if (userVo.getUserNuber() != null) {
//判断用户名和密码
if (password.equals(userVo.getPassword())) {
//验证成功,页面重定向到index.jsp
response.sendRedirect("/myDemo2/jsp/index.jsp");
} else {
response.getWriter().write("密码错误!请注意大小写!");
}
} else {
response.getWriter().write("该用户不存在!");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
返回浏览器可以看到页面已经跳转到了index.jsp页面
注意看页面的URL,在登录界面的时候的URL是http://127.0.0.1:8080/myDemo2/login.jsp
而登录成功后的index.jsp页面的URL是http://127.0.0.1:8080/myDemo2/jsp/index.jsp
这里就可以知道重定向和转发的不同点之一,我们可以看一下转发的效果:
if (password.equals(userVo.getPassword())) {
//可以将要发送的值写入request中
request.setAttribute("UserNuber", UserNuber);
//指定转发地址,然后将request和response发送过去
request.getRequestDispatcher("/jsp/index.jsp").forward(request, response);
} else {
response.getWriter().write("密码错误!请注意大小写!");
}
在index.jsp中接收request:
<h3><%=request.getAttribute("UserNuber", UserNuber)%></h3>
<p>欢迎来到主页面!</p>
可以看到页面接收到了从LoginServlet发送过来的UserNuber,下面我们在看看页面的URL
http://127.0.0.1:8080/myDemo2/servlet/LoginServlet
竟然是LoginServlet的URL。
也就是说,从login.jsp请求到LoginServlet,再从LoginServlet重定向到index.jsp的时候,URL是会随之改变的,而转发跳转页面却还是LoginServlet的URL。
在Servlet中实现页面转发,使用的是RequestDispatcher对象的forward()方法,而重定向主要应用的是HttpServletResponse对象的sendRedirect()方法,该方法与forward()有着本质的区别。使用forward()方法时,会将当前的请求转发到其他Web组件,如Servlet、jsp、HTML。被请求的页面可以通过request内置对象来得到该请求。而sendRedirect()方法不会转发请求,只是简单的页面跳转。
转发和重定向都能让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。
1、转发:有两种方式获得转发对象(RequestDispatcher):一种是通过HttpServletRequest的getRequestDispatcher()方法获得,一种是通过ServletContext的getRequestDispatcher()方法获得;
以前的request范围中存放的变量不会失效,就像把两个页面拼到了一起。 例如:
request.getRequestDispatcher (“demo.jsp"). forward(request, response);//转发到demo.jsp
详解:假设浏览器访问servlet1,而servlet1想让servlet2为客户端服务。此时servlet1调用forward()方法,将请求转发给servlet2。但是调用forward()方法,对于浏览器来说是透明的,浏览器并不知道为其服务的Servlet已经换成Servlet2,它只知道发出了一个请求,获得了一个响应。浏览器URL的地址栏不变。
2、重定向:HttpServletResponse的sendRedirect()方法。
服务器根据此请求寻找资源并发送给客户,它可以重定向到任意URL,不能共享request范围内的数据。例如:
response.sendRedirect(“demo.jsp");//重定向到demo.jsp
详解:假设浏览器访问servlet1,而servlet1想让servlet2为客户端服务。此时servlet1调用sendRedirect()方法,将客户端的请求重新定向到Servlet2。接着浏览器访问servlet2,servlet2对客户端请求作出反应。浏览器URL的地址栏改变。
3、主要区别:
-
sendRedirect()方法不但可以在位于同一个主机上的不同Web应用程序之间进行重定向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。而forward()方法只能将请求转发给同一Web应用的组件。
-
转发是在服务器端完成,因此称为服务器端跳转, 一次请求
重定向是在客户端完成,因此称为客户端跳转,两次请求 -
转发:浏览器URL的地址栏不变。
重定向:浏览器URL的地址栏改变。
重定向请求到另一个网页的最简单的方式是使用 response 对象的 sendRedirect() 方法。下面是该方法的定义:
public void HttpServletResponse.sendRedirect(String location)
throws IOException
该方法把响应连同状态码和新的网页位置发送回浏览器。您也可以通过把 setStatus() 和 setHeader() 方法一起使用来达到同样的效果:
....
String site = "http://www.runoob.com" ;
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
....
实例
本实例显示了 Servlet 如何进行页面重定向到另一个位置:
package com.runoob.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class PageRedirect
*/
@WebServlet("/PageRedirect")
public class PageRedirect extends HttpServlet{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
// 要重定向的新位置
String site = new String("http://www.runoob.com");
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
}
}
现在让我们来编译上面的 Servlet,并在 web.xml 文件中创建以下条目:
....
<servlet>
<servlet-name>PageRedirect</servlet-name>
<servlet-class>PageRedirect</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PageRedirect</servlet-name>
<url-pattern>/TomcatTest/PageRedirect</url-pattern>
</servlet-mapping>
....
现在通过访问 URL http://localhost:8080/PageRedirect 来调用这个 Servlet。这将把您转到给定的 URL http://www.runoob.com。