Изучаю данный фреймворк. Решил немного переделать переделать исходный туториал. Я понимаю, что решение таких задач такими средствами, это забивание гвоздей даже не микроскопом, а, наверное, тепловозом, но уж очень хочется этим тепловозом поуправлять.
Изначально он (туториал) принимал строку в поле ввода на одной странице и при вводе отображал другую страницу, где эта строка выводилась. Модификация заключается в том, что я просто добавил в следующую строку поле ввода, чтобы иметь возможность это действие повторять неограниченное количество раз.
Страничка JSP, в которой производится первичный ввод строки выглядит так:
Страничка, на которой строка отображается и, по идее, должна вводиться новая, выглядит так:Код:<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib uri="http://www.springframework.org/tags" prefix="spring" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Enter Post</title> </head> <body> <h1>Enter Your Post</h1> <spring:nestedPath path="name"> <form action="" method="post"> Name: <spring:bind path="value"> <input type="text" name="${status.expression}" value="${status.value}"> </spring:bind> <input type="submit" value="OK"> </form> </spring:nestedPath> </body> </html>
Значение строки присваивается, хранится и извлекается из класса с такой логикой:Код:<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib uri="http://www.springframework.org/tags" prefix="spring" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>NewPost:</title> </head> <body> <h5>${helloMessage} (Reply)</h5> <spring:nestedPath path="name"> <form action="" method="post"> Name: <spring:bind path="value"> <input type="text" name="${status.expression}" value="${status.value}"> </spring:bind> <input type="submit" value="OK"> </form> </spring:nestedPath> </body> </html>
Класс контроллера, создающего образ выводимой строки, выглядит вот так:Код:package controller; /** * * @author stas */ public class Name { private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
И зарегистрирован в диспетчере сервлета он следующим образом:Код:package controller; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.SimpleFormController; import service.HelloService; /** * * @author stas */ public class HelloController extends SimpleFormController { private HelloService helloService; public void setHelloService(HelloService helloService) { this.helloService = helloService; } public HelloController() { //Initialize controller properties here or //in the Web Application Context setCommandClass(Name.class); setCommandName("name"); setSuccessView("newView"); setFormView("nameView"); } //Use onSubmit instead of doSubmitAction //when you need access to the Request, Response, or BindException objects @Override protected ModelAndView onSubmit(Object command) throws Exception { Name name = (Name)command; ModelAndView mv = new ModelAndView(getSuccessView()); mv.addObject("helloMessage", helloService.sayHello(name.getValue())); return mv; } }
Код:<bean class="controller.HelloController" p:helloService-ref="helloService"/>
Служба, формирующая строку вывода, имеет такой вид:
И зарегистрирована она в applicationContext.xml таким образом:Код:package service; /** * * @author stas */ public class HelloService { public String sayHello(String name) { return "Peroxide: " + name; } }
И, наконец, web.xml имеет вот такой вид:Код:<bean name="helloService" class="service.HelloService" />
Код HTML:<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" 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_3_0.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>redirect.jsp</welcome-file> </welcome-file-list> </web-app>
Проблема заключается в том, что при добавлениик ответной странице, поле ввода и кнопочка нормально отобразились. Но при вводе и нажатии твёрдо выводили null. Путём несложных манипуляций, было выяснено, что службе HelloService просто не присваивается новое значение с поля ввода ответной странички. Но со стартовой почему-то присваивается. Притом, вся разница между ними - что на ответной просто есть поле вывода, помимо всего прочего.Код:<spring:bind path="value"> <input type="text" name="${status.expression}" value="${status.value}"> </spring:bind> <input type="submit" value="OK"> </form> </spring:nestedPath>
Я добавил страничке вывода ссылку на библиотеки для обработки ввода новой строки
, что не только не исправило ситуацию, но и повлекло появление HTTP Status 500Код HTML:<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
вместо ответной странички с сообщением об ошибке:
"javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Neither BindingResult nor plain target object for bean name 'name' available as request attribute
root cause javax.servlet.jsp.JspTagException: Neither BindingResult nor plain target object for bean name 'name' available as request attribute"
Кто-то из понимающих в Spring может подсказать, какие настройки ответной странички я не учёл? И так ли она должна выглядеть? Спасибо.




Тема:
Ответить с цитированием


Социальные закладки