Я новичок в Spring MVC, но не новичок в веб-разработке на Java. Я пытаюсь создать простой пример формы -> контроллера.
У меня есть форма, контроллер формы (настроенный в контексте XML, вставленный ниже) и моя модель (простой компонент). Когда я отправляю форму, значение моего ввода текста всегда равно нулю, независимо от того. Есть идеи?
Форма пружины контроллера формы:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- controllers -->
<bean name="/home.html" class="atc.web.view.controller.HomeController" />
<!--bean name="/mirror.html" class="atc.web.view.controller.MirrorController" -->
<bean name="/url-cache.html" class="atc.web.view.controller.URLCacheFormController">
<property name="synchronizeOnSession" value="true" />
<!--property name="sessionForm" value="false"-->
<property name="commandName" value="urlForm"/>
<property name="commandClass" value="atc.web.view.model.URLBean"/>
<property name="validator">
<bean class="atc.web.view.validators.URLValidator"/>
</property>
<property name="formView" value="mirror"/>
<property name="successView" value="url-cache.html"/>
<property name="URLCachingService" ref="urlCachingService" />
</bean>
<!-- end controllers -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- custom beans -->
<bean id="breakcrumbInjectionFilter" class="atc.web.view.filter.BreadcrumbInjectionFilter">
<property name="contextPrefix" value="/home-web" />
</bean>
<!-- end custom beans -->
</beans>
JSP, которая содержит мою форму, выглядит следующим образом:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="/WEB-INF/jspf/core/taglibs.jspf" %>
<html>
<head><title>Simple tools</title></head>
<style>
.error s {
color:#FF0000;
}
</style>
<body>
<%@ include file="/WEB-INF/jspf/nav/nav.jspf" %>
Errors: <form:errors path="url" cssClass="error"/>
<form:form method="post" commandName="urlForm">
<form:input path="url" />
<input type="submit" align="center" value="Execute" />
</form:form>
</body>
</html>
Вот полный источник моего контроллера:
public class URLCacheFormController extends SimpleFormController {
private URLCachingService cachingService;
private static Logger log = Logger.getLogger(URLCacheFormController.class);
public ModelAndView onSubmit(Object command) throws ServletException {
log.debug(String.format("URLCachingFormController received request with object '%s'", command));
URLBean urlBean = (URLBean) command;
try {
URL url = new URL(urlBean.getUrl());
URLCache cache = cachingService.cacheURL(url);
cache.cacheToTempFile();
} catch (IOException e) {
log.error("Invalid URL...", e);
}
return new ModelAndView(new RedirectView(getSuccessView()));
}
protected Object formBackingObject(HttpServletRequest request) throws ServletException {
log.debug("formBackingObject() ");
return new URLBean();
}
public void setURLCachingService(URLCachingService cachingService) {
this.cachingService = cachingService;
}
}
Все вышеперечисленное приводит к следующему HTML:
<html>
<head></head>
<body>
<div><span><a href="home.html">Home </a></span><span> | <a href="url-cache.html">Page Mirror</a></span></div>
<div id="breadcrumb"><span>Your trail:<a href=""/></span></div>Attrs:<div/>
<form id="urlForm" method="post" action="/home-web/url-cache.html">
<input id="url" type="text" value="" name="url"/>
<input type="submit" align="center" value="Execute"/>
</form>
</body>
</html>
Сейчас я переопределяю doSubmitAction(Object command)
, но я все еще не использую метод. Форма отправляется, но следующее, что я знаю, мне предоставляют пустую форму (после вызова formBackingObject(HttpServletRequest request)
).
То есть, когда я отправляю, вызов регистрации в строке 1 doSubmitAction
в контроллере формы никогда не выполняется. Валидатор выполняется и завершается ошибкой (правильно добавляет сообщения об ошибках) поскольку проверяемое значение всегда равно нулю (или правильно указано, оно никогда не устанавливается) . Однако звонок на formBackingObject
всегда происходит. Атрибут запроса моей формы (форма ввода 'url') всегда нулевой.
Обновление: ОК, поэтому после некоторой серьезной отладки, предложенной serg555, и удаления проверки, я могу подтвердить, что проблема, похоже, связана с отображением параметров запроса - например, значения 'url' из форма - моей команде / бобу; то есть URL никогда не задается для моего компонента или создается заново.
Пожалуйста, помогите?