前回はCaptchaを表示させるだけだったので、今回は入力と判定をつけた。wicketのバージョンは1.4-m3、動作にはwicket-extensionsが必要です
まずはHTMLから、ファイル名はCaptcha.html
<html> <head> <title>Captcha Test</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <p> <img wicket:id="captchaImage" /> </p> <p> <form wicket:id="form"> <input type="text" wicket:id="inputCaptcha"/> <input type="submit" value="送信" wicket:id="submit"/> </form> </p> <span wicket:id="result">結果</span> </body> </html>
次にWebPageとなるJavaのプログラム、ファイル名はCaptcha.java
package captcha; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.extensions.markup.html.captcha.CaptchaImageResource; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.model.Model; public class Captcha extends WebPage { public Captcha() { final CaptchaImageResource resource = new CaptchaImageResource(); Image image = new Image("captchaImage", resource); Form form = new Form("form"); final TextField<String> inputCaptcha = new TextField<String>("inputCaptcha", new Model<String>()); final Label resultLabel = new Label("result", new Model<String>()); Button submit = new Button("submit"){ @Override public void onSubmit(){ String answer = resource.getChallengeId(); String input = inputCaptcha.getModelObject(); if(input.equals(answer)) resultLabel.setDefaultModelObject("正解です"); else resultLabel.setDefaultModelObject("答えは" + answer + "です"); } }; add(image); form.add(inputCaptcha); form.add(submit); add(form); add(resultLabel); } }
アプリケーションクラスとフィルタマッピングは省略。CaptchaImageResourceはコンストラクタに文字列を渡せばその文字列がCaptchaに使われるけど、何も渡さなければ英語の小文字のランダム文字列を用意してくれます