04_web基础(六)之请求转发与重定向

  1.交互方式

  Web组件之间跳转: 从AServlet 跳转到 BServlet.
  三种类型:
  1:请求转发(forward)
  2:URL重定向(redirect)
  3:请求包含(include)

34.请求转发详讲(非常重要)


请求转发(forward):
    AServlet操作完毕之后,请求转发到BServlet,继续完成余下的功能.
语法:
    request对象.getRequestDispatcher(String path).forward(request,response);

    参数:
        path:表示目标资源名称(跳转到哪里去)
    注意:别忘了写forward(request,response).
=============================================================================
请求转发的特点:
    1):浏览器地址栏路径没变,依然是Servlet1的资源名称.
    2):只发送了一个请求.
    3):共享同一个请求,在请求*享数据.
    4):最终的响应输出由Servlet2来决定.
    5):只能访问当前应用中的资源,不能跨域跳转.
    6):可以访问WEB-INF中的资源.
    7):转发完成之后,Servlet1中的业务代码继续执行
  代码实现

 1 package com.day07.web.demo2.controller2;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.annotation.WebServlet;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import java.io.IOException;
 9 import java.io.PrintWriter;
10 
11 /**
12  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
13  * 疑问咨询wx:851298348
14  */
15 
16 /**
17  * 请求转发(forward):
18  AServlet操作完毕之后,请求转发到BServlet,继续完成余下的功能.
19  语法:
20  request对象.getRequestDispatcher(String path).forward(request,response);
21 
22  参数:
23  path:表示目标资源名称(跳转到哪里去)
24  注意:别忘了写forward(request,response).
25  =============================================================================
26  请求转发的特点:
27  1):浏览器地址栏路径没变,依然是Servlet1的资源名称.
28  2):只发送了一个请求.
29  3):共享同一个请求,在请求*享数据.
30  4):最终的响应输出由Servlet2来决定.
31  5):只能访问当前应用中的资源,不能跨域跳转.
32  6):可以访问WEB-INF中的资源.
33  7):转发完成之后,Servlet1中的业务代码继续执行
34 
35  */
36 @WebServlet("/a")
37 public class AServlet extends HttpServlet {
38     @Override
39     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
40         // 从AServlet跳转到BServlet
41         System.out.println("------AServlet----------");
42        // request对象.getRequestDispatcher(String path).forward(request,response);
43         //请求转发
44         req.setAttribute("name","wuji");//作用范围:仅仅限于当前请求
45        // req.getRequestDispatcher("/b").forward(req,resp);
46 
47         req.getRequestDispatcher("/WEB-INF/views/a.jsp").forward(req,resp);
48         System.out.println("------AServlet---已完成转发-------");
49         //https://www.baidu.com/
50         //req.getRequestDispatcher("https://www.baidu.com/").forward(req,resp);//
51         PrintWriter writer = resp.getWriter();
52         writer.print("==========A============");
53     }
54 }
AServlet
 1 package com.day07.web.demo2.controller2;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.annotation.WebServlet;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import java.io.IOException;
 9 import java.io.PrintWriter;
10 
11 /**
12  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
13  * 疑问咨询wx:851298348
14  */
15 @WebServlet("/b")
16 public class BServlet extends HttpServlet {
17     @Override
18     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
19 
20         System.out.println("------BServlet----------");
21         String name = (String) req.getAttribute("name");
22         System.out.println("name="+name);
23         PrintWriter writer = resp.getWriter();
24         writer.print("==========B============");
25     }
26 }
BServlet
 1 <%--
 2   Created by IntelliJ IDEA.
 3   User: lidongping
 4   Date: 2018/5/3
 5   Time: 17:49
 6   To change this template use File | Settings | File Templates.
 7 --%>
 8 <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
 9 <html>
10 <head>
11     <title>a标题</title>
12 </head>
13 <body>
14 我是AServlet
15 </body>
16 </html>
a.jsp

 35.重定向详解(非常重要)

  URL重定向(redirect):
    AServlet操作完毕之后,重定向到BServlet,继续完成余下的功能.
语法:
    response对象.sendRedirect(String path);
    参数:path,表示目标资源名称.
------------------------------------------------------------------------
URL重定向的特点:
    1):浏览器地址栏路径发送变化,变成Servlet2的资源名称.
    2):发送了两个请求.
    3):因为是不同的请求,所以不能共享请求中的数据.
    4):最终的响应输出由Servlet2来决定.
    5):可以跨域访问资源.
    6):不可以访问WEB-INF中的资源.

