
任务四 Servlet处理页面跳转
任务描述
网站用户登录,在登录表单中输入用户名和密码信息,提交到服务器,如果用户名和密码正确,跳转到登录成功页面,否则跳转到登录失败页面。
必备知识
Servlet可以将发送给自己的某个请求转发给另外一个URL地址,这个地址可以是HTML、JSP、Servlet或是其他HTTP地址。Servlet的跳转方式有如下3种:
1.请求转发
forward()方法:

Servlet(源组件)先对客户请求做一些预处理操作,然后把请求转发给其他Web组件(目标组件)完成包括生成响应结果在内的后续操作。转发后,地址栏也不会改变,还停留在跳转前的Servlet,这个过程在服务器端完成,但仅输出被转发的URL中的内容。
2.请求包含
include()方法:

其中,url是某个希望被包含的HTTP地址。include转发时,地址栏没有改变,是Servlet程序原来的url地址。这个过程在服务器端完成,Servlet和被包含的页面同时被输出。是Servlet(源组件)把其他Web组件(目标组件)生成的响应结果包含到自身的响应结果中。
3.请求重定向
sendRedirect()方法:
一般称为请求重定向,客户端的地址栏将改变为url值,是由客户端发起的第二次请求。参数中要写明具体的url地址,因为当客户端再次发送请求时,会直接请求Web服务器根目录。如果要转发一个html地址,它在本工程的webroot文件夹下,那么要从Servlet转发到这个html地址,必须加上当前的Web路径,这个路径名可以通过request.getContextPath()获得,那么该转发代码可以为:

任务透析
用户登录时,验证用户名和密码是否正确,若正确,跳转到成功页面;若错误跳转到失败页面。使用3种转发方式,并比较三者的区别。
步骤1:编写登录页面index.jsp、成功页面success.jsp、失败页面error.jsp。


步骤2:编写Servlet,接收提交的参数,并按照情况转发到相关页面。

步骤3:分别测试请求转发、请求包含和请求重定向。
打开登录页面,如图2-16所示。
请求转发运行结果如图2-17所示,观察地址有何不同。

图2-16 登录页面

图2-17 请求转发运行结果
请求包含运行结果如图2-18所示。

图2-18 请求包含运行结果
请求重定向运行结果如图2-19所示。
分析上例,得到以下结论:
①forward:是指转发,将当前request和response对象保存,交给指定的url处理。并没有表示页面的跳转,所以地址栏的地址不会发生改变。

图2-19 请求重定向运行结果
②redirect:是指重定向,包含两次浏览器请求,浏览器根据url请求一个新的页面,所有的业务处理都转到下一个页面,地址栏的地址会发生改变。
③include:意为包含,即包含url中的内容,进一步理解为,将url中的内容包含到当前的Servlet中,并用当前Servlet的request和response对象执行url中的内容处理业务,所以不会发生页面的跳转,地址栏地址不会发生改变。
课堂提问
1.3种方式实现跳转的区别,何时选择哪种方式?
2.3种请求方式进行页面跳转后,地址栏中的url内容有什么区别?
3.如果跳转到另外一个网站,用哪种跳转方式?