まるるん備忘録

プログラミングやインフラ等、IT技術に関して気付いた事を書いているブログです。

プライバシーポリシー

MaruGamesは、以下のとおり個人情報保護方針を定め、個人情報保護の仕組みを構築し、個人情報保護の重要性の認識と取組みを徹底することにより、個人情報の保護を推進致します。



個人情報の管理
MaruGamesは、お客さまの個人情報を正確かつ最新の状態に保ち、個人情報への不正アクセス・紛失・破損・改ざん・漏洩などを防止するため、セキュリティシステムの維持・管理体制の整備徹底等の必要な措置を講じ、安全対策を実施し個人情報の厳重な管理を行ないます。


個人情報の利用目的
お客さまからお預かりした個人情報は、各アプリ内でのデータ保存のみに利用します。


個人情報の第三者への開示・提供の禁止
MaruGamesは、お客さまよりお預かりした個人情報を適切に管理し、次のいずれかに該当する場合を除き、個人情報を第三者に開示いたしません。
・お客さまの同意がある場合
・お客さまが希望されるサービスを行なうために弊社が業務を委託する業者に対して開示する場合
・法令に基づき開示することが必要である場合


個人情報の安全対策
MaruGamesは、個人情報の正確性及び安全性確保のために、セキュリティに万全の対策を講じています。


ご本人の照会
お客さまがご本人の個人情報の照会・修正・削除などをご希望される場合には、ご本人であることを確認の上、対応させていただきます。


法令、規範の遵守と見直し
MaruGamesは、保有する個人情報に関して適用される日本の法令、その他規範を遵守するとともに、本ポリシーの内容を適宜見直し、その改善に努めます。


お問い合せ
MaruGamesの個人情報の取扱に関するお問い合せは下記までご連絡ください。
marurunnmakesgames@gmail.com

TeachAnswerServlet.java

TeachAnswerServlet.java

import java.io.IOException.;
import java.io.PrintWriter;
import java.util.Random;
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(urlPatterns = {"/teachanswerservlet"})
public class TeachAnswerServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        try (PrintWriter out = response.getWriter()) {
            request.setCharacterEncoding("UTF-8");


            String userAnswer = request.getParameter("userAnswer");
            String[] formula = new String[2];
            formula[0] = request.getParameter("formula1");
            formula[1] = request.getParameter("formula2");
            int answer = Integer.parseInt(formula[0]) + Integer.parseInt(formula[1]);

            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>答え</title>");
            out.println("</head>");
            out.println("<body>");

            //ユーザーの回答と答えが同じなら正解のメッセージを表示する
            if(Integer.parseInt(userAnswer) == answer){
                out.println("<h1>あなたの回答は" + userAnswer + "!<br>大正解!!</h1>");
            }else{
                out.println("<h1>あなたの回答は" + userAnswer + "!<br>残念!答えは" + answer + "でした!</h1>");
            }
                out.println("</body>");
                out.println("</html>");
            }
        }

    @Override

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }

}

まるるん備忘録【Webアプリケーション開発】getParameterで上手く値が取得出来ない!?

JavaServletでリクエストからパラメータを取得する時、getParameterというメソッドを使いますよね。

ですがこのgetParameter、name属性をしっかりと引数に渡してあげても、nullを返す事があるのです。

以前その理由が分からず少し悩んだ事があったので、今回はその事について触れたいと思います。

今回使用するファイルは以下の通りです。

  • index.html
  • MakeQuizServlet.java
  • TeachAnswerServlet.java

少し量が多いので、各ファイルの中身は以下のURLに移しておきます。

これらはきちんと動作します。なので少しいじってnullという実行結果を出してみましょう。

 下記のようにソースコードを修正して下さい。いじった部分だけ色を変えています。


// 数が1桁なら、空白を多めに詰める
switch(formula[0]){
     case 1:
     case 2:
     case 3:
     case 4:
     case 5:
     case 6:
     case 7:
     case 8:
     case 9: out.println("<h2 name=formula1 value=" + formula[0] + ">&nbsp;&nbsp;&nbsp;&nbsp;" + formula[0] + "</h2>"); break;  // name属性を追加した
     default: out.println("<h2 name=formula1 value=" + formula[0] + ">&nbsp;&nbsp;"+ formula[0] + "</h2>"); break;  // name属性を追加した
        }

// 数が1桁なら、空白を多めに詰める
switch(formula[1]){
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
    case 9: out.println("<h2 name=formula2 value=" + formula[1] + ">+&nbsp;&nbsp;" + formula[1] + "</h2>"); break;  // name属性を追加した
    default: out.println("<h2 name=formula2 value=" + formula[1] + ">+" + formula[1] + "</h2>"); break;  // name属性を追加した
}

    out.println("<hr>");
    out.println("<form action=teachanswerservlet method=POST>");
    out.println("<input type=text name=userAnswer value=0>");
//    out.println("<input type=hidden value="+ formula[0] + ">");  // name属性を除去した
//    out.println("<input type=hidden value="+ formula[1] + ">");  // name属性を除去した
    out.println("<input type=submit>");
    out.println("</form>");
    out.println("</body>");
    out.println("</html>");

 

 はい。name属性を<h2>タグの中に移しただけですね。なので普通に実行されそうですが……

ページが真っ白になってしまいますよね。どうしてそうなるのかと言うと、name属性が持つvalueを取得出来ないからです。

「……いやいや、name属性を<h2>タグの中に移しただけだし、valueだってきちんと設定しているじゃん!」と思われるかもしれませんが、getParameterで取得出来る値は「<input>タグのname属性が持つvalue属性の値」だけだからです

 今回のまとめ

  • getParameterで取得出来る値は<input>タグのname属性が持つvalue属性の値のみ 

MakeQuizServlet.java

