总结29 WEB服务器中HTTP的Request对象和BeanUtils之应用

HTTP应用

概念

HTTP继承自GenericServlet实现类,而GenericServlet则实现了Servlet接口。
因此从不严格的意义上来讲,属于Servlet的分支,因此全称为’HttpServlet‘
HTTP是WEB服务的一种,我相信我不必多讲了。

创建和使用

创建方式一:手动创建
步骤一:创建一个类,继承实现类‘HttpServlet’
并按Alt+回车重写两个方法,分别为’doPost‘和’doGet’
步骤二
在WebServlet注解处声明一个’loadOnStartup‘属性或者’value‘属性来定义虚拟路径

创建方式二(推荐)IDEA快捷生成
步骤一:选择一个作为包名,右键单击,选择’new’,再单击‘Servlet‘
接着会弹出一个对话框,让你设置类名,默认点OK就行。
步骤二
在WebServlet注解处声明一个’loadOnStartup‘属性或者’value‘属性来定义虚拟路径
在这里插入图片描述
在这里插入图片描述

doGet类方法

用于请求和响应,如果客户请求(即访问)的类型为get,那么将会触发或用到该方法
当你访问指定的虚拟路径时,将会触动该方法
在这里插入图片描述

doPost类方法

同样也用于请求和响应,如果客户请求(即访问)的类型为post,那么将会触发或用到该方法
在这里插入图片描述

请求行/请求头/请求体

大致概念

请求信息是HTTP理论的核心,它分为请求行/请求头/请求体,当你浏览网页时,基本每个数据包都有这种信息。

请求行的概念

请求行如果要具体归纳,是服务器专门获取的信息,比如它能够获取配置项目中的虚拟目录等等

请求头的概念

用于获取用户的一些HTTP版本协议,以及浏览器等相关信息
在这里插入图片描述

请求体的概念

用于获取用户从浏览器提交给服务器的信息
只有在POST方式的情况下,才能获取请求体
在这里插入图片描述

request和response对象

request和response是HttpServlet中的一个封装对象
request和response对象是由服务器创建的。
从大致的概念来讲,request对象是来获取客户从浏览器发来的请求消息,response对象来设置响应消息。
在这里插入图片描述

request对象的概念与应用

在这里插入图片描述

概念

request是HttpServlet体系中的一个对象,准确来讲,request就是HttpServletRequest,而HttpServletRequest不仅仅是个接口,还继承了ServletRequest接口中的方法。
request对象中的方法可以对客户请求过来的请求行,请求头,请求体数据进行详细地获取(查看)
因此,它的应用于请求行,请求头,请求体。

请求行的方法应用

request中的方法可以应用于客户请求过来的请求行数据
话不多说,来看。
方法一. 获取请求方式
格式:String 自定义结果名 = request.getMethod();
列如:

    String methodGet = request.getMethod();

方法二.获取项目配置中的虚拟目录
注意,是获取项目配置中的虚拟目录,而不是WebServlet注解的虚拟目录
在这里插入图片描述
格式:String 自定义结果名 = request.getContextPath();
列如:

String inventedPath = request.getContextPath();

方法三.获取Servlet(注解)路径
这个是获取WebServlet注解所指定的虚拟路径名
格式:String 自定义结果名 = request.getServletPath();
列如:

String serverPath = request.getServletPath();

方法四.获取get请求方式的参数
注意:当请求方式为get(也就是doGet)时才会有效
格式:String 自定义结果名 = request.getQueryString();
列如:

String queryString = request.getQueryString();

方法五.获取所请求的URL
获取客户要请求的目标URL链接
格式:StringBuffer 自定义结果名 = request.getRequestURL();
列如:

StringBuffer requestUrl = request.getRequestURL();

方法六.获取所请求的URI
获取客户要请求的目标URI链接
注意,是URI,不是URL
URI和URL的区别在于,只会获取除域名外的路径
如:
请求URI为:/hexie/nihao
请求URL为:http://localhost:8080/hexie/nihao

格式:String 自定义结果名 = request.getRequestURI();
列如:

