容器要移除一个
servlet,调用 servlet 的 destroy 方法结束该 servlet
2.简述<jsp:forward>动作和 response.sendRedirect()的异同(5 分)
重定向分为两类。一类是客户端重定向,一类是服务器端重定向。客户端重定向可以通过设
置特定的
HTTP 头,或者写 javaScirpt 脚本实现。
服务器端的重定向方式
服务器的重定向有两种方式,一种是
HttpServletResponse 的 sendRedirect()方法,一个是
使用
RequestDispatcher 的 forward()方法。
HttpServletResponse.sendRedirect()方法
HttpServletResponse 接口定义了可用于转向的 sendRedirect 方法,这个方法将响应定向到指
定 的 , 新 的
URL , location 可 以 是 一 个 绝 对 的 URL , 如
response.sendRedirect(“http://java.sun.com”)也可以使用相对的 URL location 可以是一个绝对
的
URL , 如 response.sendRedirect(“http://java.sun.com”) 也 可 以 使 用 相 对 的 URL 。 如 果
location 以“/”开头,则容器认为相对于当前 Web 应用的根,否则,容器将解析为相对于当
前请求的
URL。这种重定向的方法,将导致客户端浏览器的请求 URL 跳转。从浏览器中的
地址栏中可以看到新的
URL 地址,作用类似于上面设置 HTTP 响应头信息的实现。
RequestDispatcher.forward()方法
RequestDispatcher 是一个 Web 资源的包装器,可以用来把当前 request 传递到该资源,或者
把新的资源包括到当前响应中。
RequestDispatcher 接口中定义了两个方法,参见如下代码:
public interface RequestDispatcher {
void forward(ServletRequest request, ServletResponse response);
void include(ServletRequest request, ServletResponse response);
}
forward()方法将当前的 request 和 response 重定向到该 RequestDispacher 指定的资源。这在实
际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的
处理后,转向到下一个步骤。比如,通常业务处理在
Servlet 中处理,处理的结果转向到一
个
JSP 页面进行显示。这样看起来类似于 Servlet 链的功能,但是还有一些区别。一个
RequestDispatcher 对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个
Servlet。 include()方法将把 Request Dispatcher 资源的输出包含到当前输出中。
注意,只有在尚未向客户端输出响应时才可以调用
forward()方法,如果页面缓存不为空,
在重定向前将自动清除缓存。否则将抛出一个
IllegalStateException 异常。
如何得到
RequestDispatcher
有三种方法可以得到
Request Dispatcher 对象。
1.javax.servlet. ServletRequest 的 getRequestDispatcher(String path)方法,其中 path 可以是相
对路径,但不能越出当前
Servlet 上下文。如果 path 以“/”开头,则解析为相对于当前上下文
的根。
2.javax.servlet. ServletContext 的 getRequestDispatcher(String path)方法,其中 path 必须以“/”
开 头 , 路 径 相 对 于 当 前 的
Servlet 上 下 文 。 可 以 调 用 ServletContext 的 getContext(String
uripath)得到另一个 Servlet 上下文,并可以转向到外部上下文的一个服务器资源链接。
3.使用 javax.servlet. ServletContext 的 getNamedDispatcher(String name)得到名为 name 的一个
Web 资源,包括 Servlet 和 JSP 页面。这个资源的名字在 Web 应用部署描述文件 web.xml 中
指定。
这三种方法的使用有细微的差别。比如,下面是一个应用的配置文件
web.xml:
<?xml version=”1.0″ ?>
<!DOCTYPE web-app PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN”