httpservletrequest_HttpServletRequest详解 外加请求转发和重定向口述讲解(五)

2023-10-27

点击上方“ IT咸鱼 ”,星标公众号 591bccf00c97a2e90d39f5028b07a1ca.gif每天分享技术栈,开发工具等

续前篇....

咳,今天家里停电电继续更新,每天坚持,前面我们说到response对象的用法和案列,接下来再说说Servlet Request对象用法和案例。

1.ServletRequest,代表的是客户端向服务器发送的请求信息,服务器需要客户端的信息,需要找到ServletRequset对象,才能获得客户端发送的信息。它的子类HttpServletRequset向浏览器向客户端发送信息时,HttpServletRequset对象可以获得请求部分里面的内容。HttpServletRequset是由容器创建的。

2.ServletRequest常用的一些方法:

a)public String getParameter(String name):以 String 形式返回请求参数的值,如果该参数不存在,则返回 null。请求参数是与请求一起发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发送的表单数据中。

b)public java.util.Enumeration getParameterNames():返回包含此请求中所包含参数的名称的 String 对象的 Enumeration。如果该请求没有参数,则此方法返回一个空的 Enumeration。

c)public String[] getParameterValues(String name):返回包含给定请求参数拥有的所有值的 String 对象数组,如果该参数不存在,则返回 null。如果该参数只有一个值,则数组的长度为 1。

d)public java.util.Map getParameterMap() :将请求参数名称作为键、参数值作为映射值的不可变 java.util.Map。参数映射中的键的类型为 String。参数映射中的值的类型为 String 数组。

e)public RequestDispatcher getRequestDispatcher(String path):返回一个 RequestDispatcher 对象,它充当位于给定路径上的资源的包装器。可以使用 RequestDispatcher 对象将请求转发给资源,或者在响应中包含资源。资源可以是动态的,也可以是静态的。

3.HttpServletRequest常用的一些方法。

a)public String getMethod():返回一个浏览器向服务器请求的方式。例如 GET、POST 或 PUT。

4.简单的常用的获取请求参数,将请求参数封装到一个People的bean对象里。

a)第一种方式:当HTML中,表单的input标签属性name的只有唯一的属性值,可以使用getParameter(String name)。示例代码如下:

PrintWriter out=resp.getWriter();
        //创建一个bean对象
        People p=new People();
        //获得表单的name对应的value属性值
        String name=req.getParameter("name");
        //获得表单的password对应的value属性值
        String pass=req.getParameter("password");
        //往bean中设置值
        p.setName(name);
        p.setPassword(pass);
        out.print(p.toString());

b)当HTML中,表单的input标签属性name的有相同的属性值,比如密码输入框还有一个重复密码输入框,都是name=password,那么想同时获得这两个password就需要使用到getParameterValues(String name)方法。示例代码如下:

PrintWriter out=resp.getWriter();
        //创建一个bean;
        People p=new People();
        String name=req.getParameter("name");
        //获得多个password名称的值
        String[] password=req.getParameterValues("password");
        p.setName(name);
        //设置密码
        p.setPassword(password[0]);
        //设置重复密码
        p.setRepassword(password[1]);
        out.print(p.toString());

c)第三种方式:对于第二种方式我们也可以使用public java.util.Map getParameterMap()方法来做。示例代码如下:

PrintWriter out=resp.getWriter();
        //创建一个bean;
        People p=new People();
        //获得请求参数的map映射。
        Map<String,String[]> map=req.getParameterMap();
        for(Map.Entry<String, String[]> entry:map.entrySet()){
            String key=entry.getKey();
            //判断表单中name的属性名称
            if("name".equals(key)){
                String[] name=entry.getValue();
                p.setName(name[0]);
            }else if("password".equals(key)){
                String[] value=entry.getValue();
                //设置密码
                p.setPassword(value[0]);
                //设置重复密码
                p.setRepassword(value[1]);
            }
        }

        out.print(p.toString());

5.复杂的获取请求参数。

在开发中,我们不确定一个bean有多少个属性值,这时我们可以通过内省的方式给bean进行封装。比如对以上三种简单的请求参数获取,我们可以采用内省的方式来做。(注意:采用内省的方式要保证表单中的name名称和bean中的属性名称要保持一样。当表单中的name名称相同的时候,建议采用数组。这里我将重复密码的name属性值名称改为repassword)我们获得他们的所有参数名称(bean中是属性),然后再对属性赋值。这里采用以下两种方式:

a)第一种方式:通过getParameterNames()方法来获得所有的参数名称。采用内省的属性描述器(PropertyDescript)的方式。示例代码如下:

PrintWriter out=resp.getWriter();
        //创建一个bean;
        People p=new People();
        Enumeration enums=req.getParameterNames();//遍历枚举集合while(enums.hasMoreElements()){//表单name属性的值
            String propertyName=enums.nextElement();//表单的value属性的值。
            String value=req.getParameter(propertyName);//采用属性描述器try {
                PropertyDescriptor pd=new PropertyDescriptor(propertyName, p.getClass());//获得bean中的属性方法。
                Method method=pd.getWriteMethod();//调用设置指定属性的方法
                method.invoke(p, value);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }out.print(p.toString());

b)第二种方式:更简单更适合开发的使用方式。采用第三方的内省jar包BeanUtils工具jar包,是Apache提供的开源工具。里面有一个populer()方法。示例代码如下:

    PrintWriter out = resp.getWriter();
        // 创建一个bean;
        People p = new People();
        Map<String, String[]> map = req.getParameterMap();
        try {
            // 里面可以直接就可以对bean中的属性进行赋值
            BeanUtils.populate(p, map);
        } catch (Exception e) {
            e.printStackTrace();
        }
        out.print(p.toString());

6.案例:获取表单的提交信息。

需求:一个注册的页面提交的数据,封装到bean对象里。示例代码如下:

Person的bean对象。

public class Person {

    private String username;// 用户名
    private String password;// 用户密码
    private boolean married;// 是否婚否
    private String hobby;// 爱好
    private String sex;// 性别
    private String location;// 故乡
        private String descript;
       //省写get和set方法
       public T getXXX(){}
       public void setXXX();{}
       public void toString(){};

将数据封装到bean对象中。

public class RegisterServlet extends HttpServlet {
    //读取请求参数并封装到bean对象中。
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
        PrintWriter out=resp.getWriter();
        Person p=new Person();
        Map map=req.getParameterMap();try {
            BeanUtils.populate(p, map);
        } catch (Exception e) {
            e.printStackTrace();
        }       
        out.print(p);
    }@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doGet(req, resp);
    }
}

注册页面

          请输入用户名:<input type="text" name="username"/><br>
          请输入密码:<input type="password" name="password"/><br>
          选择婚否:<input type="checkbox" name="married"/><br>
          选择性别:
              男<input type="radio" name="sex" value="male"/>
              女<input type="radio" name="sex" value="famale"/><br>
          选择爱好:<input type="checkbox" name="hobby" value="basketball"/>篮球
                  <input type="checkbox" name="hobby" value="tabletennis">乒乓球
                  <input type="checkbox" name="hobby" value="football">足球<br>
          选择家乡:<select name=location>
              <option value="sh">上海option>
              <option value="bj">北京option>
              <option value="anhui">安徽option>
          select><br>
          简介:<textarea name="descript">textarea><br>
          <input type="image" src="sub.jpg"/>
      form>

注意:表单中的input标签的类型是radio,checkbox,这些类型的表单有对应的名称输入域,如果一个不选择,则服务器接受到数据的是null。如果选择了其中的一个或多个,则把它们的value的取值提交给服务器。如果选择了一个或多个,但value没有取值,则默认提交给服务器的是on。

7.ServletRequest是一个域对象,内部维护了一个Map。

它的域对象常用的方法有:

a)public Object getAttribute(String name):以 Object 形式返回指定属性的值,如果不存在给定名称的属性,则返回 null。

b)public void setAttribute(String name, Object o):存储此请求中的属性

c)public void removeAttribute(String name):从此请求中移除属性。

微信公众号:IT咸鱼关注可了解更多的教程及技术小知识。问题或建议,请公众号留言

请求转发和重定向

1.HTTPServletResponse对象的sendRedirect(String location)方法称作重定向。如果location地址前面加上“/“,则表示相对于Servlet容器的根来请求,即http://localhost:8080,如果lcoation地址前没有加上”/“,则表示相对于当前请求的URL来寻找地址

2.RequestDispatcher的forward(request,response)方法称作为请求转发。如何得到RequestDispatcher对象.

a)方式一:ServletContext.getRequestDispatcher(目标资源的URI); 

目标资源的URI必须以"/"开头,否则报错,此"/"就表示的是当前应用(绝对路径表示法)

