java请求转发实例_12.6.3 请求转发的实例(1)

12.6.3  请求转发的实例(1)

在这个例子中,我们编写一个PortalServlet,在这个Servlet中,首先判断访问用户是否已经登录,如果没有登录,则调用RequestDispatcher接口的include()方法,将请求转发给LoginServlet2(为了和第12.2.3节的LoginServlet区分),LoginServlet2在响应中发送登录表单;如果已经登录,则调用RequestDispatcher接口的forward()方法,将请求转发给第12.2.1节的WelcomeServlet,向用户显示欢迎信息。实例的开发主要有下列步骤。

Step1:编写PortalServlet类

在%CATALINA_HOME%\webapps\ch12\src目录下新建PortalServlet.java,代码如例12-16所示。

例12-16  PortalServlet.java1.  package org.sunxin.ch12.servlet;

2.

3.  import java.io.IOException;

4.  import java.io.PrintWriter;

5.

6.  import javax.servlet.RequestDispatcher;

7.  import javax.servlet.ServletContext;

8.  import javax.servlet.ServletException;

9.  import javax.servlet.http.HttpServlet;

10. import javax.servlet.http.HttpServletRequest;

11. import javax.servlet.http.HttpServletResponse;

12.

13. public class PortalServlet extends HttpServlet

14. {

15.     public void doGet(HttpServletRequest req, HttpServletResponse resp)

16.                throws ServletException,IOException

17.     {

18.         resp.setContentType("text/html;charset=gb2312");

19.

20.         PrintWriterout=resp.getWriter();

21.

22.         out.println("

");

23.         out.println("登录页面");

24.         out.println("

");

25.

26.         Stringname=req.getParameter("username");

27.         Stringpwd=req.getParameter("password");

28.

29.         if("zhangsan".equals(name) && "1234".equals(pwd))

30.         {

31.             ServletContextcontext=getServletContext();

32.             RequestDispatcherrd=context.getRequestDispatcher("/welcome");

33.             rd.forward(req,resp);

34.         }

35.         else

36.         {

37.             RequestDispatcherrd=req.getRequestDispatcher("login2");

38.             rd.include(req,resp);

39.         }

40.         out.println("");

41.         out.close();

42.     }

43.     public void doPost(HttpServletRequest req,HttpServletResponse resp)

44.                 throws ServletException,IOException

45.     {

46.         doGet(req,resp);

47.     }

48. }

为了比较RequestDispatcher的forward()和include()方法的区别,在doGet()方法的开始和结尾处分别输出了一段HTML代码。第22~24行输出一段HTML代码,这段HTML代码和第40行输出的HTML代码组成了完整的HTML文档。第26~27行,从请求中获取用户名和密码。

第29行是对用户名和密码进行判断的代码,在这里,我们使用了一个小技巧,即直接用"zhangsan"和"1234"这种字面量字符串调用equals()方法来判断用户名和密码,这样,即使name和pwd为null,程序也不会出错,判断仍然正常执行。在第12.2.3节的LoginServlet中,为了避免出现空指针异常,我们要先判断name和pwd是否为null,而采用本例的这种方式,就不需要进行这样的判断了。

第31~33行,如果用户名和密码正确,则利用上下文对象的getRequestDispatcher()方法得到RequestDispatcher对象,传入的路径参数必须以斜杠(/)开始,然后利用forward()方法将请求转发给welcome这个Servlet处理。请读者注意,在forward()方法调用之后,我们在第22~24行输出的HTML代码将自动被清除,执行的控制权将交给welcome,在doGet()方法中剩余的代码也不再执行。第37~38行,如果用户没有登录或者输入了错误的用户名或密码,则利用请求对象的getRequestDispatcher()方法得到RequestDispatcher对象,传入的路径参数没有以斜杠(/)开始,表示相对于当前Servlet的路径,然后调用include()方法将请求转发给login2这个Servlet处理,当login2对请求处理完毕后,执行的控制权回到PortalServlet,将继续执行第40~41行的代码。

【责任编辑:book TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值