1 2 3 4

自定义框架(4)

自此我们已经完成了我们自己的后端控制器,现在只需要在serviet中接收请求,然后派发给我们的后端控制器,

所以我由于用户发来的所有请求都由servlet中service方法接收,所以我们在servlet的service中将用户的请求经行具体的处理。

首先在service中实例化映射器和适配器

 

 

 

在service中我们使用request.getRequestURI()方法得到用户请求的全地址。此地址包含用户要项目名/资源名/

在使用request.getContextPath()方法得到项目名,

然后全路径使用replace()方法将项目名去掉,得到用户要访问的资源名

 

然后得到映射器里的两个map容器

先得到装有路径,和方法的map容器

使用map.keyset()方法将map中的key转成set集合。用一个字符串接收起来

循环此集合,判断集合中知否包含得到的资源名

也可以直接使用map.containskey()方法看map容器中是否包含得到资源名

如果set集合中没有这个资源名则返回一个404,没有此页面的网页。

如果set集合中含有资源名

那我们就可以将得到的资源名传给适配器,让适配器来完成资源名与方法的适配。

 

 在适配器中实例化映射器,因为我们需要使用到其中的map容器

 

 根据service传过来的资源名地址,我们使用资源名称在装有方法与路径的map容器中得到此路径对应的方法,

得到方法method后使用.getParameters()得到方法method的所有参数,得到一个参数的集合

接着使用request.getParameterMap()获取用户传跟在资源地址后面的键值对

得到一个map容器

 

接着我们就可以为调用方法准备参数了

首先我们创建一个集合将等会方法需要的参数放入此集合,集合长度为参数集合的长度

 

 接着我们循环方法参数的集合

 使用.getname()得到方法参数的名字

.gettype().getSimpleName()得到方法参数类型的类的简称

然后与一些常见的类型进行比较如果匹配成功就将此参数存到我们创建装方法参数的集合

 但是如果方法参数不是这些我们就得根据方法需要的参数类型,将用户传入过来的参数进行加工处理在交给方法处理

所以我们可以写一个工具处理用户传来的数据

工具需要接收方法参数和用户传入的键值对的value集合第一个值

将接收用户传入键值对的map容器.contain Key()方法判断用户传入键值对中的key是否包含要调用方法的参数名称如果含有则将此方法名称所对应的参数类型,和此方法名称所对应用户传入的value集合第一个值闯入工具方法中

在工具包中写一个方法接收适配器中传过来的方法参数类型,与对应的value值,

将方法参类型与所有类型进行匹配如果匹配成功,将value值强装为该类型并返回适配器,适配器将返回的值放入准备参数的集合中

 

 其中有一点如果方法参数为data类型,由于data类型的格式有很多种,我们需要将data转换为相应的格式

在参数值转换的工具包外增加一个时间格式转换的工具包datautil

 

创建一个data.properties文件里面放入需要的时间格式

在datautil中解析文件中时间格式

 

 在写一个方法对传过来的值进行转换相应的格式,并返回

自此已我们可以处理一些简单的请求

但是如果我们方法参数需要的是一个自定义对象我们还解决不了

所以我们还得添加一个如果方法参数为一个对象,我们需要把用户传入 的值处理成一个方法所需的对象,我们才能调用此方法

 

 

所以,作法:

如果参数类型是一个自定义对象,我i们使用反射的.newInstance()方法产生一个对象实例 obj,

再用.getDeclaredFields()方法得到对象所有的属性,得到一个属性的集合

循环属性集合,在每个属性前加上(参数的名称.)就得到了(对象.属性)的字段

【在前端设置map的key值时如果是对象可以设置为这(对象.属性)种格式以便得到对应的value】

然后拿到用户传入的键值对的map容器.containKey()方法判断是否包含刚刚得到的(对象.属性)字段

如果有取出map中字段(属性)对应的value值,

fields.setAccessible(true)破解方法的私有限制

调用set方法将取出的value值赋给字段(属性)

应为属性也需要不同类型所以可以调用我们的类型转换工具进行转换。

再将所有属性赋完值的obj放准备方法参数的集合

 

 

 

 准备方法参数阶段完成,接下来调用控制器方法,

调用方法需要两个参数,一个是方法所属的对象,和方法参数,

现在我们两个都有了

在放对象实例和路径的map容器中取出对应的象,

调用方法将对象与准备的方法参数集合参入method.invoke();返回值用Object接收,并将object返回给service

 

 

在service中得到适配器返回的object

然后在得到调用的方法,查看方法的注解,是要以什么类型返回给页面,是什么类型就将object转换为什么类型,返回前端页面

自此我们就可以将用户访问的分发到我们自己写的后端控制器处理并返回值的一整套流程。

在使用是用户只需要提供controller包就可以使用这个框架,

因为控制器只读controller下的类文件。

posted @ 2019-05-14 20:43  startscorpio  阅读(134)  评论(0编辑  收藏  举报