Servlet 方法大揭秘:sendRedirect vs forward
Servlet 方法大揭秘:sendRedirect vs forward
dong4jsendRedirect()方法和 forward() 方法的区别
sendRedirect() 方法原理
- 客户端发送请求, Servlet1 做出处理.
- Servlet1 调用 sendReadirect() 方法, 将客户端的请求重新定位到 Servlet2.
- 客户端浏览器访问 Servlet2.
- Servlet2 对客户端浏览器做出响应.
forward() 方法原理
- 客户端发送请求, Servlet1 做出处理.
- Servlet1 调用 forward() 方法, 将请求转发给 Servlet2 来处理请求, 为客户端服务.
- Servlet2 对客户端浏览器做出响应.
区别
- 定位与转发
- sendRedirect(): 重新定位到另外一个资源来处理请求, URL 会重新定位, 让客户端重新访问另外一个资源.
- forward(): 转发到另外一个资源来处理请求. URL 不会变化. 隐藏了处理对象的变化.
- 处理请求的资源的范围
sendReadirect(): 可以跨 WEB 应用程序和服务器重新定位资源来处理请求.
forward(): 只能在应用程序内部转发.
encodeURL()和 encodeRedirectURL() 的区别
当用 URL 重写方式来管理 Session 的时候, 通过以上两个方法把 session ID 写到 URL 中.
不同点是: 两个方法确定是否需要包含 session ID 的逻辑不同.
在调用 HttpServletResponse.sendRedirect 前, 应该先调用 encodeRedirectURL() 方法, 否则可能会丢失 Sesssion 信息.
java.lang.String encodeRedirectURL(java.lang.String url)
对 sendRedirect 方法使用的指定 URL 进行编码. 如果不需要编码, 就直接返回这个 URL. 之所以提供这个附加的编码方法, 是因为在 redirect 的情况下,
决定是否对 URL 进行编码 的规则和一般情况有所不同. 所给的 URL 必须是一个绝对 URL. 相对 URL 不能被接收, 会抛 出一个
IllegalArgumentException. 所有提供给 sendRedirect 方法的 URL 都应通过 这个方法运行, 这样才能确保会话跟踪能够在所有浏览器中正常运行.java.lang.String encodeURL(java.lang.String url)
对包含 session ID 的 URL 进行编码. 如果不需要编码, 就直接返回这个 URL. Servlet 引 擎必须提供 URL 编码方法, 因为在有些情况下, 我们将不得不重写
URL, 例如, 在响应对应的 请求中包含一个有效的 session, 但是这个 session 不能被非 URL 的(例如 cookie)的手 段来维持. 所有提供给 Servlet 的
URL 都应通过这个方法运行, 这样才能确保会话跟踪能够 在所有浏览器中正常运行.
seAttribute 与 s etParameter 的区别
getAttribute 表示从 request 范围取得设置的属性, 必须要先 setAttribute 设置属性, 才能通过 getAttribute 来取得, 设置与取得的为 Object 对象类型
getParameter 表示接收参数, 参数为页面提交的参数, 包括: 表单提交的参数、URL 重写(就是 xxx?id=1 中的 id)传的参数等, 因此这个并没有设置参数的方法(没有
setParameter), 而且接收参数返回的不是 Object, 而是 String 类型
HttpServletRequest 类既有 getAttribute()方法, 也由 getParameter() 方法, 这两个方法有以下区别:
- HttpServletRequest 类有 setAttribute()方法, 而没有 setParameter() 方法
- 当两个 Web 组件之间为链接关系时, 被链接的组件通过 getParameter() 方法来获得请求参数, 例如假定 welcome.jsp 和 authenticate.jsp 之间为链接关系,
welcome.jsp 中有以下代码:
1 | <a href="authenticate.jsp?username=weiqin">authenticate.jsp </a> |
或者:
1 | <form name="form1" method="post" action="authenticate.jsp"> |
在 authenticate.jsp 中通过 request.getParameter(“username”) 方法来获得请求参数 username:<% String username=request.getParameter("username"); %>
- 当两个 Web 组件之间为转发关系时, 转发目标组件通过 getAttribute() 方法来和转发源组件共享 request 范围内的数据. 假定 authenticate.jsp 和
hello.jsp 之间为转发关系. authenticate.jsp 希望向 hello.jsp 传递当前的用户名字, 如何传递这一数据呢?先在 authenticate.jsp 中调用
setAttribute() 方法:
1 | <% |
在 hello.jsp 中通过 getAttribute() 方法获得用户名字:
1 | <% String username=(String)request.getAttribute("username"); %> |
从更深的层次考虑
- request.getParameter()方法传递的数据, 会从 Web 客户端传到 Web 服务器端, 代表 HTTP 请求数据. request.getParameter() 方法返回 String 类型的数据.
- request.setAttribute()和 getAttribute() 方法传递的数据只会存在于 Web 容器内部, 在具有转发关系的 Web 组件之间共享. 这两个方法能够设置
Object 类型的共享数据. - request.getParameter()取得是通过容器的实现来取得通过类似 post, get 等方式传入的数据, request.setAttribute() 和 getAttribute() 只是在 web
容器内部流转, 仅仅是请求处理阶段, 这个的确是正解. - getAttribute()是返回对象, getParameter() 返回字符串
- request.getAttribute()方法返回 request 范围内存在的对象, 而 request.getParameter() 方法是获取 http 提交过来的数据.