Servlet 转发与重定向

在实际的网站开发中,页面的跳转是最常见的。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、主要区别:

  1. sendRedirect()方法不但可以在位于同一个主机上的不同Web应用程序之间进行重定向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。而forward()方法只能将请求转发给同一Web应用的组件。

  2. 转发是在服务器端完成,因此称为服务器端跳转, 一次请求
    重定向是在客户端完成,因此称为客户端跳转,两次请求

  3. 转发:浏览器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。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值