背景简述

本人是一个自学一年Java的小菜鸡,理论上跟大多数新手的水平差不多,但我入职的新公司是要求转Clojure语言的。坊间传闻:通常情况下,最好是有一定Java的开发工作经验,再转CLojure可能容易一些。我入职后的实际经历也确实让我感受到了Clojure的自学难度略大于自学Java,遇到的困难主要与中文资料较少有关,具体为:

1 中文的面向新手的较为系统的教程材料较少,目前个人感觉最好用的还是《CLojure编程 Emerick著》这本书,网上应该很好找,如果大家没有电子版的话可以留言,我看到后就立刻分享给大家

2 中文的网上相关问题和讨论较少, 以前学Java的时候基本遇到的问题用百度就能解决,现在大概率要直接用bing或谷歌,或者直接在stackoverflow(虽然是英文的,但貌似是最好用的IT问答网站)上查

我的这个系列笔记主要是基于 0工作经验的后端开发转学Clojure 的场景下完成的,里面有一些个人观点和个人理解的注释,写的时候是为了便于自己理解相关的概念,现在分享出来一方面是希望能帮助像我一样的新手更好地理解,另一方面也是希望有高手能够发现错误并帮忙斧正,谢谢

一些格式的简单约定:

粗体:比较重要的内容

斜体:我个人理解/观点或是补充内容,大家选择性食用

P15:表示书上第15页

第16章 Clojure与web

16.1 术语

16.2 Clojure栈

Clojure设计原则:相比具体类型和实现细节更强调共同的抽象,相比带可变状态的有副作用的方法更强调不可变数据的纯函数,把这些纯函数灵活组合、形成自身也是可靠的构建材料

Clojure中的web开发是没有技术栈一说的,而是通过灵活的组合搭出适合自己/团队的栈

Web应用程序包括三部分:

  1. 请求和应答处理部分:运行一个HTTP服务器,生成HTTP应答;Ring用于基础的请求和应答处理
  2. 路由:把请求传到指定的处理代码;Compojure用于路由
  3. 模板化:将函数的应答序列化为HTML等;EnLive用于模板化

16.3 基石:Ring

Ring规范用Clojure数据结构定义了一个标准的数据模式来表示web请求和应答,以及基于函数组合的一两个关键架构概念:适配函数、处理函数和中间件

16.3.1 请求与应答

Ring把请求和应答都表示为常规的Clojure映射(就是一个map),这些映射必须包含某些槽,可以包含其他槽,并且可以用来保存处理过程中所需的任何其他数据

Ring完全能够使用不要求主体的HTTP API调用

16.3.2 适配函数

得到表示请求的Ring映射、让服务器把Ring应答映射到合适的HTTP应答,提供这一特别胶和功能的就是适配函数

一个Ring适配函数在Ring应用和HTTP协议和/或服务器的本地具体实现之前起到桥梁作用,简言之,当接收到一个HTTP请求时,一个适配函数把它解构成一个请求映射,然后把它传给Ring应用程序等待处理,这个调用必须返回一个应答映射,适配函数用它向客户端传回一个HTTP应答

16.3.3 处理函数

处理函数就是接收一个请求映射为参数,并返回一个应答映射的函数,所有Ring应用程序由一组处理函数组成,这些函数被链接、组合,并根据需要被委托以支持所需的行为和功能

16.3.4 中间件

中间件是对处理函数的效果的任何增强或修改,比如Ring的请求默认不包含查询参数的任何结构化表示,通过加入一点中间件到应用程序中,可以改变这一点,中间件会装饰从Jetty适配函数接收到的请求映射

Ring的中间件与Java的servelet类似

16.4 用Compojure路由请求

通过URI分别吧请求处理委托给其他函数

16.5 使用模板

没看

16.5.1 EnLive:基于选择器的HTML转换

没看

16.6 最后的思考

由于函数式编程的特性,把非常简单、基本的函数编织成复杂的系统是非常简单的;Clojure Web开发当然不仅仅是Ring Compojure这些东西说了算,但是更大规模的框架都是基于这些基础构件之上的

