Total Pageviews

Wednesday, 4 December 2013

利用基于java+clojure的Web框架Luminus搭建静态博客网站

首先下载一个脚本lein(https://raw.github.com/technomancy/leiningen/stable/bin/lein)并把它放到你的环境变量里,我直接把它丢到了/usr/local/bin下面,然后在命令行下运行lein self-install命令,就会自动下载一个leiningen-2.x.x-standalone.jar等的jar包到$USER_HOME/.lein/目录下,非常方便。我最开始使用它的1.7版本的时候,还要自己下载和配置。

Web框架Luminus(http://www.luminusweb.net/),可以非常方便地帮我们生成Web工程的框架代码,只需要执行一条命令就可以在当前目录生成一个叫myapp的工程目录:
lein new luminus myapp

myapp的目录结构如下:

$ tree myapp/
myapp/
├── Procfile
├── README.md
├── project.clj
├── resources
│   └── public
│       ├── css
│       │   └── screen.css
│       ├── img
│       ├── js
│       └── md
│           └── docs.md
├── src
│   └── myapp
│       ├── handler.clj
│       ├── repl.clj
│       ├── routes
│       │   └── home.clj
│       ├── util.clj
│       └── views
│           ├── layout.clj
│           └── templates
│               ├── about.html
│               ├── base.html
│               └── home.html
└── test
    └── myapp
        └── test
            └── handler.clj

其中project.clj是类似Maven的pom.xml的文件,唯一区别的是使用Clojure的语法来组织管理,定义了工程名称、版本、描述以及依赖关系,使用到的lein插件等,在运行时也像Maven一样自动到仓库里下载依赖的组件。

一些基础的框架像lib-noir、compojure等都已加进来了,插件用了lein-ring,可以用来启动、打包。
resource/public目录下放的是静态的资源文件,像css、js,以及用到的图片文件、h2数据库文件等。
src目录下放的是源代码,其中repl.clj实现了应用的启动和停止以及资源文件所在目录的定义,就是上面提到的resource目录,基本不会动到这里的代码。handler.clj主要实现了对一个HTTP请求生命周期的管理,可以指定初始化信息,路由处理信息,以及自己实现的middleware。route/home.clj使用了Compojure里的路由功能把不同URI映射到不同的处理模块上。util.clj定义了一些工具函数。html源文件是放在views/templates下面,layout.clj主要调用模板引擎clabango实现模板的渲染,把动态内容转成静态html页面。

不用修改任何代码,我们在命令行执行lein ring server启动预览服务器,默认端口是3000,
 (如果遇到提示:
WARNING: You're currently running as root; probably by accident.
Press control-C to abort or Enter to continue as root.
Set LEIN_ROOT to disable this warning.
export LEIN_ROOT=1) 

如果想用其它端口可以在后面追加自定义端口号。启动后浏览器会自动打开默认主页,这在开发环境非常有用,但在服务器环境中因为没有桌面,会报错,可以使用如下命令来启动:
lein ring server-headless,也可以修改project.clj文件,把open-browser设置成true。第一次启动时会自动下载依赖的jar包.

(如果你服务器的3000端口被另一个程序占用了, 这条命令:lein ring server 会在3001端口启动预览服务器。)用nohup lein ring server > /dev/null &让命令在后台运行。

Luminus也提供了一个guestbook的演示代码,最好能看一下加深理解。

演示站点:as3.brite.biz:3001
项目地址:https://github.com/yogthos/luminus
https://github.com/yogthos/luminus-template
使用指南:
  1. HTML templating
  2. Accessing the database
  3. Serving static resources
  4. Setting response types
  5. Defining routes
  6. Adding middleware
  7. Sessions and cookies
  8. Security
  9. Deploying the application