sgykfjsm.github.com

scalatraでいろいろやる その2

前回ので簡単な環境設定を終えたので、今回は簡単にGET/POSTを試す

ROUTING

まずは以下のような感じにする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
get("/") {
  <html>this is index</html>
}
get("/get") {
  <html>this is submit by get method test</html>
}

get("/get/:param") {
  <html>this is get prameter test</html>
}

get("/post") {
  <html>this is submit by post method test</html>
}

post("/post") {
  <html>this is post prameter test</html>
}

パスの前に付いているgetpostはHTTPメソッドに対応している。

ACTION + VIEW

今回はまだテンプレートエンジンを採用していないので、とりあえずということでインラインでアクションの部分やHTMLを書いていく。
長くなるので、一部を抜粋する形で解説を入れる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  get("/get") {
    params.get("param") match {
      case Some(x) => redirect("/get/" + x)
      case None =>
        contentType="text/html"
        <html>
          <body>
            <h1>Scalatra GET Tutorial</h1>
            <form action="./get" method="get" >
              <input type="text" name="param" value="" />
              <input type="submit" value="送信" />
            </form>
            <hr/>
            <a href="/">Beck To Index</a>
          </body>
        </html>
    }
  }

  get("/get/:param") {
    contentType="text/html"
    <html>
      <body>
        <h1>Scalatra GET Tutorial</h1>
        <p>You submitted: {params("param")}</p>
        <hr/>
        <a href="/">Beck To Index</a>
      </body>
    </html>
  }

中身のHTML自体はどうでもいいと思う。 ここでのポイントは以下の2つ。

  • /getでのパターンマッチをしていること。
  • /get/:paramでのパラメータを受け取るようにしていること。

パターンマッチによる振り分け

1
2
3
params.get("param") match {
  case Some(x) => redirect("/get/" + x)
  case None => { ... }

パラメータ名paramがあるかをチェックして、なければそのままHTMLをレンダリング、あれば/get/:paramにリダイレクトさせている。
get(“/get/:param”)ではparamsでパラメータ名を指定して値を取得している。

postの場合はすでにメソッドで分かれているので、このようなパターンマッチは必要ない。

まとめ

  • HTTPメソッドに応じて、get(“/path”)などでルーティングを行うことができる。もちろんPUTDELETEにも対応している。
  • パラメータの有無でルーティングの振り分けを行いたい場合はパターンマッチを使えば良い。
  • 同じURLでもHTTPメソッドが異なれば自動的に振り分けができる。

ここまでのソースコードをgistにあげた。

宿題

  • /get/のようなURLでアクセスすると404エラーとなる。その場合の対処法。

というわけで、とても簡単にだけどGET/POSTのやり方を確認した。
正直このエントリが必要だったかどうか怪しいぐらいの内容だけど、今は手探り状態で色々確認しているので、多少内容がアレでも目をつむる。もっといいやり方があれば、随時反映していく方針で。次はテンプレートエンジンを適用する方法を確認する予定。見た目が良くないとつまらんので。