Request对象-获取请求消息

Request

  • 概述:Request 和 Response 对象都是由 Web 服务器(Tomcat)创建的,我们来使用它们,Request 对象是用来 获取请求消息 的,Response 对象是用来 设置响应消息

  • Request 对象的原理

  • Request 对象的继承体系结构

Request 常用的功能

获取请求行数据
  • 请求行

    • 格式:请求方式 请求URL 请求协议/版本号
    • 例子:GET /heng/demo?name=zs HTTP/1.1
  • 统一资源

    • URL:统一资源定位符
      • 示例:http://localhost/heng/demo
    • URI:统一资源标识符
      • 示例:/heng/demo
  • 方法

    方法作用
    String getMethod()获取请求方式 :GET
    String getContextPath()获取虚拟目录(项目名称):/heng
    String getServletPath()获取Servlet路径: /demo
    String getQueryString()获取get方式请求参数:name=zs
    String getProtocol()获取协议及版本:HTTP/1.1
    String getRemoteAddr()获取客户机的IP地址:
    String getRequestURI()获取请求URI:/heng/demo
    StringBuffer getRequestURL()http://localhost/heng/demo
  • 示例代码

    @WebServlet("/line")
    public class MyServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 获取请求方式
            String method = req.getMethod();
            // 获取虚拟目录,项目名称
            String contextPath = req.getContextPath();
            // 获取Servlet路径
            String servletPath = req.getServletPath();
            // 获取协议及版本
            String protocol = req.getProtocol();
            // 获取客户机的 IP 地址
            String remoteAddr = req.getRemoteAddr();
            // 获取请求 URI
            String requestURI = req.getRequestURI();
            // 获取请求 URL
            StringBuffer requestURL = req.getRequestURL();
            String s = method + " " +contextPath + " " +servletPath + " " +protocol + " " +remoteAddr + " " +requestURI + " " +requestURL;
            // 显示到页面上
            resp.getWriter().write(s);
        }
    }
    
获取请求头数据
  • 方法

    方法作用
    String getHeader(String name)通过请求头的名称获取请求头的值
    Enumeration getHeaderNames():获取所有的请求头名称
  • 示例代码

    @WebServlet("/header")
    public class MyServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html;charset=utf-8");
            // 根据请求头名称获取其值
            String agent = req.getHeader("user-agent");
            String s = "";
            //判断是何种浏览器
            if(agent.contains("Chrome")){
                s += "Chrome" + "<br>";
            }else if(agent.contains("Firefox")){
                s += "Firefox" + "<br>";
            }else if(agent.contains("IE")){
                s += "IE" + "<br>";
            }
            // 获取所有请求头名称
            Enumeration<String> headerNames = req.getHeaderNames();
            while(headerNames.hasMoreElements()){
                s += headerNames.nextElement() + "<br>";
            }
            // 输出到页面
            resp.getWriter().write(s);
        }
    }
    
    // 防盗链模板
    public class MyServlet extends Servlet{
           protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String referer = request.getHeader("Referer");
            if (referer == null || !referer.contains("yourwebsite.com")) {
                response.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden");
            } else {
                // 返回图片的逻辑
                // 例如,将图片写入响应流
                // response.setContentType("image/jpeg");
                // 将图片写入响应流
            }
        }
    }
    
获取请求体数据
  • 请求体:只有 POST 请求方式,才有请求体,在请求体中封装了 POST 请求的请求参数

  • 使用步骤:

    • 获取流对象
    • 再从流对象中拿取数据
  • 方法

    方法作用
    BufferedReader getReader()获取字符输入流,只能操作字符数据
    ServletInputStream getInputStream()获取字节输入流,可以操作所有类型数据
获取请求参数
  • 获取请求参数(请求体中)通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数

  • 方法

    方法作用
    String getParameter(String name)根据参数名称获取参数值
    String[] getParameterValues(String name)根据参数名称获取参数值的数组
    Enumeration getParameterNames()获取所有请求的参数名称
    Map<String,String[]> getParameterMap()获取所有参数的map集合
  • 示例代码

    //获取所有请求参数
    Map<String, String[]> map = request.getParameterMap();
    //创建 JavaBean 类
    User loginUser = new User();
    //使用 BeanUtils
    try {
        BeanUtils.populate(loginUser,map);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
    

请求转发

  • 概述:一种在服务器内部的资源跳转方式

  • 特点:

    • 浏览器地址栏路径不发生变化
    • 只能转发到当前服务器内部资源中
    • 转发是一次请求
  • 示例图

  • 步骤

    • 通过 request 对象获取请求转发器对象
    • 使用 RequestDispatcher 对象来进行转发
  • 方法

    方法作用
    RequestDispatcher getRequestDispatcher(String path)通过 request 对象获取请求转发器对象,path 是你想要转发到的 Servlet 的路径
    forward(ServletRequest request, ServletResponse response)通过 RequestDispatcher 对象进行转发
  • 示例代码

    /**
     * 本 Servlet 用来 转发请求
     */
    @WebServlet("/test1")
    public class ServletTest1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 设置需要传递的数据
            String data = "Hello from ServletTest1";
            // 存储数据到 request 域中
            req.setAttribute("data",data);
            // 转发请求
            req.getRequestDispatcher("/test2").forward(req,resp);
        }
    }
    /**
     * 本 Servlet 用于接收请求并处理
     */
    @WebServlet("/test2")
    public class ServletTest2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 获取转发的数据
            String data = (String) req.getAttribute("data");
            // 处理数据
            resp.getWriter().write("Data from ServletTest1" + data);
        }
    }
    
    

    注意:可以看到当访问,test1 时候,会将资源跳转到 test2 中,路径不变,但是资源发送过去了

共享数据

  • 域对象:一个有作用范围的对象,可以在范围内共享数据

  • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

  • 方法

    方法作用
    void setAttribute(String name,Object obj)存储数据
    Object getAttitude(String name)通过键获取值
    void removeAttribute(String name)通过键移除键值对
    ServletContext getServletContext()获取 ServletContext
  • 33
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值