※マーカーのようなものが引かれていますが、特に支障はないので気にしないで下さい。

MakeQuizServlet.java


import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
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(urlPatterns = {"/makequizservlet"})
public class MakeQuizServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        try (PrintWriter out = response.getWriter()) {
            request.setCharacterEncoding("UTF-8");

            String name = request.getParameter("name");

            Random r = new Random();
            int[] formula = new int[2];
            for(int i = 0; i < 2; i++) formula[i] = r.nextInt(99) + 1;

            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>問題</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h3>ようこそ" + name + "さん。この問題が解けるかな?</h3>");

            // 数が1桁なら、空白を多めに詰める
            switch(formula[0]){
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                case 9out.println("<h2 value=" + formula[0] + ">&nbsp;&nbsp;&nbsp;&nbsp;" + formula[0] + "</h2>"); break;
                defaultout.println("<h2 value=" + formula[0] + ">&nbsp;&nbsp;" + formula[0] + "</h2>"); break;
        }

            // 数が1桁なら、空白を多めに詰める
            switch(formula[1]){
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                case 9out.println("<h2 value=" + formula[1] + ">+&nbsp;&nbsp;" + formula[1] + "</h2>"); break;
                defaultout.println("<h2 value=" + formula[1] + ">+" + formula[1] + "</h2>");         break;
        }

            out.println("<hr>");
            out.println("<form action=teachanswerservlet method=POST>");
            out.println("<input type=text name=userAnswer value=0>");
            out.println("<input type=hidden name=formula1 value=" + formula[0] + ">");
            out.println("<input type=hidden name=formula2 value=" + formula[1] + ">");
            out.println("<input type=submit>");
            out.println("</form>");
            out.println("</body>");
            out.println("</html>");
        }
    }

    @Override
    protected void doGet(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }

}

index.html

index.html


<!DOCTYPE html>
<html>
    <head>
        <title>脳トレクイズ</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <h1>算数問題</h1>
        <p>あなたの名前を入力して下さい</p>
        <form action="makequizservlet" method="POST">
            <input type="text" name="name">
            <input type="submit" name="submit" value="送信">
        </form>
    </body>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

まるるん備忘録【Webアプリケーション開発】HTMLのPOSTメソッドで失敗したこと

HTMLのタグの1つである<form>タグ。

その<form>タグの属性の1つ、methodの値を「POST」にしてデータを送信する練習をしてみたのですが、何故だか上手くいかないんですよね……

という訳で、何が悪いのかHTMLの中身を見てみましょう。

使用したHTMLは2つです。

  • signin.html  (ログイン画面(もどき)を表示するHTML。こちらから、もう片方のHTMLへデータを送信します)
  • signin-action.html  (データを受信して何らかのアクションを返すHTML。なお機能は未実装です)

signin.html

<!DOCTYPE html>
<html>
    <head>
        <title>ココはタイトルです</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0"></head>
    <body>
        <form class="" action="signin.html" method="post">
            <fieldset>
                <legend>ログインID(メールアドレス)</legend>
                <input type="email" name="email-input">
            </fieldset>
            <fieldset>
                <legend>パスワード</legend>
                <input type="password" name="password-input">
            </fieldset>
                <fieldset>
                    <legend>送信ボタン type="submit"</legend>
                    <input type="submit" name="submitInput" value="valueでボタンテキスト">
            </fieldset>
        </form>
    </body>
</html

 

signin-action.html


<!DOCTYPE html>
    <html>
        <head>
            <title>ログインが完了しました</title>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <p>ログイン機能は未実装です……次回の更新をお待ち下さい!</p>
    </body>
</html>

これらを実行してみると、NotFound(エラー番号404)が出てしまいます。

NotFoundとは、和訳すると見つからないという意味ですね。

……そう、HTMLが見つからないのです。

HTMLが見つからないとはどういう事かと言うと、

  • 指定したパスにHTMLを置いていない
  • HTMLがそもそも存在しない
  • HTML名を間違えているので、見つけられない

などが大抵のNotFoundの原因として考えられます。(間違っていたらご指摘お願いします。上から2番目と3番目は似たようなものですが、あまり気にしないで下さい)

今回の場合、指定したパスにHTMLを置いていますし、HTMLはきちんと存在しています。

という事は、1番最後の「HTML名を間違えているので、見つけられない」が怪しそうですね。

という訳でHTML名を指定していた部分をピックアップして見直してみましょう。

 

signin.html

<body>
    <form class="" action="signin.html" method="post">
        中略
    </form>
</body

やっぱりHTML名が間違っていましたね(笑)

<form>タグのaction属性の値をよーく見てください。

"signin.html"書いてありますよね?signin-action.htmlにデータを送信したいので、正しくは"signin-action.html"と書かないといけません。

スペルミスを修正して、

signin.html

<body>
    <form class="" action="signin-action.html" method="post">
        中略
    </form>
</body>

はい、スペルミスを修正したらきちんと動作してくれましたね。

 

「おいおい、POSTメソッド関係ないじゃん!」

とあちこちから声が聞こえてきそうですが、実は僕……何を血迷ったか

「NotFoundが出るのはデータ送信が上手くいかなかったからなのではないか?

と勘違いをしていたんですよね(苦笑)

そのせいでHTMLの指定ミス(スペルミス)なんていう単純なミスだと気付かず、数時間画面とにらめっこをしていたり……

なんて事があったので、あえて上記のような見出しにしました。

気付けば単純なミスなのですが、自分自身への戒めの為にも書き残す事にしておきます。

今回のまとめ

NotFound(エラー番号404)が出たらどう対処すれば良いか?

  • 指定したパスにHTMLを置いているか確認する
  • HTMLがそもそも存在するか確認する
  • HTML名を間違えていないか確認する