《Clojure编程》笔记 第16章 Clojure与web的更多相关文章

  1. java JDK8 学习笔记——第16章 整合数据库

    第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...

  2. C#高级编程9 第16章 错误和异常

    C#高级编程9 第16章 错误和异常 了解这章可以学会如何处理系统异常以及错误信息. System.Exception类是.NET运行库抛出的异常,可以继承它定义自己的异常类. try块代码包含的代码 ...

  3. 20191105 《Spring5高级编程》笔记-第16章

    第16章 Web应用程序 16.3 MVC和Spring MVC介绍 16.3.3 Spring MVC WebApplicationContext层次结构 在Spring MVC中,Dispatch ...

  4. C++ primer plus读书笔记——第16章 string类和标准模板库

    第16章 string类和标准模板库 1. string容易被忽略的构造函数: string(size_type n, char c)长度为n,每个字母都为c string(const string ...

  5. 《python核心编程》读书笔记--第16章 网络编程

    在进行网络编程之前,先对网络以及互联网协议做一个了解. 推荐阮一峰的博客:(感谢) http://www.ruanyifeng.com/blog/2012/05/internet_protocol_s ...

  6. 《Javascript DOM编程艺术》学习笔记 第1-6章

    第1章 Javascript简史 Javascript是Netspace公司与Sun公司合作开发的,Javascript 1.0版于1995年推出. 为与微软公司竞争,Netspace公司和Sun公司 ...

  7. C#高级编程笔记之第二章:核心C#

    变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ...

  8. <NET CLR via c# 第4版>笔记 第16章 数组

    //创建一个一维数组 int[] myIntegers; //声明一个数组引用 myIntegers = new int[100]; //创建含有100个int的数组 //创建一个二维数组 doubl ...

  9. Java并发编程实战 第16章 Java内存模型

    什么是内存模型 JMM(Java内存模型)规定了JVM必须遵循一组最小保证,这组保证规定了对变量的写入操作在何时将对其他线程可见. JMM为程序中所有的操作定义了一个偏序关系,称为Happens-Be ...

随机推荐

  1. IPV6介绍已经IPV6改造基本步骤

    IPV6介绍 地址资源无限多 通常见到的124.33.24.116这种形式的是ipv4版本的地址,这种地址由32位二进制数表示. ipv6是一种新的ip地址的表示方式形如fc80::2367:7cff ...

  2. C++读写ini配置文件GetPrivateProfileString()&WritePrivateProfileString()

    转载: 1.https://blog.csdn.net/fengbingchun/article/details/6075716 2. 转自:http://hi.baidu.com/andywangc ...

  3. Bayer Pattern——RGGB

    原博客地址:https://blog.csdn.net/joe9280/article/details/46952947 参考:https://blog.csdn.net/wgx571859177/a ...

  4. 深入浅出学Java-HashMap

    一.概要 HashMap在JDK1.8之前的实现方式 数组+链表,但是在JDK1.8后对HashMap进行了底层优化,改为了由 数组+链表+红黑树实现,主要的目的是提高查找效率. 如下图所示: JDK ...

  5. win10 home安装docker快速攻略

    本文适用于win10 Home用户,专业版和企业版直接见官网.win7版本见Docker Toolbox. 安装清单 软件 说明 Docker Desktop Installer 步骤介绍页:http ...

  6. JVM 第六篇:极致优化 IDEA 启动速度

    本文内容过于硬核,建议有 Java 相关经验人士阅读. 1. 引言 相信做 Java 开发的同学,对 IDEA 这个工具应该都不陌生,即使不使用 IDEA 做开发,那么对 Eclipse 这个工具应该 ...

  7. Verilog基础入门——Vivado流水灯工程(四)(实验报告)

    今日进行了数字逻辑实验,完成了一个最简单的FPGA设计,即流水灯设计. 此处记录我们的指导文件以及实验报告,同时记录遇到的问题及解决方法. 一.vivado工程源文件编写 counter.v文件 `t ...

  8. ps 树形显示

    ps -axjf|grep swoft

  9. spring boot:使用分布式事务seata(druid 1.1.23 / seata 1.3.0 / mybatis / spring boot 2.3.2)

    一,什么是seata? Seata:Simpe Extensible Autonomous Transcaction Architecture, 是阿里中间件开源的分布式事务解决方案. 前身是阿里的F ...

  10. jquery1.9+,jquery1.10+ 为什么不支持live方法了?

    live() 替换成 on() die()  替换成off() 根据jQuery的官方描述,live方法在1.7中已经不建议使用,在1.9中删除了这个方法.并建议在以后的代码中使用on方法来替代. o ...