Google Chart API QRコード作成を Wicket の自作コンポーネントを書いてみた。
(ただし、Wicket1.4 用)
WebComponent を継承し対象データは Model で受け取り、画像作成のための
パラメータもコンストラクタの引数にする。
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.WebComponent;
import org.apache.wicket.model.IModel;
/**
* QrImage
*
* QrImage(String id,IModel<String> model,int size,String type,String encode)
* model : データ文字列
* size : 幅、高さのサイズ pix
* type : 画像種類 "gif" "png" "jpg" "bitmap" のいずれか
* encode: 出力文字コード
*/
public class QrImage extends WebComponent{
IModel<String> model;
int size;
String type;
String encode;
public QrImage(String id,IModel<String> model,int size,String type,String encode){
super(id);
this.model = model;
this.size = size;
this.type = type;
this.encode = encode;
}
@Override
protected void onBeforeRender(){
super.onBeforeRender();
if (this.model.getObject() != null && this.model.getObject().length() > 0){
try{
String chs = Integer.toString(this.size);
add(new SimpleAttributeModifier("width",chs));
add(new SimpleAttributeModifier("height",chs));
StringBuilder sb = new StringBuilder();
sb.append("http://chart.apis.google.com/chart?cht=qr&chs=");
sb.append(chs+"x"+chs);
sb.append("&choe=");
sb.append(this.encode);
sb.append("&chof=");
sb.append(this.type);
sb.append("&chl=");
sb.append(URLEncoder.encode(this.model.getObject(),"UTF-8").replaceAll("\r\n","%0D%0A"));
add(new SimpleAttributeModifier("src",sb.toString()));
}catch(UnsupportedEncodingException e){
throw new RuntimeException(e);
}
}
}
}
サンプル、
HTMLはこのように img タグを書く
改行も試すために TextArea を使う
<form wicket:id="form">
<textarea wicket:id="text" rows="8" cols="40"></textarea></td>
<input type="submit" value="作成"/>
</form>
<div><img wicket:id="qrcode"/></div>
このHTMLのページクラスで、QrImage を生成
public class QrMakeSamplePage extends WebPage{
private String inputText;
public QrMakeSamplePage(){
add(new QrImage("qrcode",new PropertyModel<String>(this,"inputText"),120,"gif","Shift_JIS"));
final TextArea<String> text = new TextArea<String>("text",new Model<String>());
Form<Void> form = new Form<Void>("form"){
@Override
protected void onSubmit(){
setInputText(text.getModelObject());
}
};
form.add(text);
add(form);
}
protected void setInputText(String inputText){
this.inputText = inputText;
}
}
Wicket 1.5 では、これではダメなのだが。