tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

WicketのNiceURLを試す

Wicketの勉強会が近いから少しでもWicketに触れておこうということで、WicketのURLをステキにするNiceURL機能を使ってみました。


受け取ったパラメータを、ListViewを使って表示するという簡単なサンプルです。
パラメータを1つ増やして再リクエストするリンクも作っています。
ボタンを連打するとパラメータがどんどん増殖していくという案配です。


Pageクラスが3つあるのは、SimplePageのみだとBookmarkablePageLinkを使って再リクエストを行った際に、SimplePageのデフォルトURL(/simple)になってしまったのでその回避策として。
でも、Pageクラスが1つでも何とかする方法がきっとあると思っている。

example/niceurl/page/SimplePage.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <a wicket:id="reflesh" href="#">Reflesh</a>
        
        <p>
        <table>
            <tr>
                <th>Key</th>
                <th>Value</th>
            </tr>
            <tr wicket:id="list">
                <td wicket:id="key"></td>
                <td wicket:id="value"></td>
            </tr>
        </table>

        <p>
        num: <span wicket:id="num"></span>

    </body>
</html>

tableの要素としてパラメータがすべて表示されます。
WicketはHTMLがシンプルになるからいいですね。

example/niceurl/page/SimplePage.java

package example.niceurl.page;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Map.Entry;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;

public class SimplePage extends WebPage {

    private static final long serialVersionUID = 1L;

    public SimplePage(PageParameters params) {
        //パラメータをListに詰め直す
        LinkedList<Param> list = new LinkedList<Param>();
        for (Entry entry : params.entrySet()) {
            Object value = entry.getValue();
            if (value instanceof String[]) {
                value = Arrays.deepToString((String[])entry.getValue());
            }
            list.add(new Param((String)entry.getKey(), (String)value));
        }

       //パラメータの表示を行う
        ListView<Param> listView = new ListView<Param>("list", list) {

            @Override
            protected void populateItem(ListItem<Param> item) {
                Param p = item.getModelObject();
                item.add(new Label("key", (String) p.key));
                item.add(new Label("value", (String) p.value));
            }
        };
        add(listView);

        //パラメータ数の表示
        String num = String.valueOf(params.size());
        add(new Label("num", num));
        
       //再表示用のリンクを作る
        PageParameters nextParams = new PageParameters(params);
        nextParams.put("param" + num, "value" + num);
        BookmarkablePageLink link = new BookmarkablePageLink("reflesh", getClass(), nextParams);
        add(link);
    }

    class Param {
        public String key;
        public String value;
        public Param(String key, String value) {
            this.key = key;
            this.value = value;
        }
    }

}

やっていることはコメントに書いてあるとおりです。


僕はWicketレベルが低いので書くのに時間がかかりますが、一度書いたコードが何をやっているかを読み取るのはけっこう簡単にできます。
これもWicketの特徴ですね。

example/niceurl/page/QueryPage.java

package example.niceurl.page;

import org.apache.wicket.PageParameters;

public class QueryPage extends SimplePage {

    private static final long serialVersionUID = 1L;

    public QueryPage(PageParameters params) {
        super(params);
    }
}

SimplePageに処理を渡しているだけ。

example/niceurl/page/PackagePage.java

package example.niceurl.page;

import org.apache.wicket.PageParameters;

public class PackagePage extends SimplePage {
    
    private static final long serialVersionUID = 1L;

    public PackagePage(PageParameters params) {
        super(params);
    }
}

こっちもSimplePageに渡しているだけ。

example/niceurl/WebApplication.java

package example.niceurl;

import example.niceurl.page.PackagePage;
import example.niceurl.page.QueryPage;
import example.niceurl.page.SimplePage;
import org.apache.wicket.Page;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.target.coding.QueryStringUrlCodingStrategy;
import org.apache.wicket.util.lang.PackageName;

public class NiceUrlApplication extends WebApplication {

    @Override
    public Class<? extends Page> getHomePage() {
        return SimplePage.class;
    }
    
	@Override
    protected void init() {

        getPageSettings().setAutomaticMultiWindowSupport(false);

        //---------------------
        //Page単位でマッピング

        //パラメータをURL形式で渡す(/key1/value1/key2/value2...)
        mountBookmarkablePage("/simple", SimplePage.class);

        //パラメータをQUERY形式で渡す(?key1=value1&key2=value2...)
        mount(new QueryStringUrlCodingStrategy("/query", QueryPage.class));

        
        //---------------------
        //Package単位でマッピング
        
        //パラメータはURL形式
        mount("/package", PackageName.forClass(PackagePage.class));
    }
}

3種類のパターンそれぞれにPageクラスを指定しています。
検索エンジンのことを考えるとQuery形式はあまり使われないように思えます。
(だからPackageかつQueryは用意されていないのかも?)

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <filter>
        <filter-name>NiceUrlApplication</filter-name>
        <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
        <init-param>
            <param-name>applicationClassName</param-name>
            <param-value>example.niceurl.NiceUrlApplication</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>NiceUrlApplication</filter-name>
        <url-pattern>/niceurl/*</url-pattern>
    </filter-mapping>
</web-app>

ここは標準的なWicketの記述そのままです。

実行結果