Struts2, использующий ModelDriven, не загружает значения POST-формы в модель
Я пытаюсь создать динамическое веб-приложение, используя ModelDriven
интерфейс со Struts2. Я работал со Struts1, но это моя первая попытка в Struts2.
Я могу заполнить форму из значений, хранящихся в базе данных, но когда я изменяю значения и пытаюсь обновить базу данных, значения формы не загружаются в модель.
Я загрузил весь проект здесь на https://bitbucket.org/tfeinstein/vikos.git (для этого требуется база данных MySQL для запуска на данном этапе).
После загрузки проекта:
- Идти к
http://localhost/Vikos/secure/user
, - Вы будете перенаправлены на страницу входа. Введите: логин электронная почта = consumer@test.com и пароль = пароль.
- Вы попадете в
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