servlet-03-重定向/转发
1、重定向
浏览器向服务器发请求,服务器返回一个302的状态码以及location的消息头,浏览器接受到的302之后,会立即向location指向的地址发新的请求
如何重定向
//url:重定向的目的地 response.sendRedirect(String url);
编程注意点:
a. 重定向之前,不能调用out.close()或者out.flush()方法
b. 重定向之前,会清空response缓存中的数据
特点:
a.重定向的地址是任意的,可以跨应用,也可以跨服务
b.重定向之后,浏览器的地址会发生改变
2、转发
一个web组件将未做完的事情交给另外一个web组件继续完成。通常情况是servlet负责取数据,jsp负责展示数据
如何转发
step1:将数据绑定到request上
//name:绑定名 obj:绑定值
request.setAttribute(String name,Object obj);
//根据绑定名获取绑定值
Object:request.getAttribute(String name);
注:绑定名若写错,返回null
step2:获取转发器
//url:转发目的地
RequestDispatcher rd=request.getRequestDispatcher(String url);
step3:转发
rd.forward(request,response);
转发的编程注意点:
a. 转发之前不能调用out.close()或者out.flush()方法
b. 转发之前,服务器会清空response对象中的缓存数据
转发的特点:
a. 转发之后,浏览器地址栏的地址不会发生改变
b. 只能在同一应用内部转发,不能跨应用,也不能跨服务
c. 转发之间的组件共享请求对象与响应对象
3、路径问题
a. 链接<a href="del.do"></a>
b. 表单<form action="update.do"></form>
c. 重定向 response.sendRedirect("list.do");
d. 转发 request.getRequestDispatcher("list.jsp");
相对路径:
不以“/”开头的路径,比如“del.do”、“list.do”,需要计算当前组件路径与目标路径的关系
绝对路径:
以“/”开头的路径,比如“/servlet01/del.do”,像链接、表单、重定向:以“/”开头,从应用名开始写
转发:以“/”开头,从应用名之后开始写
建议:采用绝对路径写法,更安全