1 转发
-什么是转发
一个Wenb组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个Web组件继续完成.
常见情况:一个Servlet获得数据之后(比如通过调用dao),将这些数据转发给一个JSP,有这个JSP来展现这些数据(以表格的方式来展现)
- 如何实现转发
1.绑定数据到request对象
request.setAttribute(String name,Object obj);
- name:绑定名
- obj:绑定值
读取绑定值
request.getAttribute(String name) 如果绑定名对应的值不存在,返回null
2.获得转发器
RequestDispatcher rd = request.getRequestDispatcher(String uri);
uri:转发的目的地,即将未完成的处理继续下去的另一个组件,比如一个JSP文件
3.转发
rd.forward(request,response);
request.getRequestDispatcher(uri).forward(request,response);
转发原理
转发特点
- 转发之后,地址栏地址不会发生变化,原因是转发的过程是发生在服务器内部的,浏览器并不知道
- 转发的目的地必须是同一个应用内部的某个地址
- 转发所涉及的各个Web组件会共享同一个request对象和response对象
转发与重定向区别 - 重定向是浏览器发生请求并收到响应以后再次向一个新的地址发请求,转发是服务器收到请求后为了完成响应转到一个新的地址
- 重定向中有两次请求对象,不共享数据,转发只产生一次请求对象且在组件间共享数据
- 重定向后地址栏地址改变,而转发则不会
- 重定向的新地址可以是任意地址,转发的新地址必须是同一个应用内的某个地址
2 路径
什么是路径
- 连接地址
- 表单提交
- 重定向 response.sendRedirect(url)
- 转发 request.getRequestDispatcher(url)
什么是相对路径
- 从当前文件出发到达目标文件所经过的路径叫做相对路径
- 书写格式上不以"/“开头
- 退至上一级目录以”…/"开头
什么是绝对路径
- 以"/"开头的路径都是绝对路径,不以当前文件的位置作为起始,而是以一个固定位置作为起始到达目标文件所经过的路径
- 这个固定位置可能是应用名,也可能是应用名之后
路径的处理
- 转发是同次请求(由服务器请求下一个资源)
重定向是多次请求(由服务器重定向到客户端,由客户端请求下一个资源)
一句话总结:转发是由服务器发出请求,重定向是由客户端发出请求 - 注意:转发和重定向的URLString前有加 / 为绝对路径 反之为相对路径
1.假设通过表单请求指定的Url资源 action=“LoginServlet”
则表单生成的请求地址为:
http://localhost:8080/项目名/LoginServlet
2.在servlet处理请求之后重定向到下面指定资源
参数可以指定为相对路径或绝对路径或web应用程序。
①相对路径:response.sendRedirect(“Manager/index.jsp”)
生成的地址:原来请求地址+参数生成完整的URL即:
http://localhost:8080/项目名/Manager/index.jsp
②绝对路径:response.sendRedirect("/Manager/index.jsp")
生成的地址:web服务器本身地址+参数生成完整的URL 即:
http://localhost:8080/Manager/index.jsp
③其他web应用地址
response.sendRedirect(“http://www.baidu.com”)
容器直接定向到该URL。
3.在servlet处理请求之后转发到以下指定资源
参数可以指定为相对路径或绝对路径。
①相对路径
相对路径情况下生成的完整URL与重定向方法相同。
②绝对路径
绝对路径与重定向不同,容器将相对于Web应用的根目录加参数生成完整的URL
生成的地址: 原来请求地址+参数生成完整的URL 即:
http://localhost:8080/项目名/Manager/index.jsp
转发用相对路径和绝对路径地址都一样。
4. ServletContext.getRequestDispatcher(UrlString)
参数只能指定为绝对路径,生成的完整URL与 HttpServletRequest.getRequestDispatcher(String)相同。