Servlet 之 Request

request对象和response对象的原理

  1. request和response对象是由服务器创建的。我们来使用它们
  2. request对象是来获取请求消息,response对象是来设置响应消息

request对象继承体系结构

ServletRequest		--	接口
	|	继承
HttpServletRequest	-- 接口
	|	实现
org.apache.catalina.connector.RequestFacade 类(tomcat)

request功能

  1. 获取请求消息数据

    1. 获取请求行数据
      GET
      方法:

    2. 获取请求方式 :
      String getMethod()

    3. (*)获取虚拟目录:
      String getContextPath()

    4. 获取Servlet路径:
      String getServletPath()

    5. 获取get方式请求参数:
      String getQueryString()

    6. (*)获取请求URI:
      String getRequestURI():
      StringBuffer getRequestURL() :

      URL:统一资源定位符
      URI:统一资源标识符

    7. 获取协议及版本:HTTP/1.1
      String getProtocol()

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

  2. 获取请求头数据
    方法:
    (*)String getHeader(String name):通过请求头的名称获取请求头的值
    Enumeration getHeaderNames():获取所有的请求头名称

  3. 获取请求体数据:
    请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
    步骤:

    1. 获取流对象
      BufferedReader getReader():获取字符输入流,只能操作字符数据
      ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据

      1. 再从流对象中拿数据

获取请求参数的通用方式

根据参数获取参数值:
String name = request.getParameter("name");

根据参数获取参数值的数组:
String[] hobbies = request.getParameterValues("hobby");

获取所有请求的参数名称:
Enumeration parameterNames = request.getParameterNames();

获取所有参数的map集合
Map<String,String[]> getParameterMap();

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("/RegisterDemo")
public class RegisterDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通用方法
        //根据参数获取参数值
        String name = request.getParameter("name");

        //根据参数获取参数值的数组
        String[] hobbies = request.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }

        //获取所有请求的参数名称
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()){
            String name1 = parameterNames.nextElement();
            System.out.print(name1);
            String value = request.getParameter(name1);
            System.out.println(value);
            
		//获取所有参数的map集合
        Map<String, String[]> parameterMap = request.getParameterMap();
        //遍历
        Set<String> keyset = parameterMap.keySet();
        for (String key : keyset) {
            //获取集合中的键和值
            String[] values = parameterMap.get(key);
            System.out.println(key);
            for (String value : values) {
                System.out.println(value);
            }
            System.out.println("-------");

        }

        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

相应的html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>

    <form action="/RegisterDemo" method="post">
        <input type="text" placeholder="请输入用户名" name="username"> <br>
        <input type="text" placeholder="请输入密码" name="password"> <br>

        <input type="checkbox" name="hobby" value="game"> 游戏
        <input type="checkbox" name="hobby" value="study"> 学习
        <input type="submit" value="注册">


    </form>
</head>
<body>

</body>
</html>

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

  1. 步骤:

    1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
    2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
  2. 特点:

    1. 浏览器地址栏路径不发生变化
    2. 只能转发到当前服务器内部资源中。
    3. 转发是一次请求
  3. 共享数据:

    • 域对象:一个有作用范围的对象,可以在范围内共享数据
    • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
    • 方法:
      1. void setAttribute(String name,Object obj):存储数据
      2. Object getAttitude(String name):通过键获取值
      3. void removeAttribute(String name):通过键移除键值对
posted @ 2020-02-27 12:55  你可真高  阅读(418)  评论(0编辑  收藏  举报