前までの記事でSpring Modulesの使い方はだいたい大丈夫かと思います。
で。
実はこの機能は海外で作られたものなので日本語を判定する機能が無いのです。
つまり自作して設定しないといけません。
ここでは、自作のチェックの追加の仕方を見てみましょう!
題材は日本語のチェックです。
設定などは以前の記事を見てもらうことにして追加の仕方でけ見てみましょう。
【注意点】
最初に注意点を確認しましょう!
WEBなので必ずスレッドセーフに作ります。
これは忘れがちなので絶対に気をつけてください。
【チェックのクラス(/src/util/ValidateUtils.java)】
まず、全角かどうか?半角かどうか?などのチェックをするコードを書きます。
コードは1つの例なので、他の方法でもよいです。
ただし、引数の数と型は同じにしてください。
Errorsなどのクラスについては以下の記事が参考になると思います。
また、Pattern はスレッドセーフなので、staticで使用しても問題ありません。
ですので以下のクラスのメソッドもスレッドセーフになっています!
package util;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.util.ValidatorUtils;
import org.springframework.util.StringUtils;
import org.springframework.validation.Errors;
import org.springmodules.validation.commons.FieldChecks;
public class ValidateUtils {
private static Pattern hankakuPattern =
Pattern.compile("[\\p{InBasicLatin}]*");
private static Pattern hiraganaPattern =
Pattern.compile("[\\p{InHiragana}]*");
private static Pattern katakanaPattern =
Pattern.compile("[\\p{InKatakana}]*");
/**
* 半角かどうかをチェックする。
* @param bean
* @param va
* @param field
* @param errors
* @return
*/
public static boolean validateHankaku (
Object bean,
ValidatorAction va,
Field field,
Errors errors
) {
String value = null;
if(bean == null){
return true;
}else{
value = (String) ValidatorUtils.getValueAsString(bean,
field.getProperty());
}
if (!StringUtils.hasLength(value)) {
return true;
}
Matcher matcher = hankakuPattern.matcher(value);
if(!matcher.matches()){
FieldChecks.rejectValue(errors, field, va);
return false;
}
return true;
}
/**
* 半角チェック
* @param str
* @return
*/
private static boolean isZenkaku(String str) {
CharacterIterator iter = new StringCharacterIterator(str);
for (char c = iter.first();
c != CharacterIterator.DONE;
c = iter.next()) {
if (c <= 0x00FF) {
//半角
return false;
}
}
return true;
}
/**
* 全角かどうかをチェックする。
* @param bean
* @param va
* @param field
* @param errors
* @return
*/
public static boolean validateZenkaku (
Object bean,
ValidatorAction va,
Field field,
Errors errors
) {
String value = null;
if(bean == null){
return true;
}else{
value = (String) ValidatorUtils.getValueAsString(bean,
field.getProperty());
}
if (!StringUtils.hasLength(value)) {
return true;
}
if(!isZenkaku(value)){
FieldChecks.rejectValue(errors, field, va);
return false;
}
return true;
}
/**
* 全角ひらがなかどうかをチェックする。
* @param bean
* @param va
* @param field
* @param errors
* @return
*/
public static boolean validateHiragana (
Object bean,
ValidatorAction va,
Field field,
Errors errors
) {
String value = null;
if(bean == null){
return true;
}else{
value = (String) ValidatorUtils.getValueAsString(bean,
field.getProperty());
}
if (!StringUtils.hasLength(value)) {
return true;
}
Matcher matcher = hiraganaPattern.matcher(value);
if(!matcher.matches()){
FieldChecks.rejectValue(errors, field, va);
return false;
}
return true;
}
/**
* 全角カタカナかどうかをチェックする。
* @param bean
* @param va
* @param field
* @param errors
* @return
*/
public static boolean validateKatakana (
Object bean,
ValidatorAction va,
Field field,
Errors errors
) {
String value = null;
if(bean == null){
return true;
}else{
value = (String) ValidatorUtils.getValueAsString(bean,
field.getProperty());
}
if (!StringUtils.hasLength(value)) {
return true;
}
Matcher matcher = katakanaPattern.matcher(value);
if(!matcher.matches()){
FieldChecks.rejectValue(errors, field, va);
return false;
}
return true;
}
}
【設定ファイルの設定(/WEB-INF/validator-rules.xml)】
globalタグの中の一番下に以下の記述を追記します。
javascript(クライアント側のチェックスクリプト)の設定は記述していないので各自で自由にお願いします![]()
<!-- 半角チェック -->
<validator name="hankaku" classname="util.ValidateUtils"
method="validateHankaku"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.springframework.validation.Errors"
depends="" msg="errors.hankaku">
<javascript><![CDATA[ ]]>
</javascript>
</validator>
<!-- 全角チェック -->
<validator name="zenkaku" classname="util.ValidateUtils"
method="validateZenkaku"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.springframework.validation.Errors"
depends="" msg="errors.zenkaku">
<javascript><![CDATA[ ]]>
</javascript>
</validator>
<!-- 全角ひらがなチェック -->
<validator name="hiragana" classname="util.ValidateUtils"
method="validateHiragana"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.springframework.validation.Errors"
depends="" msg="errors.hiragana">
<javascript><![CDATA[ ]]>
</javascript>
</validator>
<!-- 全角カタカナチェック -->
<validator name="katakana" classname="util.ValidateUtils"
method="validateKatakana"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.springframework.validation.Errors"
depends="" msg="errors.katakana">
<javascript><![CDATA[ ]]>
</javascript>
</validator>
【メッセージリソース(/src/messages_ja.properties)】
メッセージリソースファイルには以下のキーを追記します。
errors.hankaku={0}は半角ですよ。
errors.zenkaku={0}は全角ですよ。
errors.hiragana={0}はひらがなですよ。
errors.katakana={0}はカタカナですよ。
【説明】
さて、上記の設定でしっかりチェック可能になっています。
参考までに、validation.xmlに記述する例を見てみましょう!
<field property="message" depends="maxlength,zenkaku">
<arg0 key="メッセージ" resource="false" />
<arg1 key="${var:maxlength}" resource="false" />
<var>
<var-name>maxlength</var-name>
<var-value>10</var-value>
</var>
</field>
上記で、10文字以内かどうか? のチェックと、全ての文字が全角かどうか? のチェックをしてくれます。
<エラー時のメッセージ>
設定は以下のようになっています。
<!-- 全角チェック -->
<validator name="zenkaku" classname="util.ValidateUtils"
method="validateZenkaku"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.springframework.validation.Errors"
depends="" msg="errors.zenkaku">
<javascript><![CDATA[ ]]>
</javascript>
</validator>
validateZenkakuのメソッドを呼び出してエラーだったら、「errors.zenkaku」をキーにして
メッセージリソースから検索する、という設定になります。
ですので、メッセージリソースに「errors.zenkaku」を設定しておく必要があります。
参考: