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の記述そのままです。