Struts2, использующий ModelDriven, не загружает значения POST-формы в модель

Я пытаюсь создать динамическое веб-приложение, используя ModelDriven интерфейс со Struts2. Я работал со Struts1, но это моя первая попытка в Struts2.

Я могу заполнить форму из значений, хранящихся в базе данных, но когда я изменяю значения и пытаюсь обновить базу данных, значения формы не загружаются в модель.

Я загрузил весь проект здесь на https://bitbucket.org/tfeinstein/vikos.git (для этого требуется база данных MySQL для запуска на данном этапе).

После загрузки проекта:

  1. Идти к http://localhost/Vikos/secure/user,
  2. Вы будете перенаправлены на страницу входа. Введите: логин электронная почта = consumer@test.com и пароль = пароль.
  3. Вы попадете в User страница с заполненной формой из базы данных. Если вы обновите поле Фамилия и нажмете <Update> Кнопка, это должно обновить значение в базе данных, но оно не передает значение обратно.

Как получить значения из формы HTML в модель?

ОБНОВИТЬ

Я переименовал этот пост и немного изменил его содержание, чтобы более точно описать происходящее. Я также добавил код отладки в UserAction.prepare() метод. Похоже, Struts2 пытается загрузить UserModel свойства с массивом String (parmValues) в отличие от 1-го элемента массива параметров (correctVal).

public void prepare() throws Exception {

    // BEGIN - ADDED FOR DEBUGGING PURPOSES         
    Map parameters = request.getParameterMap();
    Set keys = parameters.keySet();
    Iterator iter = keys.iterator();
    String key;
    String[] parmValues;
    while (iter.hasNext()) {
        key = iter.next().toString();

        parmValues = (String[])(String[])parameters.get(key);
        if (parmValues.length == 1) {
            String correctVal = parmValues[0];
            System.out.println(correctVal);  // This is printing out the correct updated form values.
        }
    }
    // END - ADDED FOR DEBUGGING PURPOSES

    determineCrudType();
}

13: 21: 42.773 [http-bio-80-exec-7] ОШИБКА coxiParametersInterceptor - Уведомление разработчика (установите для Struts.devMode значение false, чтобы отключить это сообщение): неожиданное исключение при установке 'email' для класса 'com.codedeart.vikos.action.UserAction: Ошибка установки выражения 'email' со значением '[Ljava.lang.String; @ 7e227c19'

13: 21: 42.775 [http-bio-80-exec-7] ОШИБКА coxiParametersInterceptor - Уведомление разработчика (установите для Struts.devMode значение false, чтобы отключить это сообщение): неожиданное исключение при установке 'firstName' в классе 'com.codedeart.vikos.action.UserAction: Ошибка установки выражения 'firstName' со значением '[Ljava.lang.String; @ 378da3ff'

13: 21: 42.776 [http-bio-80-exec-7] ОШИБКА coxiParametersInterceptor - Уведомление разработчика (установите для Struts.devMode значение false, чтобы отключить это сообщение): неожиданное исключение при установке 'lastName' в классе 'com.codedeart.vikos.action.UserAction: Ошибка установки выражения 'lastName' со значением '[Ljava.lang.String; @ 3409d6d7'

13: 21: 42.778 [http-bio-80-exec-7] ОШИБКА coxiParametersInterceptor - Уведомление разработчика (установите для Struts.devMode значение false, чтобы отключить это сообщение): неожиданное исключение при установке 'middleName' для класса 'com.codedeart.vikos.action.UserAction: Ошибка установки выражения 'middleName' со значением '[Ljava.lang.String;@13b29db7'

ОБНОВЛЕНИЕ - Раунд 2

Похоже, что эта проблема похожа на те, о которых сообщили другие, которые исправили ее с помощью пользовательских преобразователей типов. Я попытался реализовать пользовательский конвертер типов на основе этого руководства. Я еще не дошел до того, чтобы на самом деле делать какое-либо преобразование типов, так как методы на моем UserType Converter не запускаются. Я загрузил последний код в BitBucket.

PS:

У меня были проблемы с моей реализацией JSP и бэкэндов. Ответ заключается в том, чтобы следовать советам Ученны и Романа ниже. Я буду продолжать обновлять свой проект в BitBucket, так что, надеюсь, больше никто не будет делать эти ошибки.

2 ответа

Решение

Вы неправильно сопоставили форму с user действие. user действие сопоставлено с пространством имен по умолчанию, но форма сопоставлена ​​с /modelDriven Пространство имен. Таким образом, при отправке формы вы должны получить ошибку 404. Удалить namespace атрибут из тега формы, который должен быть тегом Struts. Если вы не установите атрибут пространства имен тега формы, действие может использовать пространство имен по умолчанию. Подробнее о пространствах имен и их конфигурации вы можете найти здесь. Код для замены

<s:form accept-charset="UTF-8" action="user" method="POST" theme="simple">

Примечание, добавлено simple Тема для формы, чтобы не влиять на дизайн HTML. Кроме того, если вы работаете в режиме разработчика, предупреждения должны исчезнуть, если действие в теге формы Struts отображается правильно.

Также обратите внимание, что строки в Java сравниваются с equals метод, а не ==, Итак crudType переменная может не изменяться, и это предотвращает операцию обновления.

Во -первых

I have some issues with your jsp, Почему вы не используете struts2 tag libraries (s:textfield) для тебя input, See if you can change that. Также добавьте namespace="/" на ваш form элемент.

во-вторых

+ Изменить UserModel Constructor from

public class UserModel extends BaseModel {    
    private UserVo userVo;      
    public UserModel() {
        super();
    }
}

в

public class UserModel extends BaseModel {    
    private UserVo userVo;      
    public UserModel() {
        super();
            userVo = new UserVo();
    }
}

Thirdly

Получить ваши BaseModel реализовать java.io.Serializable т.е.

public abstract class BaseModel implements java.io.Serializable
Другие вопросы по тегам