当前位置: 首页 > news >正文

那个网站点击率高多少钱做网站

那个网站点击率高,多少钱做网站,今天的新闻热点,wordpress去掉页面中的标题Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写IOC容器——BeanFactory和FactoryBean 第六章 Spring之假如让你来写IOC容器——Scope和属性填充 第七章 Spring之假如让你来写IOC容器——属性填充特别篇SpEL表达式 第八章 Spring之假如让你来写IOC容器——拓展篇 第九章 Spring之源码阅读——环境搭建篇 第十章 Spring之源码阅读——IOC篇 第二部分——AOP篇 第十一章 Spring之不太熟的熟人——AOP 第十二章 Spring之不得不了解的内容——概念篇 第十三章 Spring之假如让你来写AOP——AOP联盟篇 第十四章 Spring之假如让你来写AOP——雏形篇 第十五章 Spring之假如让你来写AOP——Joinpoint连接点篇 第十六章 Spring之假如让你来写AOP——Pointcut切点篇 第十七章 Spring之假如让你来写AOP——Advice通知上篇 第十八章 Spring之假如让你来写AOP——Advice通知下篇 第十九章 Spring之假如让你来写AOP——番外篇Spring早期设计 第二十章 Spring之假如让你来写AOP——Aspect切面篇 第二十一章 Spring之假如让你来写AOP——Weaver织入器篇 第二十二章 Spring之假如让你来写AOP——Target Object目标对象篇 第二十三章 Spring之假如让你来写AOP——融入IOC容器篇 第二十四章 Spring之源码阅读——AOP篇 第三部分——事务篇 第二十五章 Spring之曾经的老朋友——事务 第二十六章 Spring之假如让你来写事务——初稿篇 第二十七章 Spring之假如让你来写事务——铁三角篇 第二十八章 Spring之假如让你来写事务——属性篇 第二十九章 Spring之假如让你来写事务——状态篇 第三十章 Spring之假如让你来写事务——管理篇 第三十一章 Spring之假如让你来写事务——融入IOC容器篇 第三十二章 Spring之源码阅读——事务篇 第四部分——MVC篇 第三十三章 Spring之梦开始的地方——MVC 第三十四章 Spring之假如让你来写MVC——草图篇 第三十五章 Spring之假如让你来写MVC——映射器篇 第三十六章 Spring之假如让你来写MVC——拦截器篇 第三十七章 Spring之假如让你来写MVC——控制器篇 第三十八章 Spring之假如让你来写MVC——适配器篇 第三十九章 Spring之假如让你来写MVC——番外篇类型转换 第四十章 Spring之假如让你来写MVC——ModelAndView篇 第四十一章 Spring之假如让你来写MVC——番外篇数据绑定 第四十二章 Spring之假如让你来写MVC——视图篇 第四十三章 Spring之假如让你来写MVC——上传文件篇 第四十四章 Spring之假如让你来写MVC——异常处理器篇 第四十五章 Spring之假如让你来写MVC——国际化篇 第四十六章 Spring之假如让你来写MVC——主题解析器篇 第四十七章 Spring之假如让你来写MVC——闪存管理器篇 第四十八章 Spring之假如让你来写MVC——请求映射视图篇 第四十九章 Spring之假如让你来写MVC——番外篇属性操作 第五十章 Spring之假如让你来写MVC——融入IOC容器篇 第五十一章 Spring之源码阅读——MVC篇 文章目录 Spring源码阅读目录第一部分——IOC篇第二部分——AOP篇第三部分——事务篇第四部分——MVC篇 前言尝试动手写IOC容器第三十二版 拦截器拦截器接口改造映射器改造DispatcherServlet测试 总结 前言 对于Spring一直都是既熟悉又陌生说对它熟悉吧平时用用没啥问题但面试的时候被问的一脸懵逼就很尴尬都不好意思在简历上写着熟悉Spring了 所以决定花点时间研究研究Spring的源码。主要参考的书籍是《Spring源码深度解析第2版》、《Spring揭秘》、《Spring技术内幕深入解析Spring架构与设计原理第2版》 书接上回在上篇 第三十五章 Spring之假如让你来写MVC——映射器篇 中A君 已经实现了 映射器 部分的功能了。接下来看看 A君 会有什么骚操作吧 尝试动手写IOC容器 出场人物A君苦逼的开发、老大项目经理 背景老大 要求 A君在一周内开发个简单的 IOC容器 前情提要A君 已经实现了 映射器 部分的功能了 。。。 第三十二版 拦截器 今天刚一上班A君 就屁颠屁颠的跑到 老大 的办公室去炫耀自己的成果 “嗯。做的不错。不过还需要加点料” 老大 看着满脸兴奋的 A君 。悠悠说道 “加点料要加什么” A君 兴奋地逐渐消失一脸懵逼的问到 “你听说过 过滤器 吗” 老大 微笑着问道 “听说过过滤器 是 Servlet 规范中的一部分所有 Servlet容器 都必须实现。请求在到达 Servlet 之前或者响应返回客户端之前都会经过 过滤器 进行处理。如果 过滤器 处理不通过它可以阻止请求继续往下处理” A君 回答道 “不错现在要加的料和 过滤器 效果差不多只是是框架层面的。叫做 拦截器。” 老大 说到 “为什么有 过滤器 之后还需要 拦截器 呢” A君 提出疑问 “问得好原因其实也很简单。过滤器 是 Servlet容器 的行为发生在 Servlet 之前那么就以为这它无法获取框架中的内容无法进行更细致的拦截。” 老大 笑着说道 “原来如此” A君 恍然之前一直存在的疑问被 老大 三言两语就解开了 “去吧这东西并不难我希望今天就能看到成果” 老大 大手一挥开始下逐客令 拦截器接口 “OK” A君 也爽快的回答道离开办公室回到自己的工位上。A君 想都没想就开始撸代码因为像这种提供拓展的功能A君 只需要提供接口就行具体内容由用户实现即可。A君 新增 HandlerInterceptor接口代码如下 /*** 拦截器接口*/ public interface HandlerInterceptor {/*** 方法执行前调用** param request* param response* param handler* return* throws Exception*/default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {return true;}/*** 方法执行后调用** param request* param response* param handler* throws Exception*/default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {}/*** 请求完成时调用不管成功还是失败** param request* param response* param handler* param ex* throws Exception*/default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {} }好了接口定义了完成了。不过要如何执行它的实现呢老大 之前提到和 过滤器 类似说起 过滤器A君 其实并不算陌生之前有折腾过 Tomcat知道其大致的运行流程。这里又得涉及到一个设计模式——责任链。这个模式也好理解就像 A君 平时想请个假OA上需要经过层层审批层层回复一样 #mermaid-svg-hQT1xdWxookdZit8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hQT1xdWxookdZit8 .error-icon{fill:#552222;}#mermaid-svg-hQT1xdWxookdZit8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hQT1xdWxookdZit8 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-hQT1xdWxookdZit8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hQT1xdWxookdZit8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hQT1xdWxookdZit8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hQT1xdWxookdZit8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hQT1xdWxookdZit8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hQT1xdWxookdZit8 .marker.cross{stroke:#333333;}#mermaid-svg-hQT1xdWxookdZit8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hQT1xdWxookdZit8 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hQT1xdWxookdZit8 .cluster-label text{fill:#333;}#mermaid-svg-hQT1xdWxookdZit8 .cluster-label span{color:#333;}#mermaid-svg-hQT1xdWxookdZit8 .label text,#mermaid-svg-hQT1xdWxookdZit8 span{fill:#333;color:#333;}#mermaid-svg-hQT1xdWxookdZit8 .node rect,#mermaid-svg-hQT1xdWxookdZit8 .node circle,#mermaid-svg-hQT1xdWxookdZit8 .node ellipse,#mermaid-svg-hQT1xdWxookdZit8 .node polygon,#mermaid-svg-hQT1xdWxookdZit8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hQT1xdWxookdZit8 .node .label{text-align:center;}#mermaid-svg-hQT1xdWxookdZit8 .node.clickable{cursor:pointer;}#mermaid-svg-hQT1xdWxookdZit8 .arrowheadPath{fill:#333333;}#mermaid-svg-hQT1xdWxookdZit8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hQT1xdWxookdZit8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hQT1xdWxookdZit8 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-hQT1xdWxookdZit8 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-hQT1xdWxookdZit8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hQT1xdWxookdZit8 .cluster text{fill:#333;}#mermaid-svg-hQT1xdWxookdZit8 .cluster span{color:#333;}#mermaid-svg-hQT1xdWxookdZit8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hQT1xdWxookdZit8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 请假 同意 同意 同意 回复 回复 回复 回复 A君 项目经理 部门经理 技术总监 结束 每一层都得同意这个假才算请成功但凡有一个不同意这个假就算是请失败了。值得注意的是请假流程申请的时候是从前往后而回复的时候却是从后往前的。责任链 与之类似既然如此那么 拦截器 也就好办了只要把 拦截器 整合成一个链表就可以了。A君 添加HandlerExecutionChain类代码如下 /*** 请求处理链*/ Getter public class HandlerExecutionChain {/*** 控制器*/private final Object handler;/*** 拦截器集合*/private final ListHandlerInterceptor interceptorList new ArrayList();private int interceptorIndex -1;/*** 正向处理类似与请假申请流程** param request* param response* return* throws Exception*/boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {for (int i 0; i this.interceptorList.size(); i) {HandlerInterceptor interceptor this.interceptorList.get(i);if (!interceptor.preHandle(request, response, this.handler)) {//返回false直接调用完成方法triggerAfterCompletion(request, response, null);return false;}this.interceptorIndex i;}return true;}/*** 反向处理类似与请假回复流程** param request* param response* throws Exception*/void applyPostHandle(HttpServletRequest request, HttpServletResponse response)throws Exception {for (int i this.interceptorList.size() - 1; i 0; i--) {HandlerInterceptor interceptor this.interceptorList.get(i);interceptor.postHandle(request, response, this.handler);}}/*** 反向处理类似与请假回复流程** param request* param response* throws Exception*/void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, Exception ex) {for (int i this.interceptorIndex; i 0; i--) {HandlerInterceptor interceptor this.interceptorList.get(i);try {interceptor.afterCompletion(request, response, this.handler, ex);} catch (Throwable ex2) {ex2.printStackTrace();}}}//其他方法省略 }改造映射器 确实如 老大 所说拦截器 就这么点东西没啥难度的。现在还需要改下 映射器 的返回值了之前是直接返回HandlerMethod现在得返回HandlerExecutionChain了改动如下 AbstractHandlerMapping也做个简单的改动需要把配置的 拦截器 添加到HandlerExecutionChain中如下 改造DispatcherServlet 现在基本改造完了还需要个添加 拦截器 的入口只需要扫描类是否实现了对应接口就行了。DispatcherServlet改动如下 测试 好嘞现在一切都准备就绪了。可以开始准备测试了其他内容还是不需要改动。只需要新增一个 拦截器 即可A君 新增MyInterceptor。代码如下 public class MyInterceptor implements HandlerInterceptor {// 在请求处理前执行Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(Pre-handle: request.getRequestURI());request.setAttribute(message, Add Interceptor);return true;}// 在请求处理后视图渲染前执行Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(Post-handle: request.getRequestURI());}// 在请求完全处理完后执行Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) throws Exception {System.out.println(After completion: request.getRequestURI());} }添加测试代码如下 Testpublic void v32() throws Throwable {System.out.println(############# 第三十二版 拦截器篇 #############);Tomcat tomcat new Tomcat();//设置端口tomcat.setPort(8082);//设置静态资源路径String webApp new File(src/main/resources/v32).getAbsolutePath();tomcat.addWebapp(/test/, webApp);tomcat.start();//挂起tomcat.getServer().await();}测试结果如下 前台成功返回后台也成功打印。拦截器 也就这么完成啦。OK起码今天可以交差了看看 老大 明天还有什么想法吧 总结 正所谓树欲静而风不止欲知后事如何请看下回分解(✪ω✪)
http://www.dnsts.com.cn/news/156921.html

