Requeset 对象属性特征、转发、重定向

Servlet

1. Requeset 对象属性特征

相关方法:
	void setAttribute(String name, Object value);
		在 Request 对象中添加属性,和对应数据内容。
		value 是 Object 类型 
			value 是否可以存储 List 集合, Object 数组, Set 集合 Map 双边队列,String 字符串类型???
				都可以存储!!! 

	Object getAttribute(String name);
		获取 request 对象中的指定名称属性数据内容
    
	void removeAttribute(String name);
		移除 request 对象中的指定名称属性数据内容

	Request 属性(attribute) 也是一个键值对模型数据,值可以是任意类型,属性名唯一!!!也是类似于 Map 双边队列形式的数据模型
package com.qfedu.a_attribute;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Anonymous 2022/4/16 9:16
 */
@WebServlet("/reqAttr")
public class RequestAttributeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String msg = "Request 存储字符串数据内容";
        int num = 10;
        List<String> list = new ArrayList<String>();
        Map<String, String> map = new HashMap<>(5);

        list.add("胡辣汤");
        list.add("扁粉菜");
        list.add("羊肉汤");
        list.add("牛肉汤");

        map.put("牛肉汤", "25");
        map.put("羊肉汤", "20");
        map.put("扁粉菜", "5");
        map.put("胡辣汤", "8");
        map.put("热干面", "8");

        /*
         void setAttribute(String name, Object value);
         自定义属性名称,存储期望数据,一般情况下,属性名和对应数据有一定的关联性
         */
        req.setAttribute("msg", msg);
        req.setAttribute("num", num);
        req.setAttribute("list", list);
        req.setAttribute("map", map);

        req.removeAttribute("msg");

        /*
        Object getAttribute(String name);
            通过指定的属性名称获取数据,数据类型为 Object 类型,但是在实际存储过程中,数据类型
            是有明确类型的,这里可以考虑强制类型转换,保证数据的类型统一
         */
        String attrMsg = (String) req.getAttribute("msg");
        Integer attrNum = (Integer) req.getAttribute("num");
        @SuppressWarnings("unchecked")
        List<String> attrList = (List<String>) req.getAttribute("list");
        @SuppressWarnings("unchecked")
        Map<String, String> attrMap = (Map<String, String>) req.getAttribute("map");

        System.out.println("msg : " + attrMsg);
        System.out.println("num : " + attrNum);

        attrList.forEach(System.out::println);
        attrMap.forEach((k, v) -> System.out.println(k + " : " + v));
    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

2. 转发【重点】

2.1 转发案例
王乾开着凯迪拉克 CT20 去强哥洗脚城
    1. 到前台,你好,我找 20号技师(河霖) 我想让他摸我大腿
    2. 前台北平,好家伙,这么重口味吗??? 对讲机 领班(亮哥),20号技师(河霖) 有人点
    3. 亮哥 收到收到,乾哥老客户,给乾哥送个果盘,送个毛巾,送个西湖龙井。20号技师(河霖) 快来快来
    4. 20号技师(河霖) 收到收到,乾哥总是点我,给乾哥准备一瓶红牛。
    5. 河霖 来到了前台,带走了乾哥 ==> 欢乐时光就要开始了~~~ 强哥在角落嘴角微微上扬...

分析:
	1. 王乾请求几次???
		王乾请求了一次,带有有参数,想河霖了~~~
	2. 王乾请求之后,换地方了吗???
		王乾在前台等着呢
	3. 前台北平 在转达王乾请求时,有没有阐述王乾需求
		有!
	4. 领班在呼唤 20号技师(河霖),送了果盘
		请求在转到 河霖 之前,有添加了其他参数
	5. 河霖收到了最终的请求,
		a. 王乾点
		b. 想他了
		c. 送果盘
		d. 自己决定可以给乾哥带个红牛
	  去前台领人~~~
2.2 转发概述
转发是服务器行为!!!
	1. 转发情况下,用户仅请求一次
	2. 转发操作,用户 URL 不变
	3. 转发操作,会带有用户的请求数据和请求参数
	4. 转发操作,可以在用户请求基础之上,添加其他数据内容
	5. 转发操作,只可以在服务器内部资源跳转,不可以跳转到服务器之外的资源。
		在百度上搜索数据,肯定是百度提供数据结果。不可能是淘宝~

转发使用的方法:
	/*
	通过 Request 对象调用 getRequestDispatcher 方法,参数是服务器内部目标资源名称,
	forward(HttpServletRequest, HttpServletResponse); 转发操作,将用户当前请求的 Request和对应绑定
	Response 一并转发给下一个资源。
	*/
	req.getRequestDispatcher(String 资源名称).forward(HttpServletRequest, HttpServletResponse);
package com.qfedu.b_RequestDispatcher;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 前台
 *      接收用户请求,直接转发给领班
 *      http://localhost:8080/Day40/rd1?technician=河霖&service=想他了
 *
 * @author Anonymous 2022/4/16 10:43
 */
@WebServlet("/rd1")
public class RequestDispatcher1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 前台展示用户请求:
        System.out.println("技师:" + req.getParameter("technician"));
        System.out.println("服务:" + req.getParameter("service"));
        System.out.println("-----------------------");
        /*
        转发目标资源 rd2 带有当前用户请求的 Request 和对应 Response
         */
        req.getRequestDispatcher("/rd2").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
 	
package com.qfedu.b_RequestDispatcher;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 邻班
 *
 * @author Anonymous 2022/4/16 10:43
 */
@WebServlet("/rd2")
public class RequestDispatcher2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 给用户加服务
        req.setAttribute("food", "果盘");
        System.out.println("技师:" + req.getParameter("technician"));
        System.out.println("服务:" + req.getParameter("service"));
        System.out.println("-----------------------");
        /*
        转发操作目标资源是 rd3
         */
        req.getRequestDispatcher("/rd3").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

package com.qfedu.b_RequestDispatcher;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 河霖
 *
 * @author Anonymous 2022/4/16 10:43
 */
@WebServlet("/rd3")
public class RequestDispatcher3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        // 获取领班添加的数据
        String food = (String) req.getAttribute("food");

        // 用户请求的参数信息
        String technician = req.getParameter("technician");
        String service = req.getParameter("service");

        PrintWriter writer = resp.getWriter();

        writer.append("<h1>技师:" + technician + "</h1>");
        writer.append("<h1>服务:" + service + "</h1>");
        writer.append("<h1>特殊照顾:" + food + "</h1>");
        writer.append("<h1>技师特供:红牛</h1>");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

3. 重定向

3.1 重定向
王乾开着凯迪拉克 CT20 去强哥洗脚城
	到门口一看
	【公告】
	因业务需求,和场地扩张,顾本地搬迁至美国白宫
	广而告之
		强哥

王乾开着凯迪拉克 CT20 前往美国白宫
3.2 重定向概述
浏览器行为
	1. 用户请求了几次???
		用户请求了两次
	2. 用户请求路径变了吗???
		变了
	3. 以上操作和服务器有关吗???
		服务器给予浏览器一个新的地址
	4. 二次访问的行为是浏览器行为还是服务器行为???
		浏览器行为
	5. 二次访问不会带有第一次访问的数据内容,

需要给予浏览器新的路径地址
	通过 Response 对象发送给浏览器新的 URL ,让浏览器跳转
	sendRedirect(String location);
		跳转的资源可以是本服务器资源,也可以是网络资源
package com.qfedu.b_RequestDispatcher;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 河霖
 *
 * @author Anonymous 2022/4/16 10:43
 */
@WebServlet("/rd3")
public class RequestDispatcher3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        // 获取领班添加的数据
        String food = (String) req.getAttribute("food");

        // 用户请求的参数信息
        String technician = req.getParameter("technician");
        String service = req.getParameter("service");

        PrintWriter writer = resp.getWriter();

        writer.append("<h1>技师:" + technician + "</h1>");
        writer.append("<h1>服务:" + service + "</h1>");
        writer.append("<h1>特殊照顾:" + food + "</h1>");
        writer.append("<h1>技师特供:红牛</h1>");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

posted @ 2022-05-17 00:10  qtyanan  阅读(80)  评论(0编辑  收藏  举报