2014-01-19 1 views
2

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

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

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

После того, как у вас есть проект загружен:

  1. Перейти к http://localhost/Vikos/secure/user.
  2. Вы будете перенаправлены на страницу входа. Введите: logon email = [email protected] и пароль = пароль.
  3. Вы будете отправлены на страницу User с формой, заполненной из базы данных. Если вы обновите поле «Фамилия» и нажмите кнопку <Update>, оно должно обновить значение в базе данных, но оно не передает значение обратно.

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

UPDATE

Я переименованная этот пост и изменил содержание немного, чтобы более точно описать то, что происходит. Я также добавил код отладки к методу UserAction.prepare(). Похоже, Struts2 пытается загрузить свойства UserModel с помощью массива String (parmValues) в отличие от первого элемента массива параметров (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-био-80-Exec-7] ERROR coxiParametersInterceptor - Уведомление разработчика (набор struts.devMode ложь, чтобы отключить это сообщение): Неожиданное исключение пойманы параметр ' электронная почта 'на' класса com.codedeart.vikos.action.UserAction: Ошибка установки выражения 'электронной почты' со значением '[Ljava.lang.String; @ 7e227c19'

13: 21: 42,775 [HTTP-био- 80-exec-7] ERROR coxiParametersInterceptor - Уведомление разработчика (установите struts.devMode в false, чтобы отключить это сообщение): Неожиданный Исключение пойманы установка 'ПгвЬЫате' на «класса com.codedeart.vikos.action.UserAction: Ошибка установки выражения 'ПгвЬЫате' со значением '[Ljava.lang.String; @ 378da3ff'

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

13: 21: 42,778 [HTTP-био-80-Exec-7] ОШИБКА coxiParametersInterceptor - Dev Уведомление eloper (set struts.devMode to false, чтобы отключить это сообщение): Неожиданное исключение поймало параметр 'middleName' on 'class com.codedeart.vikos.action.UserAction: установка выражение 'MiddleName' со значением ошибки '[Ljava.lang.String; @ 13b29db7'

UPDATE - Round 2

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

P.S .:

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

+0

Опубликовать полный стек, он выглядит как предупреждение, но значения заданы для модели, а не для действия. –

ответ

0

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

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

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

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

+0

Роман, спасибо за весь анализ. Я внес изменения, которые вы рекомендовали, но проблема все еще сохраняется.Я сказал, что ценности не отправляются обратно, но они есть. Проблема выглядит так: Struts2 пытается загрузить UserModel со значениями параметров запроса, которые не полностью разрешены (см. Выше). –

+0

Вы должны использовать входные значения в квотах в JSP. –

+0

Также удалите метод подготовки, это глючит! Используйте отдельное действие для каждой операции. –

0

Во-первых

У меня есть некоторые проблемы с jsp. Почему вы не используете библиотеки тегов struts2(s:textfield) для вашего input. Посмотрите, можете ли вы это изменить. Также добавьте namespace="/" в ваш элемент form.

Во-вторых

Изменение UserModel Конструктор из

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(); 
    } 
} 

В-третьих

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

public abstract class BaseModel implements java.io.Serializable 
+0

Uchenna, я применил все изменения, которые вы рекомендовали. Ошибки ParametersInterceptor исчезли, когда я создал экземпляр UserVo внутри конструктора UserModel, который имеет смысл теперь, когда я вижу, что он никогда не создавался. ПользовательModel по-прежнему не заполняется значениями POSTed формы. Я загружу свои изменения и продолжу играть с этим. Любые другие мысли приветствуются. Спасибо, Тодд –

+0

Ученья, Спасибо за помощь. Между советом, что Роман и вы дали ему, похоже, что в этот момент все идет вперед. Очень признателен. Спасибо. –