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
上一篇: 泛型——堆栈输出数列若干项