Проверка struts2 и метод подготовки, связанный с этим

У вас есть действие custprofileview, которое показывает страницу JSP со всеми сведениями о клиенте, а в моем JSP все поля похожи на мои

<s:textfield name="custprofileVO.email" value="%{custprofileVO.email}" />
<s:textfield name="custprofileVO.phone" value="%{custprofileVO.phone}" />

и так далее, и есть кнопка отправки, которая вызывает действие updatecustprofile.

В updatecustprofile Action вместо прямого сопоставления свойств у меня есть переменная-член private CustprofileVO custprofileVO; с сеттером и геттером.

В классе CustprofileVO у меня есть такие поля, как email, phone и все остальные поля с их методами установки и получения.

Проблема: в updatecustprofile Action я реализую Prepareable интерфейс, а при реализации метода prepare() у меня есть custprofileVO.setDefaultID("Select"); и я устанавливаю еще 4 поля, но когда я запускаю программу, нажимая кнопку отправки, я получаю NPE в самом первая строка custprofileVO.setDefaultID("Select");

Похоже, что фреймворк не создает экземпляр CustprofileVO custprofileVO. Если я вручную создам экземпляр custprofileVO чуть выше настройки поля (выполнив custprofileVO = new CustprofileVO(), тогда это сработает. Проблема в том, что в идеале структура struts2 должна дать мне экземпляр, который он не делает, хочу понять причину.

Кроме того, если я вручную установил custprofileVO в методе подготовки, он работает, но я также применил проверку с использованием XML, где мое имя поля custprofileVO.email, его проверка, а затем custprofileVO.phone его проверка.

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

Почему удаляются данные?


person user3292748    schedule 05.04.2014    source источник
comment
Разве вы не можете просто опубликовать свой код? Трудно понять, что это за код, прочитав целую страницу (неформатированных) предложений :| Пожалуйста, опубликуйте соответствующие части: 1) struts.xml 2) Класс действий, чтобы получить лучшую помощь. А пока я выберу наиболее вероятный ответ: неправильный стек.   -  person Andrea Ligios    schedule 07.04.2014


Ответы (1)


Вы не должны создавать экземпляр объекта, исходящего из JSP.

Чтобы получить его в методе prepare(), запустите Prepare Interceptor перед Param Interceptor, нужно использовать специальный стек: paramsPrepareParamsStack

 <!-- An example of the paramsPrepareParams trick. This stack
             is exactly the same as the defaultStack, except that it
             includes one extra interceptor before the prepare interceptor:
             the params interceptor.

             This is useful for when you wish to apply parameters directly
             to an object that you wish to load externally (such as a DAO
             or database or service layer), but can't load that object
             until at least the ID parameter has been loaded. By loading
             the parameters twice, you can retrieve the object in the
             prepare() method, allowing the second params interceptor to
             apply the values on the object. -->
        <interceptor-stack name="paramsPrepareParamsStack">
            <interceptor-ref name="exception"/>
            <interceptor-ref name="alias"/>
            <interceptor-ref name="i18n"/>
            <interceptor-ref name="checkbox"/>
            <interceptor-ref name="multiselect"/>
            <interceptor-ref name="params">
                <param name="excludeParams">^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param>
            </interceptor-ref>
            <interceptor-ref name="servletConfig"/>
            <interceptor-ref name="prepare"/>
            <interceptor-ref name="chain"/>
            <interceptor-ref name="modelDriven"/>
            <interceptor-ref name="fileUpload"/>
            <interceptor-ref name="staticParams"/>
            <interceptor-ref name="actionMappingParams"/>
            <interceptor-ref name="params">
                <param name="excludeParams">^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param>
            </interceptor-ref>
            <interceptor-ref name="conversionError"/>
            <interceptor-ref name="validation">
                <param name="excludeMethods">input,back,cancel,browse</param>
            </interceptor-ref>
            <interceptor-ref name="workflow">
                <param name="excludeMethods">input,back,cancel,browse</param>
            </interceptor-ref>
        </interceptor-stack>
person Andrea Ligios    schedule 07.04.2014
comment
вызывается ли prepare() перед validate()? или после? - person Govinda Sakhare; 19.05.2016
comment
Поскольку prepare() запускается перехватчиком Prepare, а validate() запускается перехватчиком Validation, это зависит от того, как вы настроили их в своем стеке, но в стеке по умолчанию, в paramsPrepareParamsStack и в основном в каждом стеке, который не полностью перепутался, prepare() всегда будет выполняться перед validate(). - person Andrea Ligios; 19.05.2016