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); // チェック用 } }
見れば分かるように、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でフォワード先に設定するだけです。