
前提・実現したいこと
Spring MVCを使用し、名前を入力すると画面遷移し、
名前を表示させる簡単なエコーアプリを作成しています。
https://terasolunaorg.github.io/guideline/1.0.6.RELEASE/ja/Overview/FirstApplication.html
こちらのサイトを参考にしつつ作っているのですが、
例外が発生し、実行できません。
いろいろ調べたのですが、結局わからなかったため質問させていただきました。
どのように修正すれば実行できるでしょうか。
発生している問題・エラーメッセージ
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'echoForm' available as request attribute
原因↓
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'echoForm' available as request attribute
該当のソースコード
index.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <%@ page session="false" %> <html> <head> <title>Home</title> </head> <body> <h1> Hello world! </h1> <form:form modelAttribute="echoForm" action="${pageContext.request.contextPath}/echo/hello"> <form:label path="name">Input Your Name:</form:label> <form:input path="name"/> <input type="submit" value="send"/> </form:form> </body> </html>
EchoController
package com.example.helloWorld.app.echo; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * Handles requests for the application home page. */ @Controller @RequestMapping("echo") public class EchoController { @ModelAttribute public EchoForm setupEchoForm() { EchoForm echoForm = new EchoForm(); return echoForm; } @RequestMapping public String index(Model model) { return "echo/index"; } @RequestMapping(value="hello", method = RequestMethod.POST) public String hello(EchoForm form, Model model) { model.addAttribute("name", form.getName()); return "echo/hello"; } }
EchoForm
package com.example.helloWorld.app.echo; import java.io.Serializable; public class EchoForm implements Serializable { private String name; public EchoForm() { } public String getName() { return name; } public void setName(String name) { this.name = name; } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- The definition of the Root Spring Container shared by all Servlets and Filters --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/root-context.xml</param-value> </context-param> <!-- Creates the Spring Container shared by all Servlets and Filters --> <listener> <!-- ContextLoaderListenerクラスをサーブレットコンテナのリスナクラスとして指定します. --> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <!-- AnnotationConfigWebApplicationContextクラスをサーブレットコンテナのパラメータに指定します. --> <param-name>contextClass</param-name> <param-value> org.springframework.web.context.support.AnnotationConfigWebApplicationContext </param-value> </context-param> <context-param> <!-- 作成したコンフィギュレーションクラスをサーブレットコンテナのパラメータに指定します. --> <param-name>contextConfigLocation</param-name> <param-value>example.config.AppConfig</param-value> </context-param> <!-- Processes application requests --> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
試したこと
調べた結果、「form:fromのmodelAttributeに指定する値と、
実際にControllerでバインドさせるFormオブジェクトは名前を一致させる」必要があることは理解しました。
form:fromのmodelAttributeの値 = echoForm、
Formオブジェクトの名前もechoFormとしております。
ただ上記のサイトではFormオブジェクト名はformとなっており、理由は理解できていません。
可能であればその理由も教えていただきたいです。
補足情報(FW/ツールのバージョンなど)
STS3.9.4
Tomcat8
java-version 1.8