b)方式二:ServletRequest.getRequestDispatcher(目标资源的URI);

目标资源的URI如果以"/"开头,就表示的是当前应用(绝对路径表示法)。如果不以"/"开头,就表示相对路径。

3.请求转发使用细节:由源组件转发到目标组件时,容器会清空源组件输出的数据。因此,用户只会看到目标组件输出的页面结果。但是,响应头信息是不清空的。

编码原则:不要在转发前后向页面输出数据,也不要关闭输出流。(做无用功)。

4.包含(RequestDispatcher的include()方法):(动态包含)

使用细节:由源组件包含到目标组件时,容器会清空目标组件的头。因此,源组件设置的头才有效。但是,响应体信息是不清空的。

编码原则:不要在目标组件中设置响应头。(做无用功)

5.请求转发与重定向的区别:

a)请求转发:整个过程处于同一个请求当中

b)重定向:实际上客户端会向服务器端发送两个请求。

c)RequestDispatcher是通过调用HTTPServletRequest对象的getRequestDispatcher()方法得到的,是属于请求对象的方法。

d)sendRedirect()是HTTPServletResponse对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。

419f9527625335f80f0c4232be25ba5b.gif

Servlet详解(一)之基本概念

2020-10-22

2e93f69f8034af8dd9e7c8c3956e6998.png

专攻知识小点——回顾JavaWeb中的servlet(二)

2020-10-24

d14b3caf7e4b9a82050713fc0457e8fe.png

专攻知识小点——回顾JavaWeb中的servlet(三)

2020-10-25

49e925df760e9842874cdd8ddce23762.png

温故知新之javaweb中的servlet(四)

2020-10-27

9d08496794135d20fbb629665ea04cbf.png

2020-IT咸鱼挑灯夜战整理的java学习资料奉上(推荐收藏)

2020-10-26

926b8b6d330f7cacd39276a0f8a5e275.png

END

如果看到这里,说明你喜欢这篇文章,请 转发、点赞。同时 标星(置顶)本公众号可以第一时间接受到博文推送。

4db1c07757d4f8b751e732b2eb10ee62.png

我知道你 “在看c95fa9147b4dc210c9ef757579b36732.gif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

httpservletrequest_HttpServletRequest详解 外加请求转发和重定向口述讲解(五) 的相关文章