代码:

 1 package com.day07.web.demo2.controller2;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.annotation.WebServlet;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import java.io.IOException;
 9 import java.io.PrintWriter;
10 
11 /**
12  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
13  * 疑问咨询wx:851298348
14  */
15 
16 /**
17  * URL重定向(redirect):
18  AServlet操作完毕之后,重定向到BServlet,继续完成余下的功能.
19  语法:
20  response对象.sendRedirect(String path);
21  参数:path,表示目标资源名称.
22  ------------------------------------------------------------------------
23  URL重定向的特点:
24  1):浏览器地址栏路径发送变化,变成Servlet2的资源名称.
25  2):发送了两个请求.
26  3):因为是不同的请求,所以不能共享请求中的数据.
27  4):最终的响应输出由Servlet2来决定.
28  5):可以跨域访问资源.
29  6):不可以访问WEB-INF中的资源.
30 
31  */
32 @WebServlet("/c")
33 public class CServlet extends HttpServlet {
34     @Override
35     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
36         System.out.println("------CServlet----------");
37         //response对象.sendRedirect(String path);
38         req.setAttribute("key","周美玲");
39        // resp.sendRedirect("/d");
40         //resp.sendRedirect("https://www.baidu.com/");
41         resp.sendRedirect("/WEB-INF/views/a.jsp");
42 
43         System.out.println("------CServlet-----已跳转完成-----");
44         PrintWriter writer = resp.getWriter();
45         writer.print("------------CServlet----------");
46     }
47 }
CServlet
 1 package com.day07.web.demo2.controller2;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.annotation.WebServlet;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import java.io.IOException;
 9 import java.io.PrintWriter;
10 
11 /**
12  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
13  * 疑问咨询wx:851298348
14  */
15 @WebServlet("/d")
16 public class DServlet extends HttpServlet {
17     @Override
18     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
19         System.out.println("------DServlet----------");
20         String key = (String) req.getAttribute("key");
21         System.out.println("-------------------"+key);
22         PrintWriter writer = resp.getWriter();
23         writer.print("------------DServlet----------");
24 
25     }
26 }
DServlet

36.生产生如何选择请求转发还是重定向

  请求转发和URL重定向的选择?
   1:若需要共享请求中的数据,只能使用请求转发.
   2:若需要访问WEB-INF中的资源,只能使用请求转发.
   3:若需要跨域访问,只能使用URL重定向.
   4:其他时候,任选.

37.四大作用域(非常重要)

  Web组件(Servlet/JSP)的数据共享得需要作用域对象.
作用域对象存在的意义:在多个Web组件之间共享和传递数据.
四大作用域对象:
名称                                 类型                            描述
----------------------------------------------------------------------------------------------------------------
request                  HttpServletRequest        表示当前请求范围. 只是共享同一个请求中的数据,若是不同的请求之间,是不能共享的,每次请求都是新的请求对象.
pageContext(page)        PageContext               表示当前JSP页面的范围(讲jsp的时候说).
session                  HttpSession               表示当前会话范围. 只要浏览器不关闭,session就是同一个对象.就可以共享该会话中的数据.
application              ServletContext            表示当前应用范围. Tomcat开始启动,application对象就创建好了,Tomcat关闭application对象销毁.
                                                         在整个Web的生命周期中(Tomcat启动--Tomcat关闭),有且只有一个application对象.
-----------------------------------------------------------------------------------------------------------------
设置共享信息:
        域对象.setAttribute(String name,Object value);
获取共享信息:
        Object value  = 域对象.getAttribute(String name);
修改共享信息:
        重新设置一个同名的属性.
删除共享信息:
        域对象.removeAttribue(String name);

注意:往哪一个作用域对象中存储数据,就只能从哪一个作用域中获取数据.  
   基本:  一般的组件之间的数据共享,存放在request中,此时只能使用请求转发.
                登陆信息存放在Session中.
代码:

 1 package com.day07.web.demo2.controller2;
 2 
 3 import javax.servlet.ServletContext;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.annotation.WebServlet;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 import javax.servlet.http.HttpSession;
