当前位置: 首页 > news >正文

5.HttpServletRequest类

HttpServletRequest类

一、作用

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。

然后传递到service方法(doGet 和 doPost)中给我们使用。

可以通过HttpServlerRequest对象,获取到所有请求的信息

 

二、常用方法

  1. getRequestURI() —> 获取请求的资源路径
  2. getRequestURL() —> 获取请求的统一资源定位符(绝对路径)
  3. getRemoteHost() —> 获取客户端ip地址
  4. getHeader() —> 获取请求头
  5. getParameter() —> 获取请求的参数
  6. getParameterValues() —> 获取请求的参数(多个值的时候使用)
  7. getMethod() —>获取请求的方式GET 或 POST
  8. setAttribute(key,value) —>设置域数据
  9. getAttribute(key) —>获取域数据
  10. getRequestDispatcher() —> 获取请求转发对象

演示代码:

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RequestAPIServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //i. getRequestURI() 获取请求的资源路径
        System.out.println("URI->"+req.getRequestURI());
        //ii. getRequestURL() 获取请求的统一资源定位符(绝对路径)
        System.out.println("URL->"+req.getRequestURL());
       //iii. getRemoteHost() 获取客户端的 ip 地址
        /*
        * 在IDEA中,使用localhost访问时 得到的客户端ip地址是0:0:0:0:0:0:0:1
        * 如果使用真实ip访问时,得到的客户端ip地址是真实的客户端ip地址
        * */
        System.out.println("客户端IP地址:"+req.getRemoteHost());
        //iv. getHeader() 获取请求头
        System.out.println("请求头User-Agent-->"+req.getHeader("User-Agent"));
        //v. getParameter() 获取请求的参数

        //vi. getParameterValues() 获取请求的参数(多个值的时候使用)
        //vii. getMethod() 获取请求的方式 GET 或 POST
        System.out.println("请求的方式:"+req.getMethod());
    }
}

三、获取请求参数

1. 新建html文件,创建表单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/07_servlet/parameterServlet" method="post">
    username: <input type="text" name="username"><br>
    password: <input type="password" name="password"><br>
    hobby: <input type="checkbox" name="hobby" value="cpp">C++
    <input type="checkbox" name="hobby" value="Java">Java
    <input type="checkbox" name="hobby" value="JS">JS
    <input type="submit">
</form>
</body>
</html>

2. 创建java类获取请求参数

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;

public class ParameterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobby = req.getParameterValues("hobby");
        System.out.println("密码:"+password);;
        System.out.println("用户名:"+username);
        System.out.println("爱好:"+ Arrays.asList(hobby));

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题,也要在获取请求参数之前调用才有效
        req.setCharacterEncoding("UTF-8");
        System.out.println("----------doPost");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobby = req.getParameterValues("hobby");
        System.out.println("用户名:"+username);
        System.out.println("密码:"+password);
        System.out.println("爱好:"+ Arrays.asList(hobby));
    }
}

四、请求转发

定义:指服务器收到请求后,从一次资源跳转到另一次资源的操作

请求转发过程解析:

  1. 客户端通过 http://ip:port/工程名/servlet1 访问 servlet1程序
  2. servlet1程序执行如下操作:
    1. 获取请求的参数
    2. 处理完业务,给请求的参数设置一个object 让servlet2知道是从servlet1转发过来的
    3. 通过servlet1找到servlet2的程序地址
    4. 跳转到servlet2
  3. servlet2程序执行如下操作:
    1. 获取请求参数
    2. 检验servlet1的标记(object)
    3. 处理业务

演示代码:

servlet1中的代码:

package servlet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求的参数
        String username = req.getParameter("username");
        System.out.println("在Servlet1中查看参数:"+username);

        //给请求的参数设置object,并传递到Servlet2去查看
        req.setAttribute("Key","柜台1的章");
        

        //设置Servlet2的地址
        /*
        请求转发必须要以斜杠开始,斜杠表示地址为;http://ip:port/工程名/, 映射到IDEA代码的web目录

        * */
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
        //跳转servlet2
        requestDispatcher.forward(req,resp);
    }
}

servlet2中的代码:

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        System.out.println("在servlet2中查看参数:"+username);

        //查看servlet1是否有“章”
        Object key1 = req.getAttribute("key1");
        System.out.println("servlet1是否有章:"+ key1);

        //处理自己的业务
        System.out.println("servlet2处理自己的业务");
    }
}

相关文章:

  • Unity 状态机
  • DDD架构学习
  • numpy学习笔记8
  • (41)5.6-5.7数据结构(栈和队列的应用)
  • 19_Scala集合概述
  • 力扣每日一题105:从前序与中序序列构造二叉树
  • iOS App冷启动优化:Before Main阶段
  • 图论(算法竞赛、蓝桥杯)--Dijkstra算法最短路
  • prime_series_level-1靶场详解
  • 项目:shell实现多级菜单脚本编写
  • 黑马程序员——接口测试——day03——Postman断言、关联、参数化
  • 【C语言】学生宿舍信息管理系统
  • 【SQL刷题】秋招刷爆SQL题之插入数据
  • 刷爆leetcode第九期 0020
  • Colmap安装与实践
  • 【苹果iMessage相册推信息推】 重要用于安装背面必要安装的watchman
  • 艾德克斯IT6512D可编程直流电源中文介绍
  • 使用机器学习做DGA域名识别
  • Day06-尚品汇-排序操作上
  • Linux进程替换(exec系列)
  • 史上最全软件测试工程师常见的面试题总结(百度、oppo、中软国际、华为)
  • 艾美捷抗人IL-2单抗MT8G10即用型解决方案
  • 头歌-信息安全技术-实训04 数据库SQL注入漏洞
  • C# 中的多线程
  • 建立自己的kindle书库
  • JavaWeb笔记(五)后端(Thymeleaf)(Tomcat类加载机制)(编写图书管理系统)
  • 提升网站流量和排名的方法,SEO优化要这样做
  • kubernets集群升级
  • 使用HTML+CSS+JS模拟比赛晋级的动画功能
  • 【数据结构Java版】LinkedList与链表之单链表
  • python list转str类型,str转list类型
  • 基于java校园德育活动预约和评分管理系统的设计与实现-计算机毕业设计源码+LW文档