String requestUri = request.getRequestURI();

方法七. 获取协议(HTTP)及版本
格式:String 自定义结果名= request.getProtocol();
列如:

String protocol = request.getProtocol();

方法八.获取客户机的IP地址
格式:String 自定义结果名 = request.getRemoteAddr();
列如:

String remoteAddr = request.getRemoteAddr();

请求头的方法应用

获取请求头中的信息,可以应用于防盗链等等。
有两个方式,一个是单个获取,一个是返回成集合,
后者的集合只能获取头名,所以麻烦,现在用的不多。

方式一(推荐):根据请求头的名字,获取请求头的值
注意:请求头名必须全部为小写
格式:String 自定义结果名 = request.getHeader("请求头的名字");
列如:

String header = request.getHeader("user-agent");

方式二(不推荐):获取所有请求头的名字,返回成一个集合
格式:Enumeration<String> 自定义结果名 = request.getHeaderNames();
列如:

Enumeration<String> headerNames = request.getHeaderNames();
   		//default Iterator<E> asIterator​() 返回一个Iterator ,它遍历此枚举覆盖的其余元素。
        //boolean hasMoreElements​() 测试此枚举是否包含更多元素。
        //E nextElement​() 如果此枚举对象至少有一个要提供的元素,则返回此枚举的下一个元素。

请求体的方法应用

话不多说,所谓请求体,上面也讲了,此处讲的是如何获取用户从浏览器提交的数据(如表单)等。
请求体分为两种方式,一个是获取字符流的请求体,一个是获取字节流的请求体
这都属于IO流学过的知识,我就不多说了。
只有在POST方式的情况下,才能获取请求体
方式一:以字符流获取
格式:BufferedReader 自定义字符流请求体接收名 = request.getReader();
列如:

BufferedReader reader = request.getReader();

方式二:以字节流获取
格式:ServletInputStream 自定义字节流请求体接收名 = request.getInputStream();
列如:

ServletInputStream input = request.getInputStream();

请求体的其它方法

在关于请求体的方法中,实际上不仅仅能通过字节或字符流获取请求体的内容,也能通过其它方法直接获取。

【【【注意】】】准备工作:解决中文参数值乱码

如果请求体的参数为中文会存在乱码,在Tomcat8及以后的版本中,已经将get请求方式乱码问题解决了
但post方式依然存在乱码,因此需要进行编码转换。
在这里插入图片描述
设置参数值编码的固定格式request.setCharacterEncoding("utf-8");

方法一:根据请求体的参数名称获取参数值
格式:String 自定义结果接收名 = request.getParameter("欲获取请求体的参数名称");
列如:

String dateResult = request.getParameter("comment");

方法二:根据请求体的参数名称获取该符合条件名称的参数值,返回一个集合
当html文件中存在多个name属性值相同的参数标识时,又想都获取时,则使用该方法
在这里插入图片描述
格式:String[] 自定义结果接收名 = request.getParameterValues("pass");
列如:

 String[] passes = request.getParameterValues("pass");
        for (String pass : passes) {
            System.out.println(pass);
        }

方法三:获取所有请求体的参数名称,返回一个集合
格式:Enumeration<String> 自定义结果接收名 = request.getParameterNames();
列如:

   Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()){
            String s = parameterNames.nextElement();
            System.out.println(s);
        }

方法四:获取所有请求体的参数名称和其对应的参数值,返回一个map集合
格式:Map<String, String[]> 自定义结果接收名 = request.getParameterMap();
列如:

        Map<String, String[]> parameterMap = request.getParameterMap();
        for (String key : parameterMap.keySet()) {
            String[] values = parameterMap.get(key);
            System.out.println("键名:"+key);
            for (String value : values) {
                System.out.println("请求体名称:"+value);
            }
        }

请求转发

概念

转发是什么不用我说了吧,当初搞nginx时就研究了转发
具体来讲,就是当你访问某个页面时,该页面把网页跳转到了其它页面,但URL链接还是不变,还是原来页面的链接。
特点:
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中。
3. 转发是一次请求

