Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > SpringMVC. Form submit doesn't work


Автор: Старовъръ 2.6.2009, 11:25
startGame.jsp
Код

<form:form commandName="command">
    <jsp:include page="/WEB-INF/template/inputFields.jsp"/>
    <br/><input type="submit" value="<spring:message code="startGame.start"/>"/>
</form:form>
Кусок из DispatcherServlet:
Код

    <bean name="startGameController"
          class="ru.javatalks.jtchess.web.controller.StartGameController">
        <property name="commandName" value="command"/>
        <property name="successView" value="home.do"/>
        <property name="formView" value="startGame.do"/>
    </bean>
Когда нажимаю на сабмит формы, onSubmit() контроллера не вызывается, форма просто перегружается и все. Контроллер расширяет SimpleFormController. 
Вот собственно и вся проблема smile

Автор: garbuz 2.6.2009, 11:40
Возможно из-за валидации, или из-за бандинга данных в объекты. Давай код показывай smile

Автор: Старовъръ 2.6.2009, 11:44
Код чего?

Автор: garbuz 2.6.2009, 12:13
Цитата(Старовъръ @  2.6.2009,  11:44 Найти цитируемый пост)
Код чего?

Контроллера и вьюхи.
А еще советую в контроллере переопределить методы родителей, с простым вызовом super, расставить брэйкпоинты и тогда точной поймешь, где все обрывается. Хотя бы вот этот метод
Код

@Override
    protected ModelAndView processFormSubmission(HttpServletRequest request, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception {
        return super.processFormSubmission(request, httpServletResponse, o, e);    //To change body of overridden methods use File | Settings | File Templates.
    }

Если до него не дойдет вызов, тогда скорее всего валидация.

Автор: Старовъръ 2.6.2009, 12:28
Этот метод отрабатывает) Страницу я выше показал, вот контроллер, все лишнее убрал:
Код

import org.joda.time.DateTime;
import org.joda.time.Period;
import org.springframework.validation.BindException;
import org.springframework.validation.Errors;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
import ru.javatalks.jtchess.model.entity.game.BaseGame;
import ru.javatalks.jtchess.model.entity.game.Color;
import ru.javatalks.jtchess.model.entity.game.Player;
import ru.javatalks.jtchess.model.entity.user.User;
import ru.javatalks.jtchess.model.helper.FigureHelper;
import ru.javatalks.jtchess.model.security.AuthorizationService;
import ru.javatalks.jtchess.model.service.GameDetailsService;
import ru.javatalks.jtchess.model.service.UserDetailsService;
import ru.javatalks.jtchess.web.form.FormInput;
import ru.javatalks.jtchess.web.form.StartGameForm;
import ru.javatalks.jtchess.web.util.GameUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;

/**
 * 23.05.2009 13:57:57
 *
 * @author ctapobep
 */
public class StartGameController extends SimpleFormController {
    public StartGameController() {
        setCommandClass(StartGameForm.class);
    }

    @Override
    protected Map referenceData(HttpServletRequest request, Object command,
                                Errors errors) throws Exception {
        Map<String, Object> attributes = new HashMap<String, Object>(3);
        attributes.put("inputs", getInputs());
        return attributes;
    }

    @Override
    protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response,
                                    Object command, BindException e) throws Exception {
        StartGameForm form = (StartGameForm) command;
        GameUtil gameUtil = new GameUtil(gameDetailsService, userDetatilsService);
        User user = gameUtil.getUser(AuthorizationService.getPrincipal().getUsername());

        Set<Player> players = new HashSet<Player>(1);
        players.add(createPlayerForCurrentUser(form));

        BaseGame game = new BaseGame();
        if (form.getTitle().length() == 0) {
            form.setTitle("Unnamed");
        }
        game.setDateBegin(new DateTime());
        game.setTitle(form.getTitle());
        game.setPlayers(players);
        user.addPlayer(players.iterator().next());
        gameDetailsService.saveGame(game);
        return new ModelAndView(getSuccessView());
    }
}


Автор: garbuz 2.6.2009, 13:03
а где код inputFields.jsp, полей то в вышеуказанном коде не видно smile 
И покажи класс StartGameForm

Добавлено через 3 минуты и 25 секунд
Да, вот еще workflow SimpleFormController'a, может пригодится
GET
http://radikal.ru/F/s41.radikal.ru/i091/0906/ba/7091c72f67fe.png.htmlPOSThttp://radikal.ru/F/s60.radikal.ru/i169/0906/fb/e19876c92df8.png.html

Автор: Старовъръ 2.6.2009, 13:30
Цитата

а где код inputFields.jsp, полей то в вышеуказанном коде не видно
А толку от него, сабмит же не работает) 
Код

<table>
    <c:forEach var="item" items="${inputs}">
        <tr>
            <td><spring:message code="${item.label}"/></td>

            <c:if test="${item.inputType eq 'INPUT'}">
                <td><form:input path="${item.inputPath}"/></td>
            </c:if>
            <c:if test="${item.inputType eq 'PASSWORD'}">
                <td><form:password path="${item.inputPath}"/></td>
            </c:if>
            <c:if test="${item.inputType eq 'TEXTAREA'}">
                <td><form:textarea path="${item.inputPath}"/></td>
            </c:if>
            <c:if test="${item.inputType eq 'COMBO'}">
                <td><form:select path="${item.inputPath}">
                    <c:forEach items="${item.data}" var="item">
                        <form:option value="${item.value}">
                            <c:out value="${item.key}"/>
                        </form:option>
                    </c:forEach>
                </form:select></td>
            </c:if>
            <td><form:errors path="${item.inputPath}"/></td>
        </tr>
    </c:forEach>
</table>
Вот поля из StartGameForm.java:
Код

    private String title;
    private int minimumOpponentRatingDifference;
    private int maximumOpponentRatingDifference;
    private boolean withoutRating;
    private String color;
    private DateTime timePerMove;
Остальное - геттеры/сеттеры.

Автор: garbuz 2.6.2009, 14:06
Либо я что-то не понял, либо еще что-то, но 
1) Объект StartGameForm, который ты пыатешься получить в onSubmit, ты должен создаваться в formBackingObject.
2) Этот объект будет заполняться данными со страницы, для этого нужно явно указать какое поле на странице соответствует полю объекта. А у тебя, насколько я вижу, поля на странице не соответствуют полям объекта.

Автор: Старовъръ 2.6.2009, 14:16
1. Я в конструкторе указал комманд-класс, он должен создаться и без переопределения formBackingObject().
2. Я создал спец. класс, в который помещаю тип инпута, текст и прочую информацию. Создаю коллекцию объектов этих классов и на странице прохожу по ней и создаю нужные инпуты. 
3. Это на сабмит не влияет smile
4. Валидации у меня нет для этой формы(на будущее).

Автор: Старовъръ 3.6.2009, 18:05
Проблема была в том, что комманд-объект принимал строку в то время, когда поле было другого типа. Вылетало исключение, но никак не отображалось... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)