背景简述

本人是一个自学一年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. Activiti工作流系统环境搭建

    一.创建Activiti工程,并导入Activiti包及数据库驱动包 二.用代码方式创建 流程引擎 1 @Test 2 public void createProcessEngineWithCode( ...

  2. 016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值

    016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值 本文知识点:字面值 关于字面值的概念,需要注意:很多地方,我们可能就把字面值 ...

  3. 04 sublime text 3在线安装package control插件,之后安装主题插件和ConvertToUTF8 插件

    前提:需要@@科学@@上网 在线安装包通常都需要@@科学@@上网 安装package control插件 在线安装package control插件 按ctrl+shift+p 输入install,选 ...

  4. 02 sublime text3下配置Python的编译运行环境

    内容参考如下文章,加入了自己的干货: https://www.cnblogs.com/huluwahaha/p/7503930.html 在sublime中如何配置Python的编译环境呢? 打开Su ...

  5. 温湿度传感器DHT11程序示例

    DHT11概述 HT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器. 它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性.传感器包括一个电阻式 ...

  6. JavaScript打印给定区间年份的闰年

    要求: 用户输入需要判断的年份区间,开始年份和结束年份,输出该区间内所有的闰年. 代码实现: function isRunYear(year) { // 是闰年返回true,否则返回false var ...

  7. 创建好maven项目以后发现无法创建scala文件

    今天创建了一个maven项目  然后准备创建scala文件的时候发现没有Scala 然后只好上网上找方法了 下面是一种解决方法 1.点击file,选择settings 进去之后,选择build  进去 ...

  8. es使用--新建、删除、增删改数据

    # 进入bin目录 cd /czz/elsearch/bin # 后台启动(不加-d参数则是前台启动,日志在控制台) # 后台启动日志如果不配置,在es目录的logs下面 ./elasticsearc ...

  9. git fatal: Path 'XXX' is in submodule 'XXX'错误

    easyswoole项目的 vendor/easyswoole/socket/这个项目怎么都无法添加到git目录里面. 报错: Administrator@PhpServer MINGW64 /z/w ...

  10. 多测师讲解 _requests安装问题解决_高级讲师肖sir

    步骤一:"dos下新建一个pip文件,在文件下建一个pip.ini 文件,步骤二:文件中内容[global]index-url=http://mirrors.aliyun.com/pypi/ ...