使用Clojure开发Web入门系列(四)

在(三)介绍并使用了Hiccup这个生成html的库,甚是方便,但是对于前后端分离的一些web站点也不是太方便。接下来介绍另外一种方法来渲染html页面,selmer。如果你是一个PHP程序员,那么你会发现他跟smarty有几分相似。 零、添加依赖 在project.clj的dependencies添加[selmer "1.11.8"] 一、修改代码 修改系列三里面的代码到selmer实现。 home 首先在resources目录下添加home.html,内容如下: <h1>Home</h1> 在resources目录添加是因为selmer默认会去classpath指定的路径里面找对应的模板文件。 修改core.clj,在:require后面添加selmer:[selmer.parser :refer [render-file]] 修改defroutes app,在添加一条路由规则: (GET "/home" [] (render-file "home.html" {})) 访问http://localhost:3000/home,可以看到html模板里面的内容已经显示出来了。如果没有运行程序请执行:lein run form 现在来修改表单页面,使用resources/index.html作为模板文件,内容如下: <!DOCTYPE html> <html> <body> <h1>Hello form</h1> <form action="/message" method="post"> <div> <label for="name">名字:</label> <input name="name" type="text" /> </div> <div> <label for="message">消息:</label> <textarea cols="80" name="message" rows="5"></textarea> </div> <div><input type="submit" value="提交" /></div> </form> </body> </html> 修改defroutes app里面"/"的定义为: (GET "/" [] (render-file "index.html" {})) 访问http://localhost:3000,表单出来了。 message 修改表单提交后的页面。 先在建立消息模板文件resources/message.html,内容如下: <!DOCTYPE html> <html> <body> <h2>{{ name }}</h2> <p>{{ message }}</p> </body> </html> {{ name }}和{{ message }}是占位符,selmer把render-file的第二个map参数解析到模板文件里面,{{ name }}对应的是:name的值。 ...

July 1, 2018

使用Clojure开发Web入门系列(三)

在使用Clojure开发Web入门系列(二)的最后做了一个动态输出hello+url参数的一个小demo,如果有很多这样的需求,不同的url调用不同的处理函数,那么就得在调用cond的地方写上很多条件,或者再写上另外一个函数专门处理这些条件,这就是web后端开发的路由组件。 Clojure方便的一点就在此,对于这个功能已经有一个非常强大而实用的类库来处理了,那就是compojure,这就是一个强大的Ring/Clojure路由处理库。 零、添加依赖 打开项目根目录下面的project.clj,在dependencies里面添加compojure的依赖[compojure "1.6.1"] 然后运行lein deps下载依赖包。 一、修改代码 修改core.clj,最后看起来像下面这样 (ns learnweb.core (:require [ring.adapter.jetty :refer [run-jetty]] [compojure.core :refer [defroutes GET]] ; (1) [compojure.route :refer [not-found]]) ; (2) (:gen-class)) (defroutes app (GET "/" [] "<h1>Hello world!</h1>") (GET "/hello/:name" [name] (str "Hello " name)) (not-found "<h1>Page not found</h1>")) ; (3) (defn -main "I don't do a whole lot ... yet." [& args] (run-jetty app {:port 3000})) ; (4) 相比之前的简洁不少。 (1) 引入宏defroutes和GET。defroutes定义路由列表。GET定义一条路由规则,说明此条规则只处理http的get请求(其他的有post, head, put, delete, option,详细内容请参考rfc2616 Method Definitions)。 ...

March 14, 2016

使用Clojure开发Web入门系列(二)

开发web应用当然少不了web服务器了,咱们这里使用是的ring这个库。 零、添加依赖 打开根目录下的project.clj,找到:dependencies。 :dependencies [[org.clojure/clojure "1.8.0"]] 有可能你看到的clojure版本跟我的不太一样,在里添加(ring)[https://github.com/ring-clojure/ring],添加后像下面这样 :dependencies [[org.clojure/clojure "1.8.0"] [ring "1.6.3"]] 然后在命令行运行: lein deps lein底层使用的是maven和(clojars)[https://clojars.org/],下载下来的依赖包会在你的用户目录下的.m2目录,下载的所有文件可以在~/.m2/repository/ring/ring/1.6.3/找到。如果你身在"赵国",那么你家里应该常备"楼梯"。 一、启动HTTP Server 打开src/learnweb/core.clj,这个是在project.clj里面的:main定义的入口点: (ns learnweb.core (:gen-class)) (defn -main "I don't do a whole lot ... yet." [& args] (println "Hello, World!")) 下面来改造一下core.clj文件,把需要的函数包含进代码,然后把http server跑起来,最终的代码如下: (ns learnweb.core (:require [ring.adapter.jetty :refer [run-jetty]]) ;(1) (:gen-class)) (defn handler [request] {:status 200 :headers {"Content-Type" "text/html"} :body "Hello World!"}) ;(2) (defn -main "I don't do a whole lot ... yet." [& args] (run-jetty handler {:port 3000})) ;(3) 改造了三个地方(1), (2), (3) ...

March 8, 2016

使用Clojure开发Web入门系列(一)

对于Clojure语言这里有一些很好的入门教程: Learn X in Y minutes Clojure - Functional Programming for the JVM Clojure koans 零、需要了解的知识 Web http Clojure Leiningen HTML Java 一、安装 首先Clojure是JVM上的Lisp方言,所以需要安装Java,可以去官方网站下载安装包,最好下载最新的JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html 安装完成之后需要打开命令行窗口看看是否可以执行java命令。 然后安装Leiningen,这个是项目的管理工具,可以管理依赖,编译工程,打包项目等等。可以参照 http://leiningen.org/#install 介绍的方法。 二、创建项目 lein new app learnweb cd learnweb 创建完成后目录结构应该像下面这样: ├── CHANGELOG.md ├── LICENSE ├── README.md ├── doc │ └── intro.md ├── project.clj ├── resources ├── src │ └── learnweb │ └── core.clj └── test └── learnweb └── core_test.clj 首先打开project.clj看一眼,这个文件就是定义项目的文件,同样也是使用的clojure的语法 (defproject learnweb "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.7.0"]] :main ^:skip-aot learnweb.core :target-path "target/%s" :profiles {:uberjar {:aot :all}}) 第一行里定义了项目名字learnweb,版本0.1.0-SNAPSHOT,这两个在打包的时候分体现在文件名上面。 :dependencies包含了项目执行时的所有依赖,后面添加第三方库的时候需要修改这里。 :main指明了程序的入口,是包learnweb.core的-main函数。 ...

March 7, 2016