相关文章:

  • 整套网站设计大专软件技术好就业吗
  • 淘客怎么做自己的网站深圳20网络推广
  • 网站开发工作室挣钱吗网站建设需要工作计划
  • 网站设计 扁平化石油网站编辑怎么做
  • 建设医院官方网站简述营销型网站开发流程图
  • 做网站需要注册公司江西省建设招标网站
  • 开发一个网站系统报价义乌网站建设郭
  • 网站建设公司合同模板下载天津营销型网站建设
  • 重庆商城网站开发移动网站建设生要女
  • 白山网站seo网站 配色表
  • 推广普通话调查问卷成都网站关键字优化
  • 潍坊网站外包网站是否被k
  • 网站开发的开题报告模板假山网站如何做
  • 怎么免费增加网站流量吗开发平台英文
  • wordpress自定义布局淘宝seo排名优化的方法
  • 网站的售后服务官方模板
  • 如何设计旅游网站响应式网站算几个页面
  • 有哪些企业有网站有哪些类型域名服务器上存放着internet主机的
  • 网站建设功能需求seo是什么姓氏
  • 重庆模板网站建设怎么样秦皇岛做网站的公司选汉狮
  • 如何做网站授权网站前端开发语言
  • 地方门户网站如何推广东省住房和城乡建设厅网站
  • 温岭专业营销型网站建设地址网站建设教程pdf
  • 提供有经验的网站建设建网站公司成都
  • 做网彩网站dnf做任务解制裁的网站
  • 公司网站怎么关闭建筑工程人才网
  • 建行个人余额查询网站山东营销网站建设设计
  • 三亚旅游网站建设网站产品展示单页模板
  • 威海网站建设公司排名河南app外包
  • 餐饮网站建设公司可以使用ftp的网站