javaweb 自动封装请求头中的数据(主文章的补充文章)

这是一篇对javaweb BaseServlet 自动封装数据并调用service方法中提到的内容的补充说明,因为篇幅太大单独拿出来讲明html

封装json数据 自动将json存入对应的实体类
前端除了传递请求类型,通常还会传递数据,好比将用户在页面表单填写的数据以json格式传给后端用于增删改查。前端

例图:VUE基于AXIOS实现异步请求,将json对象传给后端,json对象中存有请求类型type以及用户提交的表单数据
注意:该图仅用于说明json对象须要传递,下面说明文章主题时举例的是“修改”,不是这里图中的“添加”
imagejava

传统的写法:
①在servlet中使用switch-case分配方法,此时与前端对接的servlet只是将编码格式进行一个设置,而后取出type判断须要执行的方法,直接将请求头和响应头发给当前servlet下的对应方法
imageweb

②进入具体的方法后,才会正式开始解析请求头的数据,将数据取出存到一个实体对象中,而后再执行业务代码
imagejson

新的写法:
如今新的写法中,但愿作到的就是将各种方法中对请求头的数据解析和转换放回到servlet下,在servlet下完成数据的封装,而后再将对象和请求头、响应头传给方法。
实际上这也是实际的项目开发要作到的:
servlet做为控制层主要的工做就是数据处理,将请求头数据封装为对象,而后只传递对象给方法
方法实际都是存放在service下,只接受servlet发送的对象,而后进行逻辑处理,最后给servlet返回对象后端

例图:servlet只方法传递对象和一些数据,不传递请求头和响应头,而方法则将数据传给servlet,而不是直接用响应头去响应前端——响应交给servlet去完成。
注:这里的自定义注解用来标识当前方法的响应方法,用于父类servlet中的响应代码判断当前方法的数据回传给前端的方式,这个自定义注解的意思是“该方法的响应方式为AJAX”
image数组

所以要在父类servlet中实现自动对请求头的数据进行封装的功能,这样全部子类servlet都能具有这个功能
①实现了代码降重
②各子类servlet中更专一于对方法的调用,再也不须要考虑对请求头的解析
③各子类servlet中的方法的参数表更规范——再也不出现请求头和响应头异步

实现过程工具

  1. 首先判断此时读取到的方法参数需求是不是一个实体类,若是指向该参数类型的Class对象的全类名包含指定的地址,就代表是一个实体类
  2. 已知此时要处理的Class对象指向的是一个实体类对象,说明方法的参数表在此时须要传入一个实体对象,对应着前文即传入一个储存了json数据的对象
  3. 此时借助JAVA内置方法将json转为map集合,而后基于自定义工具类(实现原理为反射+泛型,具体原理点击这里)将数据封装为实体对象,而后存到数组中
    image

上图的操做中有两个地方能够进一步优化
① clazz.getName().contains("常量") 这里是经过判断Class对象指向的数据类型的地址是否包含指定常量,以判断此时的Class对象是否指向的是方法中的实体类
这里的常量令整个方法存在局限性,若是方法须要的对象不在如今指定的常量路径呢 若是别人使用时包名叫bean呢
这种状况就要进行优化优化方式点击这里优化

②使用了自定义的工具类将map集合存入实体对象,实际上从json数据转为实体对象,只须要借助第三方jar包就能实现