Requset对象

Request和Response原理

  1. TomCat根据请求url当中的资源路径创建对应的servlet类
  2. TomCat会创建request对象和response对象,request对象当中封装请求消息数据
  3. TomCat将Request和Response两个对象传递给service方法,并且调用service方法
  4. 我们可以来操作request和response两个对象,request获取请求消息数据,response获取响应消息数据
  5. 服务器再给浏览器做出响应之前,会从response对象中获取程序员设置的响应消息数据

Request的体系结构

ServletRequest:接口
	||继承
	\/
HttpServletRequest:接口
	||实现
	\/
RequestFacade:实现类

Request功能

获取请求消息数据

获取请求行数据

  • 方法
 GET /day/demo?name=zhangsan HTTP/1.1
 // 获取请求方式
 String getMethod();
 // *获取虚拟目录:/day
 String getContextPath();
 // 获取servlet路径:/demo
 String getServletPath();
 // 获取请求参数
 String getQueryString();
 // *获取请求的URI
 String getRequestURI();/day/demo
 StringBuffer getRequestURL();http://localhost/day/demo
 // 获取协议和版本
 String getProtocol();
 // 获取客户机的ip地址
 String getRemoteAddr();
  • 实例
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(urlPatterns = "*.demo")
public class RequestDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取请求方式
        System.out.println(request.getMethod());
        // *获取虚拟目录
        System.out.println(request.getContextPath());
        // 获取servlet路径
        System.out.println(request.getServletPath());
        // 获取get方式的请求参数
        System.out.println(request.getQueryString());
        // *获取URI
        /**
         * URL:统一资源定位符,http://localhost/servlet/cjd.demo
         * URI:统一资源标识符,/servlet/cjd.demo
         */
        System.out.println(request.getRequestURI());
        System.out.println(request.getRequestURL());
        // 获取版本协议
        System.out.println(request.getProtocol());
        // 获取客户机ip地址
        System.out.println(request.getRemoteAddr());
    }
}
GET
/servlet
/cjd.demo
username=627715324%40qq.com
/servlet/cjd.demo
http://localhost/servlet/cjd.demo
HTTP/1.1
0:0:0:0:0:0:0:1

获取请求头数据

  • 方法
// 通过头名称获取头的值
String getHeader(String var1);
// 获取所有的请求头名称
Enumeration<String> getHeaderNames(String var1);
  • 代码实例
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.Enumeration;

@WebServlet(urlPatterns = "*.demo")
public class RequestDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Enumeration<String> stringEnumeration = request.getHeaderNames();

        while(stringEnumeration.hasMoreElements()) {
            String header = stringEnumeration.nextElement();
            System.out.println(header + " : " + request.getHeader(header));
        }
    }
}
host : localhost
connection : keep-alive
upgrade-insecure-requests : 1
user-agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4023.0 Safari/537.36 Edg/81.0.396.0
accept : text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site : same-origin
sec-fetch-mode : navigate
sec-fetch-user : ?1
sec-fetch-dest : document
referer : http://localhost/servlet/login.html
accept-encoding : gzip, deflate, br
accept-language : en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7

获取请求体数据

  • 方法
/**
 * 1.获取流对象
 * 2.从流对象当中获取数据
 */
 ServletInputStream getInputStream() throws IOException;
 BufferedReader getReader() throws IOException;
  • regist页面HTML代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
<form action="/servlet/do.demo" method="POST">
    <input type="text" placeholder="请输入用户名" name="username"><br>
    <input type="text" placeholder="请输入密码" name="password"><br>
    <input type="submit" value="注册">
</form>
</body>
</html>
  • demo类代码
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;
import java.nio.Buffer;

@WebServlet(urlPatterns = {"*.demo"})
public class ServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader bufferedReader = req.getReader();
        String line = null;
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
    }
}
username=chinese&password=china

其他功能

获取请求参数通用方式:GET和POST都可以

  • 代码实例
// 根据参数名称获取参数值
String getParameter(String var1);
String[] getParameterValues(String var1);
// 获取所有请求的参数名称
Enumeration<String> getParameterNames();
// 获取所有参数的map集合
Map<String, String[]> getParameterMap();

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Enumeration<String> parameterNames = req.getParameterNames();
        while(parameterNames.hasMoreElements()) {
            String element = parameterNames.nextElement();
            System.out.println(element + " : " + req.getParameter(element));
        }
    }

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Map<String, String[]> map = req.getParameterMap();
        for(Map.Entry<String, String[]> entry : map.entrySet()) {
            String key = entry.getKey();
            String[] values = entry.getValue();
            System.out.println(key + " : ");
            for(String s : values) {
                System.out.println(s);
            }
        }
    }
  • 中文乱码问题
/**
 * 1.GET方式无乱码,tomcat8已经解决
 * 2.POST方式的解决方式就是在获取参数之前重新编码
 */
 request.setCharacterEncoding("utf-8");

请求转发

  • 定义:一种在服务器内部的资源跳转方式
  • 步骤
/**
 * 1.通过Request对象获取请求转发器对象
 * 2.通过请求转发器对象进行转发
 */
 RequestDispatcher getRequestDispatcher(String var1);
 req.getRequestDispatcher("/servlet/cjd.demo2").forward(req, resp);

  • 特点
    1.浏览器的地址栏不发生变化
    2.只能访问当前服务器内部资源当中,不能访问服务器外部的其他资源
    3.转发是一次请求,也就是多个资源使用的是同一个请求

共享数据

  • 域对象:一个有作用范围的对象,可以在范围之内共享数据
  • request的域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
  • 方法
// 存储数据(键值对)
void setAttribute(String var1, Object var2);
// 获取共享数据(根据键值获取Object对象)
Object getAttribute(String var1);
// 删除键值对
void removeAttribute(String var1);

获取ServletContext

  • ServletContext getServletContext();

Request获取请求消息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章