背景简述

本人是一个自学一年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. Onethink 前台编辑器调用

    比较偷懒的调用方式 <textarea name="content"></textarea> {:hook('documentEditFormContent ...

  2. Book of Shaders 04 - 网格噪声:Worley Noise

    0x00 思路 假设要生成 4 个网格,可以先在空间中指定 4 个特征点.对于每个像素点,计算它到最近特征点的距离,将这个距离当作结果值输出. #ifdef GL_ES precision mediu ...

  3. JDK1.8新特性之(三)--函数式接口

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  4. matlab中nargin函数输入参数数目

    来源:https://ww2.mathworks.cn/help/matlab/ref/nargin.html?searchHighlight=nargin&s_tid=doc_srchtit ...

  5. DORIS系统概述

    DORIS(Doppler Orbitography and Radio-positioning Integrated by Satellite)(多普勒轨道学与无线电定位集成卫星),它是由法国Cne ...

  6. Hadoop理论基础

    Hadoop是 Apache 旗下的一个用 java 语言实现开源软件框架,是一个开发和运行处理大规模数据的软件平台.允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理.   特性:扩 ...

  7. 多测师讲解python _string_高级讲师肖sir

    import stringprint (string.ascii_letters )#大小写英文:'#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW ...

  8. Linux Centos7 安装Docker-CE

    先确保yum 是最新版本 执行: sudo yum update 添加docker源地址 sudo yum-config-manager --add-repo https://download.doc ...

  9. 换掉7z-zip默认的ico图标,自定义压缩文件图标更美观。

    下图就是7z官网源代码里面的ico文件,如果有条件自己编译,可以直接替换下面的图标,然后编译一个你自己的7z工具就行.不过我比较懒,还是通过修改注册表的方式改成别的ico图标吧. 源码和可执行程序下载 ...

  10. Django基础之Ajax

    知识预览 Ajax前戏:json Ajax简介 Jquery实现的ajax JS实现的ajax Ajax前戏:json 什么是json? 定义: JSON(JavaScript Object Nota ...