10 import java.io.IOException;
11 import java.io.PrintWriter;
12 
13 /**
14  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
15  * 疑问咨询wx:851298348
16  */
17 @WebServlet("/demoServlet")
18 public class DemoServlet extends HttpServlet {
19     @Override
20     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
21         PrintWriter writer = resp.getWriter();
22         //request 请求作用域  HttpServletRequest
23         //取出来
24         Integer num1 = (Integer)req.getAttribute("request");
25         System.out.println("num1="+num1);
26 
27         //放数据
28         if (num1==null || num1==0){
29             num1=1;
30             req.setAttribute("request",num1);
31         }else {
32             num1=num1+1;
33             req.setAttribute("request",num1);
34         }
35 
36         System.out.println("request="+num1);//在控制台输出
37         writer.println("request="+num1);//在页面输出
38 
39         //session  作用域
40         //1.获取session对象
41         HttpSession session = req.getSession();
42 
43         //取出来
44         Integer num2 = (Integer)session.getAttribute("session");
45 
46 
47         //放数据
48         if (num2==null || num2==0){
49             num2=1;
50             session.setAttribute("session",num2);
51         }else {
52             num2=num2+1;
53             session.setAttribute("session",num2);
54         }
55 
56         System.out.println("session="+num2);//在控制台输出
57         writer.println("session="+num2);//在页面输出
58 
59         //ServletContext   作用域
60         //1.获得ServletContext 应用上下文
61         ServletContext servletContext = req.getServletContext();
62         //取出来
63         Integer num3 = (Integer)servletContext.getAttribute("servletContext");  // key   value   x=2
64 
65 
66         //放数据
67         if (num3==null || num3==0){
68             num3=1;
69             servletContext.setAttribute("servletContext",num3);
70         }else {
71             num3=num3+1;
72             servletContext.setAttribute("servletContext",num3);
73         }
74 
75         System.out.println("servletContext="+num3);//在控制台输出
76         writer.println("servletContext="+num3);//在页面输出
77 
78 
79 
80     }
81 }
DemoServlet

 38.ServletContext的API学习

  ServletContext接口,表示的应用,Tomcat启动的时候创建一个对象,Tomcat关闭对象销毁,在整个Web的生命周期中,只有一个对象,表示的就是当前应用.
===========================================================================
如何获取该对象:
   1):若在Servlet中:
      ServletContext ctx = super.getServletContext();
      GenericServlet实现了Servlet和ServletConfig接口,而getServletContext方法就在ServletConfig接口中.
   2):通过请求对象获取:
      ServletContext ctx2 = req.getServletContext();:从Tomcat7开始支持
       ServletContext ctx3 = req.getSession().getServletContext();//遥远以前
==============================================================================
常用方法:
   1):String getContextPath():获取当前应用的上下文路径.
   2):String getRealPath(String path):获取某个资源的路径.
   3):全局初始化参数:
       先看传统的Servlet的初始化参数:
  04_web基础(六)之请求转发与重定向
      因为配置在当前ServletPage中,所以只能被ServletPage使用,其他Servlet无法使用.
      而在开发中,多个Web组件(Servlet/Filter)可以拥有共同的初始化参数,此时只能配置N次,不利于维护.
      解决方案:使用全局的初始化参数,Web组件都可以共用,配置问web.xml文件中.
  04_web基础(六)之请求转发与重定向
       注意:获取全局的初始化参数,就再也不能使用ServletConfig对象.getInitParameter来获取了.
       只能使用,ServletContext对象.getInitParameter(String paramName);
面试题:
   说说以下的区别:
    request.getParameter(String name)://获取用户输入的参数信息
    request.getAtribute(String name): //获取程序员自己设置的共享信息
===========================================================
    ServletConfig对象.getInitParameter(String name);
    ServletContext对象.getInitParameter(String name);
  代码:

 1 package com.day07.web.demo2.controller2;
 2 
 3 import javax.servlet.ServletContext;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.annotation.WebServlet;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 import java.io.IOException;
10 
11 /**
12  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
13  * 疑问咨询wx:851298348
14  */
15 @WebServlet("/servletContextDemoServlet")
16 public class ServletContextDemoServlet extends HttpServlet {
17     @Override
18     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
19         //获取对象  ServletContext ctx2 = req.getServletContext();:从Tomcat7开始支持
20         ServletContext servletContext = req.getServletContext();
21        // 1):String getContextPath():获取当前应用的上下文路径.
22         String contextPath = servletContext.getContextPath();
23         System.out.println("contextPath="+contextPath);
24         // 2):String getRealPath(String path):获取某个资源的路径.
25         String realPath = servletContext.getRealPath("/servletContextDemoServlet");
26         System.out.println("realPath="+realPath);
27         //全局初始化参数:
28         String name1 = servletContext.getInitParameter("name1");
29         System.out.println("name1="+name1);
30 
31     }
32 }
ServletContextDemoServlet

相关推荐