Request的学习笔记(属Servlet学习课程)


浏览器访问服务器时,会将用户提交的参数数据、协议版本、请求头信息封装成请求报文(即请求数据包)发送给服务端。
服务器(例如Tomcat)收到请求报文会封装到 Request 对象中。程序员可以通过 Request 对象获取请求消息数据。

获取请求消息数据

1.获取请求行的数据

GET /web-demo-03/demo01?name=zhangsan HTTP/1.1

方法:
1.1.获取请求方式:GET
String getMethod()

1.2.获取虚拟目录:/web-demo-03
String getContextPath()

1.3.获取Servlet路径:/demo01
String getServletPath()

1.4.获取请求URI:/web-demo-03/demo01
URI 统一资源标识符
String getRequestURI()

1.5.获取GET方式的请求参数:name=zhangsan
String getQueryString()

1.6.获取请求URL:http://localhost:8080/web-demo-03/demo01
URL 统一资源定位符
String getRequestURL()

1.7.获取协议及版本:http/1.1
String getProtocol()

1.8.获取客户机的IP地址
String getRemoteAddr()

扫描二维码关注公众号,回复: 13724426 查看本文章

2.获取请求头的数据

请求头名称不区分大小写。

方法:
String getHeader(String name) 通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames() 获取所有的请求头名称。Enumeration 类似迭代器

示例代码:

package priv.lwx.javaex.web_demo_03.web.servlet;
 /**
 * 获取referer,防止盗链
 *
 * @author liaowenxiong
 * @date 2021/12/29 11:21
 */


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;

@WebServlet(value = "/demo06")
public class ServletDemo06 extends HttpServlet {
    
    
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
    // 获取referer
    String referer = request.getHeader("referer");
    System.out.println(referer);
    // 防止盗链
    if (referer != null) {
    
    
      if (referer.contains("/web-demo-03")) {
    
    
        // 应用内正常访问
        System.out.println("播放电影");
      } else {
    
    
        // 应用外访问
        System.out.println("想看电影吗?来优酷吧!");
      }
    }

  }
}

3.获取请求体的数据

只有 post 请求方式才有请求体,在请求体中封装了 post 请求的请求参数。

步骤:
3.1.获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据(主要用于文件上传、视频上传等场景)

3.2.从流对象中取数据

示例代码:

package priv.lwx.javaex.web_demo_03.web.servlet.request;

/**
 * 获取请求体的数据
 *
 * @author liaowenxiong
 * @date 2021/12/29 11:21
 */


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.BufferedReader;
import java.io.IOException;

@WebServlet(value = "/request-demo05")
public class RequestDemo05 extends HttpServlet {
    
    
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
  }

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
    // 获取请求消息体的数据
    // 1.获取字符流
    BufferedReader reader = request.getReader();
    // 2.读取数据
    String line = null;
    while ((line = reader.readLine()) != null) {
    
    
      System.out.println(line);
    }
  }
}

4.获取其它的数据

4.1.获取请求参数的通用方式

不论 get 还是 post 方式,都可以使用下面的方法获取请求参数。

方法:
String getParameter(String name):根据参数名称获取参数的值。要注意的问题: 如果 name 与实际的请求参数名不一致,则返回 null。
如果前端页面并没有输入参数值,则返回空字符串 ""

String[] getParameterValues(String name):根据参数名称获取参数值的数组。例如:hobby=ds&hobby=ps
Enumeration<String> getParameterNames():获取所有请求参数的名称

 Enumeration<String> parameterNames = req.getParameterNames();
// 迭代遍历Enumeration对象
while (parameterNames.hasMoreElements()) {
    
    
	String s = parameterNames.nextElement();
	System.out.println(s);
}

Map<String,String[]> getParameterMap():获取所有请求参数的 Map 集合。

中文乱码问题

tomcat 8 已经将 get 请求方式的中文乱码问题解决了,但是 post 请求方式会出现中文乱码问题。

解决办法:
获取参数前,设置解码的字符编码为 utf-8,代码如下:

request.setCharacterEncoding("utf-8");

这个字符编码要和前端页面的字符编码保持一致。

4.2.请求转发

请求转发:一种在服务器内部的资源跳转方式

步骤:
4.2.1.通过 request 对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path),path 是转发目标的资源路径

4.2.2.使用 RequestDispatcher 对象来进行转发:requestDispatcher.forward(ServletRequest request, ServletResponse response)

特点:
4.2.3.浏览器地址栏的访问路径没有变化
4.2.4.只能转发到当前服务器内部的资源
4.2.5.转发只是一次请求

4.3.共享数据

域对象:一个有作用范围的对象,可以在范围内共享数据
Request 域对象:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

方法:
void setAttribute(String name,Object obj):存储数据
Object getAttribute(String name):获取数据;通过属性名获取属性值
void removeAttribute(String name):删除数据;通过属性名删除对应的数据;通过键移除对应的键值对

4.4.获取 ServletContext 对象

ServletContext getServletContext()

继承与实现体系

HttpServletRequest 接口继承自 ServletRequest 接口

org.apache.catalina.connector.RequestFacade(tomcat 实现的类型),实现 HttpServletRequest 接口

猜你喜欢

转载自blog.csdn.net/liaowenxiong/article/details/123323191
今日推荐