クライアント側から入力されたデータを元に動作するようなサーブレットを作成する際に必要となるのが入力値チェックである。今回はその方法について説明する。
サーブレットで入力値チェックをする方法
入力値チェックとは、入力されたデータが要求どおりのデータかどうかをチェックすることである。例えばパスワードを設定する時、数値だけとか8文字以上とか、入力するデータに制限を設けている入力画面を見たことがあるだろう。
このチェックをクライアント側で行うこともできるが、ここではサーブレット側で行う方法を示す。
画面から入力されたパスワードをチェックする場合、まずリクエストからパラメータの名前を指定してデータを取り出す。
String password = request.getParameter("password");
次に、取り出したデータをチェックする。最初にチェックしなければならないのは、データが「null」でないことである。もし、「null」ならメソッドを呼び出すことができないので、チェックのしようがない。それで、最初にnullチェックを行う。
1 2 |
if (value == null) return false; |
このチェックが終われば、文字列クラスのメソッドが呼び出せる。文字列に8文字以上のデータが入っていることをチェックしよう。文字列の長さを求めるメソッドlength()を呼び出してチェックする。
1 2 |
if(value.length() < minimumLength) return false; |
この後に続くチェックはいろいろあるだろう。ここでは、8文字以上のデータがすべて数字でなければならいとしよう。この場合、文字の整数への変換を利用してチェックできる。
1 2 3 4 5 6 |
try { Integer.parseInt(value); return true; } catch (NumberFormatException numberFormatException) { return false; } |
では、実際のサンプルプログラムを見てみよう。
サーブレットで入力値チェックを行うサンプルプログラム
このサンプルプログラムは、画面に入力された名前とパスワードの入力値をチェックしている。名前は何らかの文字が入力される必要がある。パスワードは8文字以上の数値であることをチェックする、最後、正しく入力されたかどうかをチェックの結果として表示する。
サーブレットの配置とプログラムのコードは次のようになっている。
最初にHTMLで書かれたパスワード入力画面のコードを示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <title>サーブレットで入力値チェックを行うサンプル</title> </head> <body> <p>名前とパスワードを入力してください。</p> <form action="/Servlet/ServletInputCheck" method="get"> <table> <tr> <td>名前</td><td>:<input type="text" name="name"></td> </tr> <tr> <td>パスワード</td><td>:<input type="text" name="password"></td> </tr> </table> <p><input type="submit" value="チェック実行" style="WIDTH: 200px; HEIGHT: 20px"></p> </form> </body> </html> |
次に、HTML画面から入力された値をチェックするサーブレットのコードを示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ServletInputCheck")//[1] public class ServletInputCheck extends HttpServlet {//[2] String messageOfNameCheck; String messageOfPasswordCheck; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//[3] response.setContentType("text/html; charset=UTF-8");//[4] request.setCharacterEncoding("UTF-8");//[5] String name = request.getParameter("name");//[6] String password = request.getParameter("password");//[7] messageOfNameCheck = "正しく入力されました。";//[8] checkName(name);//[9] messageOfPasswordCheck = "正しく入力されました。";//[10] checkPassword(password);//[11] PrintWriter out = response.getWriter();//[12] out.println("<html><head></head><body>");//[13] out.println("<p>入力値のチェックの結果を表示します。</p>");//[14] out.println("<p>名前:" + name + "</p>");//[15] out.println("<p> →結果:" + messageOfNameCheck + "</p>");//[16] out.println("<p>パスワード:" + password + "</p>");//[17] out.println("<p> →結果:" + messageOfPasswordCheck + "</p>");//[18] out.println("</body></html>");//[19] } private void checkName(String name) {// [40] if (!checkNull(name)) {//[41] messageOfNameCheck = "nullチェックでエラーです。";//[42] return;//[43] } if (!checkEmpty(name)) {//[44] messageOfNameCheck = "文字が入力されていません。";//[45] return;//[46] } return;//[47] } private void checkPassword(String password) {//[50] if (!checkNull(password)) {//[51] messageOfPasswordCheck = "nullチェックでエラーです。";//[52] return;//[53] } if (!checkLength(password, 8)) {//[54] messageOfPasswordCheck = "文字が8文字以上入力されていません。";//[56] return;//[57] } if (!checkNumber(password)) {//[58] messageOfPasswordCheck = "文字が数値ではありません。";//59] return;//[60] } return;//[61] } private boolean checkNull(String value) {//[70] if (value == null)//[71] return false;//[72] return true;//[73] } private boolean checkEmpty(String value) {//[80] if(value.isEmpty())//[81] return false;//[82] return true;//[83] } private boolean checkLength(String value, int minimumLength) {//[90] if(value.length() < minimumLength)//[91] return false;//[92] return true;//[93] } private boolean checkNumber(String value) {//[100] try {//[101] Integer.parseInt(value);//[102] return true;//[1031 } catch (NumberFormatException numberFormatException) {//[104] return false;//[105] } } } |
実行結果
ブラウザにURL:http://localhost:8080/Servlet/ inputcheck.htmlを入力し、Enterを押す。
表示されるブラウザ画面:
何も入力しないでチェック実行をクリックする。
表示されるブラウザ画面:
前の入力画面に戻り、名前に「abc」を、パスワードに「123」を入力して、チェック実行をクリックする。
表示されるブラウザ画面:
前の入力画面に戻り、名前に「abcefghi」を、パスワードに「1234567x」を入力して、チェック実行をクリックする。
表示されるブラウザ画面:
前の入力画面に戻り、名前に「abcefghi」を、パスワードに「12345678」を入力して、チェック実行をクリックする。
表示されるブラウザ画面:
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] アノテーションの宣言をする。
- [2] HttpServletを継承して、ServletInputCheckクラスを定義する。
- [3] String型参照変数messageOfNameCheckを宣言する。
- [4] String型参照変数messageOfPasswordCheckを宣言する。
- [5] doGet()メソッドをオーバーライドして定義する。
- [6] responseオブジェクトの文字コードにUTF-8を設定する。
- [7] responseオブジェクトから名前を参照変数nameに取得する。
- [8] responseオブジェクトから名前を参照変数passwordに取得する。
- [9] messageOfNameCheckに「正しく入力されました。」を設定する。
- [10] checkName()メソッドを呼び出して名前(name)のチェックを行う。
- [11] messageOfPasswordCheckに「正しく入力されました。」を設定する。
- [12] checkPassword ()メソッドを呼び出してパスワードの(password)のチェックを行う。
- [13] Content Typeを設定する。
- [14] HTMLを出力するためのPrintWriterオブジェクトを取得する。
- [17]-[21] PrintWriterオブジェクトに、名前とパスワードをチェックした結果を表示するHTMLコードを出力する。
- [40] 名前の入力値チェックを行うcheckName()メソッドの宣言を行う。
- [41]-[43] nullチェックを行う。
- [44]-[46] 入力文字列が空かどうかのチェックを行う。
- [50] パスワードの入力値チェックを行うcheckPassword()メソッドの宣言を行う。
- [51]-[53] nullチェックを行う。
- [54]-[57] 入力文字列の長さのチェックを行う。
- [58]-[60] 入力文字列の数値のチェックを行う。
- [70]-[73] nullチェックを行うcheckNull ()メソッドの宣言を行う。
- [80]-[83] 文字列の空チェックを行うcheckEmpty ()メソッドの宣言を行う。
- [90]-[93] 文字列の長さチェックを行うcheckLength ()メソッドの宣言を行う。
- [100]-[103] 文字列の数値チェックを行うcheckNumber ()メソッドの宣言を行う。
まとめ
このように入力値チェックを予め行っておくことで想定外のデータ入力を防げるため、プログラムの主目的となる部分の構造が簡単に出来る上に誤動作も防げるというメリットがある。サンプルプログラムの条件を色々と自分なりに変更して動作させてみよう。