background image

容器要移除一个

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”