欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet 之间的跳转+数据传递

程序员文章站 2024-03-15 10:56:17
...

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