Servlet 之间的跳转+数据传递

本文详细解析Servlet中请求转发(forward)与重定向(redirect)的使用方法及区别,探讨如何在Servlet间高效传递数据,遵循单一职责原则,提升代码可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Servlet 之间的跳转+数据传递

一、问题引出(为什么会有跳转?)

作为初学者,我们的servlet中去包含一下四个部分:

​ 1.从客户端接受请求参数

​ 2.调用业务方法

​ 3.相应给用户界面

​ 4.关闭资源

从工作任务的角度去分析,我们上面的servlet中实现了两个工作:

​ 1.完成业务

​ 2.响应结果

我们基于设计方面的考虑,这样的servlet是存在一下两点缺陷的:

​ 1.不符合单一职责的的设计原则

​ 2.不利于后期维护

因此,我们将xxxServlet拆开写成xxxAction和xxxView,因此就产生了需要从xxxAction跳转到xxxView的需求。

二、两种跳转方式的介绍

1.forward :请求转发

(1)语法格式

request.getRequestDispacher("要跳转的Servlet的url-pattern").forward(request,response);

(2)数据传递

​ 通过request(作用域)传递数据,request就是存储传递数据的容器

存储数据 request.setAttibute(String name,Object value);
获取数据  Object o = request.getAttribute(String)

我们通过getAttribute方法获得的是object类型的对象,通常需要强制类型转换成自己需要的实际类型。

2.redirect : 重定向

(1)语法格式

response.sendRedirect("/项目名/要跳转的Servlet的url-pattern")

(2)数据传递

传递数据  response.sendRedirect("/项目名/要跳转的Servlet的url-pattern?键1=值1......")
String value = request.getParameter(String key)

三、两种跳转方式的区别

​ forward 一次请求服务器内部请求转发 可以用request传递数据地址栏不变

​ redirect 两次请求客户端发送二次请求 不能用request 地址栏会改变\

四、怎样选取跳转方式

  Forward 需要传递复杂数据对象 集合

 Redirect 不需要传递数据

五、代码

​ (1)forword请求跳转

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取数据
		//调用业务方法(用打印语句代表业务处理过程)
		System.out.println("AServlet");
		//传递数据   向request作用域中存储数据
		request.setAttribute("name","liuh");
		//跳转页面   forward 请求转发   跳到BServlet中     参数:目标Servlet中的url
		request.getRequestDispatcher("/b").forward(request,response);
	}

}
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//响应页面(打印语句替代,仅为了展示效果)
		System.out.println("BServelt");
		//获取Request作用域中的name值
		String name = (String)request.getAttribute("name");
		System.out.println("名字为 : "+ name);
		//4.关闭资源
	}
	
}
运行结果为:最终打印了name属性的值
AServlet
BServelt
名字为 : liuh

(2)redirect重定向

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.获取数据
		//2.调用Service完成业务
		//页面跳转    重定向跳转
		response.sendRedirect("/servlet_day3/d?name=liuh");
	}
}

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//相应页面
		//关闭资源
		//接收数据
		String name = request.getParameter("name");
		System.out.println("姓名为:  "+ name);
	}

}
运行结果为:   姓名为:  liuh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值