Request对象-获取请求消息

Request

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

  • Request 对象的原理

    Request对象-获取请求消息_第1张图片

  • Request 对象的继承体系结构

    Request对象-获取请求消息_第2张图片

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" + "
    "
    ; }else if(agent.contains("Firefox")){ s += "Firefox" + "
    "
    ; }else if(agent.contains("IE")){ s += "IE" + "
    "
    ; } // 获取所有请求头名称 Enumeration<String> headerNames = req.getHeaderNames(); while(headerNames.hasMoreElements()){ s += headerNames.nextElement() + "
    "
    ; } // 输出到页面 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 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对象-获取请求消息_第3张图片

  • 步骤

    • 通过 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

你可能感兴趣的:(Java,Web专栏,Request,请求转发,共享域,Servlet)