読者です 読者をやめる 読者になる 読者になる

AttributeAppender とAttributeModifier lambda

Wicket

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 Java

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 クラス内のインナークラスにしておくと全体のコードが読みやすい気がしてきた。

Eclipse ロガーの自動挿入

その他

Eclipse を設置して作業開始する前に設定しておく1つに、

Javaエディタでの ロガーの自動挿入がある、SL4J なら以下のように。。。

パターンに


${:import(org.slf4j.Logger, org.slf4j.LoggerFactory)}
Logger logger = LoggerFactory.getLogger(this.getClass());

を書く。

f:id:posturan:20170226162407j:plain

 

 

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 を置き換えてやる。

IntStream から逆順リストを作る

Java
List<Integer> years =
IntStream.rangeClosed(2013, Calendar.getInstance().get(Calendar.YEAR))
     .boxed()
     .sorted(Comparator.reverseOrder())
     .collect(Collectors.toList());

CSV書込み(1)(2)を書き直す。

CSV生成の 

oboe2uran.hatenablog.com

と、

oboe2uran.hatenablog.com

は、またもや書き直した。null 対応だ。