ivaneye.com

Luminus手册-路由定义

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))

Luminus手册-ClojureScript

Summary

ClojureScript可以作为JavaScript在客户端的替代品。使用ClojureScript可以 有如下有点:

最简单的添加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文件中。

Luminus手册-HTML模板

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"}))

Luminus手册-应用配置

Profiles

使用lein new luminus myapp命令会创建一个新的luminus应用,它使用的是默认的配置。如果你想使用其他的特性,你可以修改相应的配置参数。

下面就是各个配置:

要添加配置,只需要简单的添加到你的应用的名字后面,比如:

lein new luminus myapp +cljs

可以多个参数一起使用:

lein new luminus myapp +site +postgres

如果两个参数会生成相同的文件,则后面参数所生成的文件会覆盖前面参数所生 成的文件。

Luminus手册-第一个应用

Guestbook应用

此文使用Luminus构建一个简单的guestbook应用。guestbook可以保存信息,展示信息。此应用将涉及到简单的HTML模板,数据库访问和项目结构.

安装Leiningen

首先你需要安装Leiningen才能使用Luminus。安装Leiningen非常的简单:

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嵌入式数据库的模板项目。

快学Scala习题解答—第十五章 注解

注解

编写四个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
}

快学Scala习题解答—第十四章 模式匹配和样例类

模式匹配和样例类

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)