创建格式一(繁琐,不推荐)

在这里插入图片描述
步骤一:通过request对象获取请求Dispatcher转发器对象
格式:RequestDispatcher 自定义dispatcher转发器对象名 = request.getRequestDispatcher("/被转发的虚拟路径");
列如:

RequestDispatcher dispatcherObj = request.getRequestDispatcher("/zhuanfaTwo");

步骤二:通过Dispatcher对象来进行转发
格式:自定义dispatcher转发器对象名.dispatcherObj.forward(request对象名,response对象名);
列如:

dispatcherObj.forward(request,response );

创建格式二(推荐,链式编程)

格式:request.getRequestDispatcher("/被转发的虚拟路径").forward(request对象名,response对象名);
列如:

 request.getRequestDispatcher("/zhuanfaTwo").forward(request,response);

在这里插入图片描述

共享数据

所谓共享数据,这是’请求转发’下的一种应用,
当’转发处页面’接收到了用户请求的信息数据了后,将其数据传递给’被转发的目标页面’.
那么此时,'被转发的页面’也可以使用’转发处页面’所获取到的用户请求数据了.
代码必须写在转发方法的前面.

创建与使用

步骤一:根据参数名,将欲获取参数值存储,并命名自定义的域对象名(在转发处页面定义)
格式:request.setAttribute("自定义存储域对象名",欲传递的任意类型的参数);
列如:

request.setAttribute("test",paramResult );

步骤二:根据’自定义存储域对象名’来接收转发处页面传递过来的参数(在被转发的目标页面定义)
格式:Object 自定义接收域对象的结果名 = request.getAttribute("欲接收的自定义域对象名");
列如:

Object test = request.getAttribute("test");

步骤三(可省略):删除存储域对象名
格式:request.removeAttribute("欲接收的自定义域对象名");

在这里插入图片描述

获取ServletContext

格式:ServletContext 自定义ServletContext对象名 = request.getServletContext();

BeanUtils的应用

概念

BeanUtils是一种用于封装HTTP信息的工具,它需要两个jar包,分别是
commons-beanutils-1.8.0.jarcommons-logging-1.2.jar
往常,当要对用户浏览器提交的表单(请求体)用于sql数据库的效验时,我们常常需要用到’getParameter’和用户对象的’setXXXX’方法来进行信息封装,这个过程未免过于麻烦.
而BeanUtils则简化了这一过程,能够简单地将用户浏览器提交的表单数据封装到(用户的)信息储存的对象中

但需要注意的是:由于是简化了封装过程,因此网页提交处的’name’属性值,必须同信息存储对象的成员变量名一样
在这里插入图片描述

BeanUtils是什么?有什么用?Apache基金提供的一个用来封装JavaBean对象的一个工具。

​ JavaBean: Java(咖啡名) Bean(豆子)

​ 就是Java语言中最基本的数据结构,用来存储数据。

​ 怎么样定义JavaBean:

​ 1、public修饰的

​ 2、必须有public的无参构造(方便创建JavaBean)

​ 3、所有的成员变量需要私有(保存数据、封装的特性)

​ 4、根据需要提供公有的get/set方法

​ BeanUtils就是一个可以帮助我们把数据填充到JavaBean的一个工具(利用了get/set)

​ 方法:

​ setProperty(Object obj, String 属性名, Object 属性值)

​ Object 属性值 = getProperty(Object obj, String 属性名)

​ populate(Object obj, Map map)

使用步骤

步骤一 导入commons-beanutils-1.8.0.jarcommons-logging-1.2.jar这两个Jay包

步骤二 以集合地形式获取其请求体的数据
格式:Map<String, String[]> 自定义结果接收名 = request.getParameterMap();
列如:

Map<String, String[]> mapResut = request.getParameterMap();

步骤三 将集合中的请求体参数数据加入到指定的信息储存对象中
格式: BeanUtils.populate(指定的信息储存对象,自定义结果接收名);
列如:


        try {
            BeanUtils.populate(userObj,mapResut);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值