Изучаю данный фреймворк. Решил немного переделать переделать исходный туториал. Я понимаю, что решение таких задач такими средствами, это забивание гвоздей даже не микроскопом, а, наверное, тепловозом, но уж очень хочется этим тепловозом поуправлять.
Изначально он (туториал) принимал строку в поле ввода на одной странице и при вводе отображал другую страницу, где эта строка выводилась. Модификация заключается в том, что я просто добавил в следующую строку поле ввода, чтобы иметь возможность это действие повторять неограниченное количество раз.
Страничка 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"/>
Служба, формирующая строку вывода, имеет такой вид:
Код:
package service;
/**
*
* @author stas
*/
public class HelloService {
public String sayHello(String name) {
return "Peroxide: " + name;
}
}
И зарегистрирована она в applicationContext.xml таким образом:
Код:
<bean name="helloService" class="service.HelloService" />
И, наконец, web.xml имеет вот такой вид:
Код 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>
Проблема заключается в том, что при добавлении
Код:
<spring:bind path="value">
<input type="text" name="${status.expression}" value="${status.value}">
</spring:bind>
<input type="submit" value="OK">
</form>
</spring:nestedPath>
к ответной странице, поле ввода и кнопочка нормально отобразились. Но при вводе и нажатии твёрдо выводили null. Путём несложных манипуляций, было выяснено, что службе HelloService просто не присваивается новое значение с поля ввода ответной странички. Но со стартовой почему-то присваивается. Притом, вся разница между ними - что на ответной просто есть поле вывода, помимо всего прочего.
Я добавил страничке вывода ссылку на библиотеки для обработки ввода новой строки
Код HTML:
<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
, что не только не исправило ситуацию, но и повлекло появление HTTP Status 500
вместо ответной странички с сообщением об ошибке:
"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 может подсказать, какие настройки ответной странички я не учёл? И так ли она должна выглядеть? Спасибо.
Социальные закладки