转发和重定向
1.转发
1.1什么是转发?
一个web组件将未完成得处理交给另外一个web组件继续做,web组件指得是jsp或者servlet,常见得场景是一个servlet获取处理结果之后交给一个jsp来展示。
1.2如何转发?
绑定数据到request对象:
1.通过HttpServletRequest提供得方法setAttribute(string name,object obj),
name:一般称为绑定名 obj:一般称为绑定值
2.通过httpservletRequest提供得方法getAttribute(string name),name:绑定名(通过绑定名可以获取绑定得值)。
1.3获取转发器
RequestDispatcher rd=req.getRequestDispatcher(String url); url:转发得地址
RequestDispatcher是一个接口,该方法返回一个符合该接口要求得对象,我们称之为转发器;
转发得本质就是一个web组键通过转发器通知容器(tomcat)去调用另外一个web组键;
1.4转发的特点
1.转发之后,浏览器地址栏不会发生改变
2.转发只创建了一个req和res;
3.转发得目的地址是有限得,要求是一个应用中得某个组件得地址;
1.5转发原理图
1.6代码演示
web.xml配置文件
<servlet>
<servlet-name>atteribute</servlet-name>
<servlet-class>web.DemoAttribute</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>atteribute</servlet-name>
<url-pattern>/att</url-pattern>
</servlet-mapping>
Servlet(业务层)
public class DemoAttribute extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String name="admin";
//通过HttpServletRequest进行数据绑定
req.setAttribute("username",name);
//获取转发器
RequestDispatcher rd=req.getRequestDispatcher("demo.jsp");
//转发
rd.forward(req,res);
}
}
转发后的页面Demojsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%=request.getAttribute("username") %>
</body>
</html>
结果
当我们在地址栏输入att地址,回车后,会得到业务层request所绑定的值。
2.重定向
2.1什么是重定向?
重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置.
2.2转发原理图
2.3代码演示
与转发代码几乎相同,不同的是在业务层,转发用的是转发方式,重定向用的是重定向的方式。(有点废话)
public class DemoAttribute extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String name="admin";
//通过HttpServletRequest进行数据绑定
req.setAttribute("username",name);
//HttpServletResponse提供了方法sendRedirect(String url);
//url重定向的地址
//res.sendRedirect("demo.jsp");
}
}
转发后的demo.jsp页面
从结果可以看出重定向无法获取业务层所绑定的值,并且地址也发生了变化,转发还是att,但是重定向变成了demo.jsp
3.总结
转发和重定向得区别:
- 1.数据绑定和数据获取转发可以,而重定向不可以
- 2.转发只访问一次服务器(一次请求)创建了一个resquest和response,而重定向访问了两次服务器
- (两次请求)创建了两个request和response;
- 3.转发得地址栏不会发生变化而重定向地址栏会发生变化也就是最后一次请求地址。