質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.55%

spring4で入力チェックのところで質問をさせてください。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,431

UekiKouji

score 117

いつもお世話になります。今、springの入力チェックのところを勉強させていただいております。

http://tech.pjin.jp/blog/2016/05/30/springframework6/

のサイトを参考にさせていただいています。

elipse 4.5を利用しています。
Spring Legacy ProjectのSimple Spring Web Mavenでプロジェクトを作成しました。
デフォルトのindex.jspを以下のように変更しました。
webapp/index.jsp

<!DOCTYPE html>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form"%>

<html>
<head>
<meta charset="utf-8">
<title>ログイン</title>
</head>
<body>
<f:form modelAttribute="loginForm" action="login" method="post">
<div>
ユーザ名:<input type="text" id="loginName" name="loginName">
<f:errors path="loginName" element="div" cssStyle="color:red" />
</div>
<div>
パスワード:<input type="text" id="loginPassword" name="loginPassword">
<f:errors path="loginPassword" element="div" cssStyle="color:red" />
</div>
<div>
<input type="submit" value="ログイン">
</div>
</f:form>

</body>
</html>


submitのボタンを押すと
jp.ssie.helloworld.web.LoginController

package jp.ssie.helloworld.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import jp.ssie.helloworld.form.LoginForm;
import jp.ssie.helloworld.validation.GroupOrder;

@Controller
public class LoginController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String index(Model model) {
return "index";
}

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(Model model, @Validated(GroupOrder.class) @ModelAttribute("loginForm") LoginForm loginForm, BindingResult result) {
if(result.hasErrors()) {
return "index";
}

model.addAttribute("loginName", loginForm.getLoginName());

return "top";

}
}


のPostに飛びます。未入力の際、エラーメッセージが出力されます。

エラー内容

このような原因は、postしたときwebapp/WEB-INF/viewにindex.jspがないです。
ただ、jp.ssie.helloworld.web.LoginControllerでgetしたときは、webapp/index.jspに飛ぶのに
postしたら、webapp/WEB-INF/viewにとぶのでしょうか。設定の方法がわからないので教えてほしいです。
また、エラー画面でApache Tomcat/6.0.37と表示されています。プロジェクトを実行するときtomcat7を使用したのにこのような画面がでるのは、おかしいのですがspring側で設定を変える必要があるのでしょうか。

【質問内容まとめ】
・getのときは、webapp/index.jspへ流れるが、postのときは、なぜ、webapp/WEB-INF/viewに流れるのか理由がしりたいのとこの設定を変えるための方法も知りたい。

・tomcat7でプロジェクトを実行したのに、エラー内容でtomcat/6.0.37とでるのはなぜか理由が知りたいです。

よろしくおねがいします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

・getのときは、webapp/index.jspへ流れるが、postのときは、なぜ、webapp/WEB-INF/viewに流れるのか理由がしりたいのとこの設定を変えるための方法も知りたい。

(2016-08-24 修正)

実際のweb.xmlの内容を確認していないので推測ですが、おそらくこういうことでしょう。
web.xmlwelcome-file-listを記載していない場合、デフォルトのweb.xml(サーバーのconfにある)のwelcome-file-listに書かれているindex.jspが有効になってしまうため、/にアクセスするとindex.jspを開こうとします。
リクエストマッピングで/を設定していても、GETの場合はwelcome-file-listの方が優先されてしまうようです。

トップページとしてのindex.jspが不要であれば、index.jspwebapp/ではなく、webapp/WEB-INF/view/に置いた方が良いでしょう。

(以下、元の回答)

まず、index.jspwebapp/ではなく、webapp/WEB-INF/viewに置いてください。

logingetにした場合にwebapp/index.jspに飛ぶという方がおかしいですね。何か設定でそうなっているのかも知れませんが、今のところはちょっと分かりません。

コントローラーにmethod = RequestMethod.POSTだけを設定しているので、この場合は「未入力の際、エラーメッセージが出力されます。」の下の画面のように"Request method 'GET' not supported"になるのが普通だと思います。
実際そうなりました。

リクエストの戻り値を文字列にした場合は、その名前のJSPファイルを結果画面として開こうとします。
webapp/WEB-INF/viewの場所はSpringの設定ファイルのviewResolverという項目に設定されていると思います。

(元の回答、ここまで)

・tomcat7でプロジェクトを実行したのに、エラー内容でtomcat/6.0.37とでるのはなぜか理由が知りたいです。

"tomcat7"という名前でTomcat6サーバーが構築されていませんか?
設定の"サーバー"→"ランタイム環境"を開いて、Tomcat7を選択して編集を押し、インストールディレクトリーを確認して下さい。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/26 07:44

    ご連絡が遅くなりすいません。
    ご回答ありがとうございます。

    キャンセル

  • 2016/08/26 07:46

    エラー内容でtomcat/6.0.37となる理由はわかりませんでした。

    キャンセル

  • 2016/08/26 07:49

    しかし、デフォルトで作成されるwebapp/index.jspを削除し、webapp/viewの下に持ってきても動いたので、この設定で行こうと思います。ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.55%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる