SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで軽快に使える「軽量フレームワーク」特集

Javaで軽快に使える「軽量フレームワーク」特集
低い学習コストを重視した「Apache Click」 (2)

第5回


  • X ポスト
  • このエントリーをはてなブックマークに追加

OtherPageの作成

 では、リダイレクト先のWebページを作成しましょう。まずはテンプレートからです。other.htmというファイル名で、次のように作成しておきます。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Other</title>
        <link rel="stylesheet" type="text/css" href="style.css"></link>
        $imports
    </head>
    <body>
        <h1>Other Page</h1>
        <p>送られた値:$msg</p>
    </body>
</html>

 続いて、Pageクラスです。これはOtherPage.javaという名前でファイルを作成し、次のようにソースコードを記述します。

package jp.codezine.click;

import org.apache.click.Page;

public class OtherPage extends Page {
    public String msg;

    @Override
    public void onInit() {
        System.out.println(msg); // チェック用
    }

}
図8 ボタンを押すとother.htmに移動し、入力した値が表示される。
図8 ボタンを押すとother.htmに移動し、入力した値が表示される。

 見れば分かるように、msgというpublicフィールドがあるだけで、他には何もありません。とりあえず、値のチェック用にSystem.out.printlnを1行だけ書いてありますが、これはもちろんなくてかまいません。

 完成したら、実際に試してみましょう。フォームを送信すると、other.htmに移動します。入力したテキストもちゃんと受け渡されていることが分かります。送信されたMapの値は、取り出して設定するような処理はまったく用意していません。Apache Clickでリダイレクトを行う場合、送られたMapから値を取り出し、キーと同じ名前のpublicフィールドに自動的に値を設定してくれるのです。

日本語への対応

 ただし、実際にやってみると、日本語を入力した場合、リダイレクト先のother.htmで文字化けして表示されてしまうことが分かるでしょう。実は、setRedirectで渡されるMapは、ただ単に値をother.html?msg=xxxというようにURLに付け足して渡しているだけなのです。このため、日本語はそのままだと化けてしまいます。

 現バージョンでは、日本語などへの対応はされていないようですので、手動でURLエンコードして渡し、受け取ったらデコードするように修正しておきましょう。まず、HeloPageクラスのsumitメソッドを次のように修正しておきます。

public boolean submit(){
    msg = input.getValue();
    Map map = new HashMap();
    try {
        msg = URLEncoder.encode(msg, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    map.put("msg", msg);
    this.setRedirect(OtherPage.class,map);
    return true;
}

 続いて、OtherPageクラスのonInitメソッドを次のように修正します。これで日本語も文字化けすることなく受け渡されるようになります。

@Override
public void onInit() {
    try {
        msg = URLDecoder.decode(msg, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

インスタンスを使ってフォワードする

 あるいは、もう一つ別の方法もあります。フォワードでページ遷移する場合「setForward」を利用しますが、これにはPageインスタンスを引数にするメソッドがオーバーロードされています。これを利用し、あらかじめ移動先のPageインスタンスを用意し、そこに必要な値などを設定してからsetForwardするのです。

public boolean submit(){
    msg = input.getValue();
    Map map = new HashMap();
    map.put("msg", msg);
    OtherPage other = (OtherPage)getContext().createPage(OtherPage.class);
    other.msg = msg;
    this.setForward(other);
    return true;
}

 submitメソッドをこのように書き換えてみましょう。すると、OtherPage側でテキストのデコードなどを行わなくとも、問題なく日本語が渡せるようになります。ここでは遷移先のOtherPageインスタンスを作成するのに、

OtherPage other = (OtherPage)getContext().createPage(OtherPage.class);

 このようにしていますね。getContextはコンテキストであるContextクラスのインスタンスを返すもので、その中の「createPage」というメソッドにより、Pageインスタンスを作成することができます。インスタンスができたら、後は必要な処理を行い、setForwardでフォワード先に設定するだけです。

次のページ
エラー発生時の対応を考える

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Javaで軽快に使える「軽量フレームワーク」特集連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4556 2014/04/17 09:39

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング