Defining routes
Luminus使用Compojure来定义应用的路由.路由由HTTP请求方法和接受它的URI,
参数和以及相应的处理程序组成。Compojure定义了所有标准HTTP请求的路由,
比如ANY,DELETE,GET,HEAD,OPTIONS,PATCH,POST和PUT。
例如:如果我们想定义一个应用,它指向/,/返回"Hello World!"字符串。我们
可以这样写:
(defroutes app-routes
(GET "/" [] "Hello World!"))
如果你想构建一个路由来响应POST请求,我们可以这样写:
(POST "/hello" [id] (str "Welcome " id))
有些路由需要访问请求的map,我们只需要在路由上定义第二个参数就可以了。
(GET "/foo" request (interpose ", " (keys request)))
上面的路由读出请求map中所有的key并展示出来。结果如下:
:ssl-client-cert, :remote-addr, :scheme, :query-params, :session, :form-params,
:multipart-params, :request-method, :query-string, :route-params, :content-type,
:cookies, :uri, :server-name, :params, :headers, :content-length, :server-port,
:character-encoding, :body, :flash
Compojure还提供了一些有用的函数来处理请求map和表单参数。例如,在
guestbook应用的例子中,我们看到了如下的路由定义:
(POST "/" [name message] (save-message name message))
Summary
ClojureScript可以作为JavaScript在客户端的替代品。使用ClojureScript可以
有如下有点:
- 在客户端和服务端使用相同的语言
- 在前后端共用相同的代码
- 简介流畅的语言
- 使用Leiningen管理依赖关系
- 不可变数据
- 功能强大的库
- Adding ClojureScript Support
最简单的添加ClojureScript支持的方法就是在创建新项目的时候添加+cljs选项
。不过在现有的项目中添加ClojureScript也同样的简单。你只需要在
project.clj文件中添加如下内容即可。
:plugins [...
[lein-cljsbuild "0.3.0"]]
:hooks [... leiningen.cljsbuild]
:cljsbuild
{:builds [{:source-paths ["src-cljs"]
:compiler {:output-to "resources/public/js/site.js"
:optimizations :advanced}}]}
上面的代码将在项目中添加cljsbuild插件和一个钩子。
所有的命名空间需要在项目根目录下的src-cljs目录内。注意,ClojureScript
文件需要以.cljs结尾。如果文件以.clj结尾,它也会被编译,不过它就无法访
问js命名空间。
Using Libraries
使用ClojureScript的一个好处就是你可以使用Leiningen来管理客户端的依赖。
ClojureScript库和其他库一样都配置在project.clj文件中。
Templating Options
Luminus包含了Hiccup的依赖.如果你熟悉Hiccup那么可以直接使用。
Hiccup使用clojure数据结构来描述模板。并且,Hiccup提供了丰富的API来生成
HTML元素。 Luminus也包含了Selmer,Selmer使用了普通的文本文件来描述模板。
你可以使用它们中的任何一个模板,或者混合使用.抑或你可以选择任何你喜欢
的模板框架,比如Enlive或者Stencil。
HTML Templating Using Selmer
Selmer是一个类似Django模板的框架。如果你熟悉Django或者其他类似的模板语
言,那么你会感觉很熟悉.
Creating Templates
Selmer将展示逻辑和程序逻辑分开。实际上Selmer模板就是包含了动态元素的
HTML文件。来看下面的例子。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>My First Template</title>
</head>
<body>
<h2>Hello { {name}}</h2>
</body>
</html>
模板使用了一个包含了键值对的上下文环境。上下文环境中包含了我们
需要在运行时获得的变量的值。上面的代码中,我们从上下文环境中获取名字为
name的变量的值。
有两个函数可以渲染模板,render和render-file。render函数接收一个字符串来
渲染模板。而render-file接收一个字符串作为路径来渲染模板。
如果我们将上面的模板定义保存到index.html文件中。我们就可以这样来渲染:
(ns example.routes.home
(:use [selmer.parser :only [render-file]]))
(defn index [request]
(render-file "example/views/templates/index.html"
{:name "John"}))
Profiles
使用lein new luminus myapp命令会创建一个新的luminus应用,它使用的是默认的配置。如果你想使用其他的特性,你可以修改相应的配置参数。
下面就是各个配置:
- +cljs - 添加ClojureScript支持
- +cucumber - 提供通过clj-webdriver配置cucumber
- +h2 - 添加models.db并提供H2数据库依赖
- +postgres - 添加models.db并提供PostreSQL数据库依赖
- +mysql - 添加models.db并提供mysql依赖
- +mongodb - 添加db.core并提供MongoDB依赖
- +site - 创建一个包含注册和验证框架的应用。使用bootstrap和h2
- +dailycred -
添加dailycred支持,当和+site参数配合使用时,它使用dailycred作为验证框架
- +http-kit - 添加HTTP Kit支持
要添加配置,只需要简单的添加到你的应用的名字后面,比如:
lein new luminus myapp +cljs
可以多个参数一起使用:
lein new luminus myapp +site +postgres
如果两个参数会生成相同的文件,则后面参数所生成的文件会覆盖前面参数所生
成的文件。
Guestbook应用
此文使用Luminus构建一个简单的guestbook应用。guestbook可以保存信息,展示信息。此应用将涉及到简单的HTML模板,数据库访问和项目结构.
安装Leiningen
首先你需要安装Leiningen才能使用Luminus。安装Leiningen非常的简单:
- 下载脚本
- 将其设置为可执行权限(chmod +x lein)
- 将脚本放到你的PATH下面
- 运行lein self-install ,然后等待安装结束
wget https://raw.github.com/technomancy/leiningen/stable/bin/lein
chmod +x lein
mv lein ~/bin
lein self-install
创建一个新应用
安装完Leiningen后,你就可以在命令行中输入如下的命令
lein new luminus guestbook +h2
cd guestbook
上面的命令将会创建一个使用了H2嵌入式数据库的模板项目。
注解
编写四个JUnit测试用例,分别使用带或不带某个参数的@Test注解。用JUnit执行这些测试
import org.junit.Test
class ScalaTest {
@Test
def test1(){
print("test1")
}
@Test(timeout = 1L)
def test2(){
print("test2")
}
}
创建一个类的示例,展示注解可以出现的所有位置。用@deprecated作为你的示例注解。
@deprecated
class Test{
@deprecated
val t = _;
@deprecated(message = "unuse")
def hello(){
println("hello")
}
}
@deprecated
object Test extends App{
val t = new Test()
t.hello()
t.t
}
模式匹配和样例类
JDK发行包有一个src.zip文件包含了JDK的大多数源代码。解压并搜索样例标签(用正则表达式case [^:]+:)。然后查找以//开头并包含[Ff]alls?thr的注释,捕获类似// Falls through或// just fall thru这样的注释。假定JDK的程序员们遵守Java编码习惯,在该写注释的地方写下了这些注释,有多少百分比的样例是会掉入到下一个分支的?
没读懂题意。。。。
利用模式匹配,编写一个swap函数,接受一个整数的对偶,返回对偶的两个组成部件互换位置的新对偶
def swap[S,T](tup: (S,T)) = {
tup match {
case (a ,b) => (b,a)
}
}
println(swap[String,Int](("1",2)))
利用模式匹配,编写一个swap函数,交换数组中的前两个元素的位置,前提条件是数组长度至少为2
def swap(arr: Array[String]) = {
arr match {
case Array(a,b, ar @ _*) => Array(b,a) ++ ar
case _ => arr
}
}
println(swap(Array("1","2","3","4")).mkString)