Servlet 中的几种方法的区别


2/14/2015 JavaWeb

总结 Servlet 中的几种方法的区别

sendRedirect() 方法和forward() 方法的区别

sendRedirect() 方法原理

  1. 客户端发送请求, Servlet1做出处理.
  2. Servlet1调用sendReadirect()方法, 将客户端的请求重新定位到Servlet2.
  3. 客户端浏览器访问Servlet2.
  4. Servlet2对客户端浏览器做出响应.

forward() 方法原理

  1. 客户端发送请求, Servlet1做出处理.
  2. Servlet1调用forward()方法, 将请求转发给Servlet2来处理请求, 为客户端服务.
  3. Servlet2对客户端浏览器做出响应.

区别

  1. 定位与转发
    • sendRedirect(): 重新定位到另外一个资源来处理请求, URL会重新定位, 让客户端重新访问另外一个资源.
    • forward(): 转发到另外一个资源来处理请求. URL不会变化. 隐藏了处理对象的变化.
  2. 处理请求的资源的范围 sendReadirect(): 可以跨WEB应用程序和服务器重新定位资源来处理请求. forward(): 只能在应用程序内部转发.

encodeURL() 和 encodeRedirectURL() 的区别

当用URL重写方式来管理Session的时候, 通过以上两个方法把session ID写到URL中. 不同点是: 两个方法确定是否需要包含session ID的逻辑不同. 在调用HttpServletResponse.sendRedirect前, 应该先调用encodeRedirectURL()方法, 否则可能会丢失Sesssion信息.

  1. java.lang.String encodeRedirectURL(java.lang.String url) 对sendRedirect方法使用的指定URL进行编码. 如果不需要编码, 就直接返回这个URL. 之所以提供这个附加的编码方法, 是因为在redirect的情况下, 决定是否对URL进行编码 的规则和一般情况有所不同. 所给的URL必须是一个绝对URL. 相对URL不能被接收, 会抛 出一个IllegalArgumentException. 所有提供给sendRedirect方法的URL都应通过 这个方法运行, 这样才能确保会话跟踪能够在所有浏览器中正常运行.

  2. 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 中有以下代码:
<a href="authenticate.jsp?username=weiqin">authenticate.jsp </a>
1

或者:

<form name="form1" method="post" action="authenticate.jsp">
请输入用户姓名: <input type="text" name="username">
<input type="submit" name="Submit" value="提交">
</form>
1
2
3
4

在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()方法:
<%
String username=request.getParameter("username");
request.setAttribute("username", username);
%>
<jsp:forward page="hello.jsp" />
1
2
3
4
5

在hello.jsp中通过getAttribute()方法获得用户名字:

<% String username=(String)request.getAttribute("username"); %>
Hello: <%=username %>
1
2

从更深的层次考虑

  • 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 提交过来的数据.
Last Updated: 7/3/2019, 6:17:56 PM