マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

Captchaを表示させるのは簡単 その3

前回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に使われるけど、何も渡さなければ英語の小文字のランダム文字列を用意してくれます