在这个框架充斥的年代,这个话题似乎没啥意义。我只是希望大家在使用框架的同时,不要忘记了解技术的原理,以至于遇到问题手足无措。其实我本人比较反框架的,因为大多数人容易陷入框架的细节,而忘记事情的本质。本文要实现的框架,虽说简单,但应用在日常项目还是绰绰有余的,而且可能会简单一些。文章有点长,后面有干货,稍微有点耐性哦~
首先我们探讨一下后台api的基本原理。当我们前端发起一个http请求,到达服务器,服务器对请求进行处理,返回处理结果。这个过程中,可能会经过一些代理,比如nginx,然后到达我们的http处理程序,诸如tomcat之类。Http处理程序会通过解析http请求数据,诸如url,参数之类,然后做出响应。关键来了,这里最重要就是对url的处理,然后识别不同的请求,当然你要喜欢也可以通过其他字段进行区分。那么所谓url的处理,其实就是字符串的处理。后台通过对字符串进行解析,然后分发到各个处理模块,诸如controller之类。嗯,所以现在我们要实现的第一步就是这个url的解析。
一般的url都是/xx/xx/xx的格式,现有框架对url的解析,大多都是按目录的,有点类似文件目录系统。这里为了简单,我们不区分目录,直接处理最后一个/后面的内容。实际上一级目录也可以满足所有场景,只要注意不重名就行了。这里还要先做一件事,就是如何拦截这个请求,不同的框架有不同的处理,这里以tomcat为例,我们可以在web.xml注册一个filter。
<filter>
<filter-name>requestFilter</filter-name>
<filter-class>com.melody.RequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <filter>
<filter-name>filter</filter-name>
<filter-class>com.melody.AjaxInterceptor</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>contentType</param-name>
<param-value>text/html;charset=UTF-8</param-value>
</init-param>
</filter>
最简单的判断方式当然是if(url.equals('xxx')),但是这样会有个问题,就是当你有上百个请求的时候,你的判断语句会很长,而且代码都写在一处,也不方便管理。于是我们会想到用个map存储url和对应的处理程序,这样看起来就优雅多了,诸如下面:
addHandler("login",new LoginHandler());
然后我们可能需要对请求做一些统一的处理,诸如判断登录态之类,这样我们就可以定义一个基类,在里面进行一些预处理。
好了,上面就是基本原理了。看到这里,你可能会觉得用现有ssh框架不就好了。区别在于,你能从更底层去处理你的请求,而且不需要引入一个庞大的框架,不需要为框架的某些bug而抓狂。下面是代码地址:
下篇文章我会介绍如何优雅的写一个sql语句并返回结果,像这样:
Map map=session.getSingleData("select * from user where (user_login=? or mobile=?) and user_pass=? and user_status=1", user, user, pwd);
本文由 melody 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2019/02/14 13:54