随机推荐

  • Restful风格详解

    Restful风格的描述与解释 转载 https www cnblogs com letsdaydayup p 14441123 html 文章目录 Restful风格的描述与解释 一 什么是Restful风格 二 Restful的特点 实
  • OpenHarmony 3D显示支持

    前言 OpenHarmony系统是一个非常先进 现代化设计理念的新系统其系统架构图如下 一 图形子系统架构图 图形子系统是最复杂的一个 标准版这里2D的部分 foundation graphic graphic 2d rosen modul
  • 流计算处理系统入门

    时间可以划分成两种 处理时间 数据抵达流计算系统开始进行处理的时间 数据被处理的时间 事件时间 被检测系统获得数据的时间 一般用时间戳的方式携带在数据中 处理时间 晚于 数据事件时间 流计算框架 Hadoop 批处理框架 采集的数据全存入H
  • xssgame第十一关至第十四关

    第十一关 首先查看源码 我们获得到新的t ref参数 这个参数有点像http的请求头的refer值 我们用bp抓包尝试在请求头refer输入值查看结果 打开bp 添加一条 Referer type text nm use ver alert
  • 目标检测中将已有的.xml数据集转换成.txt数据集(附代码,归一化后供YOLO格式使用)

    目标检测中将已有的 xml数据集转换成 txt数据集 附代码 归一化后供YOLO格式使用 1 新建项目 我新建了data目录并新建Annotations images ImageSets JPEGImages labels 五个文件夹 其中
  • 有限状态自动机

    1 什么是有限状态自动机 1 1什么是计算 维基百科定义 计算 英语 Calculation 是一种将 单一或多个的输入值 转换为 单一或多个的结果 的一种思考过程 可以简单理解为给出一个问题得到一个答案的过程 如下图所示日常生活比较常见计
  • 【问题解决】glob.glob 如何匹配所有子文件夹下的文件 —— recursive=True

    一 仅匹配一级目录下的文件 import glob label dir data part1 dir1 txt datas glob glob label dir print datas gt gt gt data part1 dir1 0
  • Java中的类、对象以及方法简单定义与参数传递

    目录 一 类和对象的概念 二 方法 一 类和对象的概念 对象 现实世界中客观存在的物体都是对象 具有属性和方法 其中属性描述对象的特征 方法描述对象的行为 类 具有相同属性和方法的多个对象的集合 类是对对象的抽象 对象是类的具体 类是创建对
  • 关于安装pytorch、cuda对应GPU显卡算力问题(记录贴)

    贴几个链接 ngc pytorch容器版本对应关系 CUDA Toolkit版本及可用PyTorch对应关系 NVIDIA英伟达GPU显卡算力表 总结 安装torch时会安装对应的cuda版本 目前来看cuda10对应的是7 5的算力 适用
  • LLVM基本概念入门

    入职新公司以后 开始着手基于LLVM开发编译器 之前在前东家那里主要做gcc的开发 所以也算是有点基础 但拿到LLVM后 除了知道clang a c o a之外 好像其他的都有点差异 现在经过了小一个月的学习 也算有点收获 因为网上关于LL
  • 抖音矩阵系统-60+自媒体平台一键发布-短视频获客系统

    当老板做企业的 想在抖音上做生意的 一定一定要开通蓝V企业号线索版来做矩阵 看看我每天的线索都是999 客服都接待不过来 现在还有300个客资未分配 抖音都在推了企业员工号的玩法 你还在质疑什么 在抖音上做矩阵 真的能将你的生意放大100倍
  • rabbitmq使用mqtt协议

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 rabbitmq是什么 二 mqtt协议是什么 三 配置步骤 1 启用 rabbitmq的mqtt协议 2 mqtt 客户端依赖包 总结 前言 在网上学习
  • JavaScript undefined 属性

    定义和用法 undefined 属性用于存放 JavaScript 的 undefined 值 语法 undefined 说明 无法使用 for in 循环来枚举 undefined 属性 也不能用 delete 运算符来删除它 undef
  • linux各文件夹的作用是什么,linux各目录的作用

    关键字 linux 目录 linux各目录的作用 linux下的文件结构 看看每个目录都是干吗用的 bin 二进制可执行命令 dev 设备特别文件 etc 系统管理和设置文件 etc rc d 启动的设置文件和脚本 home 用户主目录的基
  • 剑指Offer第八和第九题:跳台阶和变态跳台阶以及拓展

    由于题目类似 这里总和一下 并进行拓展 目录 1 跳台阶 2 变态跳台阶 3 拓展篇 疯魔版跳台阶 题目一 题目二 1 跳台阶 题目描述 一只青蛙一次可以跳上1级台阶 也可以跳上2级 求该青蛙跳上一个n级的台阶总共有多少种跳法 先后次序不同
  • 苹果手机锁屏后无线重新连接服务器,iphone11锁屏自动断开wifi怎么办 苹果11手机热点自动断开解决方法...

    目前有着很多用户都在使用最新的iphone11这款手机 但是对于手机上的wifi热点网络却出现了不少的问题 比如iphone11锁屏自动断开wifi wifi热点自动断开 当遇到这些问题应该怎么办 如何才能解决呢 下面就和小编一起来看看吧
  • 基于SpringBoot 的报销系统

    视频展示 基于springboot的报销系统 项目定制 报销系统 哔哩哔哩 bilibili 技术 SpringBoot Html css 个人制作模块介绍 权限模块 前端权限模块 后端权限模块 登录监听 监听器 拦截器 业务流程 接口设计
  • nnU-Net团队新作MedNeXt:新一代医学图像分割之王,刷新多项榜单记录!

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 医疗影像和Transformer 微信技术交流群 转载自 CVHub Title MedNeXt Transformer driven Scaling
  • clamav的病毒库文件的文件头的信息说明(clamav版本号等)

    Author Samson Date 01 04 2022 在开源病毒检测工具clamav中 是通过对病毒库中的病毒特征值来进行对比的 病毒库文件存放于 var lib clamav目录下 主要是三个cvd文件 如下 bytecode cv
  • httpservletrequest_HttpServletRequest详解 外加请求转发和重定向口述讲解(五)

    点击上方 IT咸鱼 星标公众号 每天分享技术栈 开发工具等 续前篇 咳 今天家里停电电继续更新 每天坚持 前面我们说到response对象的用法和案列 接下来再说说Servlet Request对象用法和案例 1 ServletReques