javaweb 自动封装请求头中的数据(主文章的补充文章)
这是一篇对javaweb BaseServlet 自动封装数据并调用service方法中提到的内容的补充说明,由于篇幅太大单独拿出来说明
封装json数据 自动将json存入对应的实体类
前端除了传递请求类型,一般还会传递数据,比如将用户在页面表单填写的数据以json格式传给后端用于增删改查。
例图:VUE基于AXIOS实现异步请求,将json对象传给后端,json对象中存有请求类型type以及用户提交的表单数据
注意:该图仅用于说明json对象需要传递,下面说明文章主题时举例的是“修改”,不是这里图中的“添加”
传统的写法:
①在servlet中使用switch-case分配方法,此时与前端对接的servlet只是将编码格式进行一个设置,然后取出type判断需要执行的方法,直接将请求头和响应头发给当前servlet下的对应方法
②进入具体的方法后,才会正式开始解析请求头的数据,将数据取出存到一个实体对象中,然后再执行业务代码
新的写法:
现在新的写法中,希望做到的就是将各类方法中对请求头的数据解析和转换放回到servlet下,在servlet下完成数据的封装,然后再将对象和请求头、响应头传给方法。
实际上这也是实际的项目开发要做到的:
servlet作为控制层主要的工作就是数据处理,将请求头数据封装为对象,然后只传递对象给方法
方法实际都是存放在service下,只接受servlet发送的对象,然后进行逻辑处理,最后给servlet返回对象
例图:servlet只方法传递对象和一些数据,不传递请求头和响应头,而方法则将数据传给servlet,而不是直接用响应头去响应前端——响应交给servlet去完成。
注:这里的自定义注解用来标识当前方法的响应方法,用于父类servlet中的响应代码判断当前方法的数据回传给前端的方式,这个自定义注解的意思是“该方法的响应方式为AJAX”
因此要在父类servlet中实现自动对请求头的数据进行封装的功能,这样所有子类servlet都能具备这个功能
①实现了代码降重
②各子类servlet中更专注于对方法的调用,不再需要考虑对请求头的解析
③各子类servlet中的方法的参数表更规范——不再出现请求头和响应头
实现过程
- 首先判断此时读取到的方法参数需求是否是一个实体类,如果指向该参数类型的Class对象的全类名包含指定的地址,就表明是一个实体类
- 已知此时要处理的Class对象指向的是一个实体类对象,说明方法的参数表在此时需要传入一个实体对象,对应着前文即传入一个储存了json数据的对象
- 此时借助JAVA内置方法将json转为map集合,然后基于自定义工具类(实现原理为反射+泛型,具体原理点击这里)将数据封装为实体对象,然后存到数组中
上图的操作中有两个地方可以进一步优化
① clazz.getName().contains("常量") 这里是通过判断Class对象指向的数据类型的地址是否包含指定常量,以判断此时的Class对象是否指向的是方法中的实体类
这里的常量令整个方法存在局限性,如果方法需要的对象不在现在指定的常量路径呢 如果别人使用时包名叫bean呢
这种情况就要进行优化优化方式点击这里
②使用了自定义的工具类将map集合存入实体对象,实际上从json数据转为实体对象,只需要借助第三方jar包就能实现