月別アーカイブ: 2012年3月

Go言語:templateパッケージでHTML等テキストファイルを読み込む(基礎編)

templateパッケージでHTML等の任意のテキストファイルを読み込み、出力する方法を説明する。
なお、APIバージョンGo1で説明する。
バージョン3ではパッケージ名、関数名が異なるので注意。

概要

templateパッケージでは、任意のテキストファイルを読み込み、テキストファイルに埋め込まれたプレースホルダに文字列を変換して出力する。例えば、以下のような機能を利用できる。

  • ブラウザからのgetリクエストに対して外部HTMLファイルを読み込み、任意のデータをHTMLに埋め込んでレスポンスとして返す。
  • メールの本文テンプレートとして作成したテキストファイルを読み込み、任意のデータを本文に埋め込んでメールを送信する。

単にhtmlファイルを読み込んで出力するだけのサンプル

package main

import (
    "os"
    "fmt"
    "text/template"
)

func main() {
	var t = template.Must(template.ParseFiles("plainSample.html")) // 外部テンプレートファイルの読み込み
    
	if err := t.Execute(os.Stdout, nil); err != nil { // テンプレート出力
        fmt.Println(err.Error())
    }
}

plainSample.html

<html>
    <head>
        <title>Sample Html</title>
    </head>
    <body>
        <h1>Htmlサンプル</h1>
        サンプルテキスト
    </body>
</html>

出力結果

<html>
    <head>
        <title>Sample Html</title>
    </head>
    <body>
        <h1>Htmlサンプル</h1>
        サンプルテキスト
    </body>
</html>

プレースホルダを使用した場合のサンプル

package templatesample

import (
    "fmt"
    "net/http"
    "text/template"
)

type Member struct {
    Name string
    Message string
}

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    member := Member{"inatus", "はじめまして。<br>よろしくお願いいたします。"}
    var t = template.Must(template.ParseFiles("placeholderSample.html")) // 外部テンプレートファイルの読み込み
    
	if err := t.Execute(w, member); err != nil { // テンプレート出力
        fmt.Println(err.Error())
    }
}

placeholderSample.html

<html>
    <head>
        <title>Sample Html</title>
    </head>
    <body>
        <h1>Htmlサンプル</h1>
        <h3>{{.Name}}</h3>
        {{.Message}}
    </body>
</html>

ブラウザ表示結果

出力をstring型のオブジェクトに格納するサンプル


package main

import (
    "fmt"
    "bytes"
    "text/template"
)

type Member struct {
    Name string
    Message string
}

func main() {
    member := Member{"inatus", "はじめまして。<br>よろしくお願いいたします。"}
    var body bytes.Buffer
    var t = template.Must(template.ParseFiles("placeholderSample.html")) // 外部テンプレートファイルの読み込み
    
	if err := t.Execute(&body, member); err != nil { // テンプレート出力
        fmt.Println(err.Error())
    }

    var str string = body.String()
}

解説

パッケージ

下記の2種がある。

  • text/template: 汎用テンプレート用のパッケージ。
  • html/template: プレースホルダに変換対象の文字列のhtmlタグをエスケープする。サニタイジングに有効。

インポートするパッケージをhtml/templateに変更して上記の「プレースホルダを使用した場合のサンプル」を実行した結果は以下の通り。

内部的には<&lt;>&gt;といったように文字列変換される。

テンプレートの読み込み

var t = template.Must(template.ParseFiles("placeholderSample.html"))

template.ParseFiles関数の引数で渡すパスにあるファイルを読み込む。
パスではなくstringをそのまま引数に渡すこともできる。

var t = template.Must(template.New("html").Parse("<html><body>サンプル</body></html>"))

プレースホルダ変換文字列の指定と出力

if err := t.Execute(w, member); err != nil { // テンプレート出力
    fmt.Println(err.Error())
}

上記のテンプレート読み込みの出力変数に対しExecute関数を実行する。
1つ目の引数には出力先のio.Writerインタフェイスを指定する。io.Writerインタフェイスには例えば下記のようなものがある。

  • http.ResponseWriter: httpレスポンスへの出力
  • os.Stdout: 標準出力
  • bytes.Buffer: 変数への出力

2つ目の引数にはプレースホルダへの変換対象となる文字列を含んだ変数(通常は構造体)を指定する。読み込んだテンプレートのプレースホルダ名({{.Variable}})は必ず構造体のメンバ名として存在しなければならない。

応用編では使用できるプレースホルダのバリエーションを解説する。

Go言語でWebアプリケーションを作成する

githubレポジトリに公開しているSpring MVCで実装したLeagacyなBBSサンプルと同じ物をGo言語で実装してみた。
ポイントはどこまでSpring MVCに肉薄できるか。


Go言語実装のLegacyBBSサンプルのgithubレポジトリ
Google App Engineにデプロイ済みサンプル

次回以降、数回に分けて要素技術を紹介していく。

Javaアプリケーションコンテナ Jelasticの使い方

JavaアプリケーションコンテナのJelasticを試してみた。

イメージとしてはGoogle App EngineのJavaに特化した版。

現在beta版で無料で使えることもあって、一度試してみる価値あり。

Jelasticのトップ画面。

まずはサーバの場所を北米とヨーロッパから選び、メールアドレスを入力してアカウント登録をする。

現時点ではヨーロッパサーバのほうが軽い印象。

メールで認証コードが送られてくるので入力する。

構成を決める。

Cloudletという単位でノードに割り当てるリソースを設定できる。

負荷分散構成も可能。

アプリケーションサーバとJavaのバージョンも同時に指定する。

データベースにはNoSQLも指定できる。

今回はレガシーBBSサンプルをデプロイするので、実行環境に合わせ、Java 6、Tomcat 6、MySQL 5.0を選択。

コンソール画面。

まずはMySQLの設定を行う。

MySQL 5.5の右側のOpen in browserアイコンをクリック。

メールに届いているID、Passwordによりログインする。

MySQLのコンソール画面。

データベースタブを選択。

データベース一覧。

今回はtestデータベースにアプリケーションを動かすために必要なテーブルを挿入する。

testをクリック。

操作タブを開き、エンコーディング(照合順序)をutf8_general_ciに変更する。

SQLタブを選択し、githubレポジトリのentry_table.sqlの内容をコピペして実行。

構造タブを確認すると、entryテーブルが追加されている。

次にtestデータベースにユーザを追加する。

特権タブから、「新しいユーザを追加する」をクリック。

ユーザ名、パスワードを入力してユーザを追加する。

Jelasticコンソールを開き、MySQL 5.5の右側のconfigアイコンをクリックする。

中程のビューからmy.cnfを開き、画像の箇所に下記の設定を追加する。

default-character-set=utf8
character_set_server=utf8
skip-character-set-client-handshake

Saveし、MySQL 5.5の右側のRestart nodeアイコンからリスタートする。

MySQL 5.5の右側のInfoメニューからデータベースのURLを確認する。

githubレポジトリからコードをダウンロードし、src/main/resources/META-INF/jdbc.propertiesを編集してデータベースのURL、先ほど作成したユーザ名・パスワードを設定してmavenからwarファイルにpackageする。

中程のDeployment managerタブのUploadボタンから作成したwarファイルをアップロードする。

しばらくするとアップロードされる。

アップロードが完了したwarファイルの右側のアイコンから環境名を選択する。

以上で設定・デプロイが完了。

Tomcat 6の下に表示されるwarファイル名の右側のOpen in browserアイコンからアプリケーションを実行する。

アプリケーションの実行ができた。
印象としてはちょっと重い。
正式サービスが始まったらいくらくらいになるのだろうか。