AttributeAppender とAttributeModifier lambda

Wicketの AttributeModifier と AttributeAppender は、よくよく考えたら、ラムダ式をあてはめられるんだった。

boolean isError;


queue(new Label("name", itemname).add(new AttributeAppender("class", ()->isError ? "error" : "")));
queue(new Label("name", itemname).add(new AttributeModifier("class", ()->isError ? "error" : "")));

Wicket8 の LambdaModel

Wicket 8 になると待望のラムダ Model がある。

PropertyModel を使って TextField に 自Pageクラスの変数を指定すると、どうしても

  new TextField<>("idname", new PropertyModel<>(this, "name"));

のように書くことになり、"name" 変数名がタイプセーフでなくバグの温床になる。

  IModel<T> LambdaModel.of(SerializableSupplier<T> getter, SerializableConsumer<T> setter)

LambdaModel.of で、getter に Supplierと setter として Consumer シリアライズ化されてるものを指定して作る。

自Pageクラスに getter , setter を書くなら、

   new TextField<>("name", LambdaModel.of(this::getName, this::setName));

と書けるが、入力項目が多いとそれだけ getter , setter を自Pageクラスに設置することになる。

入力項目だけを束ねたクラスを宣言して→ Fields そこでgetter , setterを用意して、

final Fields fields = new Fields();
final TextField<String> nameField = new TextField<>("name", LambdaModel.of(fields::getName, fields::setName) );
queue(nameField);
queue(new Form<Void>("form"){
   @Override
   protected void onSubmit(){
      /* fields.getName() の結果とnameField.getModelObject() は同じ。  */
   }
});

ということはできるけど、
Page クラス内で入力項目を定義するのがいいのか?
束ねたクラスを用意して外に置くか?
束ねたクラスを用意してPage クラス内のインナークラスにしておくのが良いのか?
迷う。。。

束ねたクラスを用意してPage クラス内のインナークラスにしておくと全体のコードが読みやすい気がしてきた。

web.xml DOCTYPE記述メモ

今更だけど、web.xmlServletバージョン別の DOCTYPE記述メモ


Servlet 2.3

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
</web-app>


Servlet 2.4

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >

</web-app>


Servlet 2.5

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
           version="2.5">

</web-app>


Servlet 3.0

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_0.xsd"
           version="3.0">

</web-app>


Servlet 3.1

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

</web-app>

Tomcat8.5.11 を開発作業PC、EclipseWTPで起動する

Tomcat8.5.11 を開発作業PC(Windows)上に置いて、Eclipse WTP で動かしたくなった。

Webサーバを Eclipse で指定しても、そのままでは、


The Apache Tomcat installation at this directory is version 8.5.11. A Tomcat 8.0 installation is expected.


とエラーになってしまう。なので、Tomcat8.5.11 をインストールしたディレクトリの下 lib の中にある

catalina.jar を jar xvf で展開して、

org/apache/catalina/util/ServerInfo.properties を書き換える。(UTF-8 改行コードに注意)

server.info=Apache Tomcat/8.5.11

と書かれた部分を

server.info=Apache Tomcat/8.0.0

に書き換えて、jar cvf catalina.jar . で、再度 jar をパッケージして catalina.jar を置き換えてやる。