Struts1 и наследство, беспорядок данных -- struts поле с участием struts-1 пол Связанный проблема

Struts1 and ActionForm inheritance, mess of data


1
vote

проблема

русский

У меня есть проблема с использованием Beans struts1 Actionform beans. Пожалуйста, смотрите часть моих Struts-Config:

 <код> <!-- RuleSearchForm is a sublass of RuleForm -->     form-beans>             <form-bean name="ruleForm"                  type="forms.RuleForm">             </form-bean>             <form-bean name="ruleSearchForm"                  type="forms.RuleSearchForm">             </form-bean>         </form-beans>     <!-- Mappings -->     <action path="/RuleList"              type="actions.RuleList"             name="ruleSearchForm"             scope="session"             validate="false">         <forward name="success" path="/html/view/RuleList.jsp"></forward>     </action>     <action path="/RuleCreate"              type="actions.RuleCreate"              name="ruleForm"              scope="request"              validate="false">         <forward name="success" path="/html/view/CreateUpdateRule.jsp"></forward>     </action>   

и части моего кода бобов My ActionForm:

 <код> public class RuleForm extends ActionForm {     protected Integer   crid;            protected List levels;             /** Some other fileds go here */      public Collection getLevels(){         if(levels == null){             levels = DAOClass.getLevels();             Collections.reverse(levels);         }         return levels;     }      /** Other getters/setters go here */ }  public class RuleSearchForm extends RuleForm{      /**      * Avoid filter reset. If needs to be reset use {@link RuleForm#resetBeanFields()} directly.      * */     public void reset(ActionMapping mapping, HttpServletRequest request) {      }      /**      * Add empty value. User should have an opportunity not to set value for this field.      * */     public Collection getLevels(){         if(levels == null || levels.size() == 0){             super.getLevels();             levels.add(0, new Level());         }         return levels;     } }   

Проблема:

  1. пользователь отправляется в /rulelist.do и видит список правил. VulaearchForm Используется в качестве боба для передачи поисковых параметров для действий /RulesList.do. Первоначально Tihs Bean является пустым, только Getlevels () возвращает «пустое значение» + список уровней, получившихся от метода SuperClass.

  2. пользователь отправляется в /createrule.do, reformform используется для сбора ввода пользователя. <Сильные> уровни Свойство используются в выборе. И я получаю там список уровней + пустой ряд. Этот пустой ряд не добавляется во вручении (названное управление). Он добавлен подкласс элемента управления. Почему Super Class Factionform Bean без статических полей, с другим именем получает значения из него вулава ???

  3. Если пользователи сохраняют правило и были перенаправлены на /rulelist.do, он видит заполненную (то есть заполненную) поиск («VulaearchForm») со значениями из «EventForm».

Что это значит? Пожалуйста, помогите, я не понимаю этот беспорядок данных между бобовыми бобами

UPD: Теперь я изменил наследование фасолей формации. Я представил Baseformbean. Этот базовый BaseBean получил два детей: EventForm и VulearchForm. Это не помогло. Еще атрибуты из одной фасоли перемещаются к другому.

мой код JSP: CREATEUPDaterule.jsp:

 <код> <html:form action="/RuleSave.do"> <html:hidden property="crid"/> <table border="0" cellpadding="2" cellspacing="0">     <tr>         <td><bean:message key="rule.levelId"/></td>         <td><html:select property="levelId">                 <html:optionsCollection  property="levels" value="clid" label="name" />             </html:select>     </tr>     <tr>         <td><bean:message key="rule.timeStart"/></td>         <td><html:text property="timeStartStr"/></td>     </tr>        <tr>         <td><bean:message key="rule.timeEnd"/></td>         <td><html:text property="timeEndStr"/></td>     </tr>         <tr>         <td>             <html:submit styleClass="wpsButtonText"><bean:message key="application.submit"/></html:submit>         </td>         <td>             <input type="button" onclick="cancelOperation()" class="wpsButtonText" value="<bean:message key="application.cancel"/>" />             <html:link styleClass="cancelLink" page="/RuleList.do"></html:link>         </td>     </tr> </table </html:form>   

my rulelist.jsp:

 <код> <html:form action="/CritRuleList.do" > <table style="width: 100%;">     <tr>         <td><bean:message key="rule.levelId"/></td>         <td><html:select property=levelId">                 <html:optionsCollection  property="levels" value="clid" label="name" />             </html:select>         </td>     </tr>     <tr>             <td><bean:message key="rule.timeStart"/></td>         <td><html:text property="timeStartStr" /></td>     </tr>     <tr>             <td><bean:message key="rule.timeEnd"/></td>         <td><html:text property="timeEndStr" /></td>     </tr>     <tr>             <td colspan="2">             <html:submit styleClass="wpsButtonText"><bean:message key="application.search"/></html:submit>             <input type="button" onclick="cancelOperation(this)" class="wpsButtonText" value="<bean:message key="critrule.searchClear"/>" />             <html:link styleClass="cancelLink" page="/RuleResetSearchFilter.do"></html:link>         </td>        </tr> </table>     </html:form>   
Английский оригинал

I have a problem using Struts1 ActionForm beans. Please, see a part of my struts-config:

<!-- RuleSearchForm is a sublass of RuleForm -->     form-beans>             <form-bean name="ruleForm"                  type="forms.RuleForm">             </form-bean>             <form-bean name="ruleSearchForm"                  type="forms.RuleSearchForm">             </form-bean>         </form-beans>     <!-- Mappings -->     <action path="/RuleList"              type="actions.RuleList"             name="ruleSearchForm"             scope="session"             validate="false">         <forward name="success" path="/html/view/RuleList.jsp"></forward>     </action>     <action path="/RuleCreate"              type="actions.RuleCreate"              name="ruleForm"              scope="request"              validate="false">         <forward name="success" path="/html/view/CreateUpdateRule.jsp"></forward>     </action> 

And parts of my Actionform beans code:

public class RuleForm extends ActionForm {     protected Integer   crid;            protected List levels;             /** Some other fileds go here */      public Collection getLevels(){         if(levels == null){             levels = DAOClass.getLevels();             Collections.reverse(levels);         }         return levels;     }      /** Other getters/setters go here */ }  public class RuleSearchForm extends RuleForm{      /**      * Avoid filter reset. If needs to be reset use {@link RuleForm#resetBeanFields()} directly.      * */     public void reset(ActionMapping mapping, HttpServletRequest request) {      }      /**      * Add empty value. User should have an opportunity not to set value for this field.      * */     public Collection getLevels(){         if(levels == null || levels.size() == 0){             super.getLevels();             levels.add(0, new Level());         }         return levels;     } } 

The problem is:

  1. User goes to /RuleList.do and sees the list of rules. ruleSearchForm used as a bean for transferring search params to /RulesList.do action. Initially tihs bean is empty, only getLevels() returns "empty value" + list of levels got from superclass method.

  2. User goes to /CreateRule.do, ruleForm is used for collecting user input. levels property is used in selectbox. And I get there list of levels + empty row. This empty row is not added in RuleForm (named ruleForm). It's added it subclass of RuleForm. Why does super class ActionForm bean with NO static fields, with other name gets values from it's sublass instance???

  3. If users saves Rule and has been redirected to /RuleList.do, the he sees populated (i.e. filled) search form ("ruleSearchForm") with values from "ruleForm".

What does it mean? Please help, I don't understand this mess of data beetween ActionForm Beans

UPD: Now, I've changed inheritance of FormAction beans. I've introduced BaseFormBean. This BaseFormBean got two children: RuleForm and RuleSearchForm. It didn't help. Still attributes from one bean are moved to another.

My jsp code: CreateUpdateRule.jsp:

<html:form action="/RuleSave.do"> <html:hidden property="crid"/> <table border="0" cellpadding="2" cellspacing="0">     <tr>         <td><bean:message key="rule.levelId"/></td>         <td><html:select property="levelId">                 <html:optionsCollection  property="levels" value="clid" label="name" />             </html:select>     </tr>     <tr>         <td><bean:message key="rule.timeStart"/></td>         <td><html:text property="timeStartStr"/></td>     </tr>        <tr>         <td><bean:message key="rule.timeEnd"/></td>         <td><html:text property="timeEndStr"/></td>     </tr>         <tr>         <td>             <html:submit styleClass="wpsButtonText"><bean:message key="application.submit"/></html:submit>         </td>         <td>             <input type="button" onclick="cancelOperation()" class="wpsButtonText" value="<bean:message key="application.cancel"/>" />             <html:link styleClass="cancelLink" page="/RuleList.do"></html:link>         </td>     </tr> </table </html:form> 

my RuleList.jsp:

<html:form action="/CritRuleList.do" > <table style="width: 100%;">     <tr>         <td><bean:message key="rule.levelId"/></td>         <td><html:select property=levelId">                 <html:optionsCollection  property="levels" value="clid" label="name" />             </html:select>         </td>     </tr>     <tr>             <td><bean:message key="rule.timeStart"/></td>         <td><html:text property="timeStartStr" /></td>     </tr>     <tr>             <td><bean:message key="rule.timeEnd"/></td>         <td><html:text property="timeEndStr" /></td>     </tr>     <tr>             <td colspan="2">             <html:submit styleClass="wpsButtonText"><bean:message key="application.search"/></html:submit>             <input type="button" onclick="cancelOperation(this)" class="wpsButtonText" value="<bean:message key="critrule.searchClear"/>" />             <html:link styleClass="cancelLink" page="/RuleResetSearchFilter.do"></html:link>         </td>        </tr> </table>     </html:form> 
</div
     
 
 

Список ответов

1
 
vote
vote
Лучший ответ
 

Это звучит очень странно, что метод подкласса будет вызываться в том случае, который вы описали. Чтобы выяснить, почему это происходит, вам нужно отладить свой код - поставить точку останова в соответствии с конструкцией SQL> begin 2 insert into test values(1); 3 update test set a = 2; 4 end; 5 / PL/SQL procedure successfully completed. 5 метода и посмотреть, если он действительно вызывается (и где вызывает вызов). < / P >.

Кроме того, вы можете попытаться переместить заполнение логики уровней вдали от формы (ы), а вместо этого делают это в действии. Итак, в действии rulecreate вы сделаете что-то подобное:

 <код> SQL> begin   2  insert into test values(1);   3  update test set a = 2;   4  end;   5  /  PL/SQL procedure successfully completed. 6  

 

It sounds very strange that a subclass method would be called in the case you've described. To find out why it's happening, you need to debug your code - put a breakpoint inside the if construct of the RuleSearchForm.getLevels() method and see if it is really called (and where did the call originate from).

Other than that, you could try to move the populating logic of levels away from the form(s) altogether, and instead do it in the action. So, in the RuleCreate action you would do something like this:

List levels = DAOClass.getLevels(); Collections.reverse(levels); request.setAttribute("levels", levels); 
</div
 
 
1
 
vote

Этот код действительно трудно следовать, и вы все еще оставлены или изменили некоторые сопоставления (rulecreate или createerule). Я предполагаю, что у вас есть недоразумение, в котором декларация формы используется для заполнения полей и коллекции опций. Когда вы создаете такую ​​форму

 <код> <html:form action="/RuleSave.do">   

Значения для поля выбора взяты из формы BEAL, связанной с исправительным действием в ваших struts-config, а не из формы действия, которое пересылается на этот JSP.

from http://struts.apache.org/1.2 .x / userguide / struts-html.html # Форма :

делает HTML-элемент ... Форма BEAL находится и создается при необходимости, на основе спецификации формы фасоли для связанного действия.

 

This code is really hard to follow, and you still left out or changed some mappings (RuleCreate or CreateRule). My guess would be that you have a misunderstanding in which form declaration is used to populate the fields and the options collection. When you create a form like this

<html:form action="/RuleSave.do"> 

The values for the select box are taken from the form bean associated with the RuleSave action in your struts-config, not from the form of the action that forwarded to this jsp.

From http://struts.apache.org/1.2.x/userGuide/struts-html.html#form:

Renders an HTML element ... The form bean is located, and created if necessary, based on the form bean specification for the associated ActionMapping.

</div
 
 
0
 
vote

[ROBLEM был решен. 1. Как сказал Томми, я проверял код DAO. Дао возвращает список бобов, хранящихся в статическом частном поле.

 <код> /**      * Add empty value. User should have an opportunity not to set value for this field.      * */     public Collection getLevels(){         if(levels == null || levels.size() == 0){             super.getLevels();             levels.add(0, new Level());         }         return levels;     }   

Так каждый раз, когда я добавляю пустую фасоль, я изменяю этот статический список объектов. Ужасная ошибка.

  1. Пармы передают. Я создал приложение Struts1 для WebSphere Portal. Портал не имеет перенаправления, потому что я работаю с портлетами, а не со страницами. Вот почему параметры запроса живут в запросе, не отображается последняя страница JSP. Это было также решено.
 

The [roblem has been resolved. 1. As Tommi said, I've inspected DAO code. DAO returns list of beans kept in static private field.

/**      * Add empty value. User should have an opportunity not to set value for this field.      * */     public Collection getLevels(){         if(levels == null || levels.size() == 0){             super.getLevels();             levels.add(0, new Level());         }         return levels;     } 

So each time I add empty bean I do change that static list of objects. Terrible bug.

  1. Params transferring. I've created struts1 app for WebSphere Portal. Portal doesn't have redirect, because I work with portlets, not with pages. That is why request parameters live in request unlit last jsp page is rendered. It has been also solved.
</div
 
 
 
 

Связанный проблема

0  Как обрабатывать исключение в стойках  ( How to handle exception in struts ) 
Как мы можем обрабатывать исключения в стойках? Пожалуйста, поделитесь образец кода. ...

2  Как сделать DateTimePicker Readly в Struts 2, совместимый с IE7  ( How to make datetimepicker readonly in struts 2 compatible with ie7 ) 
Я использую Dojo Struts2 dateTimePicker, но текстовое поле редактируется с клавиатурой. Я хочу это в readonly. Я знаю, что этот вопрос отвечает на другой по...

0  Новая страница вперед отображает старое значение  ( New page forward displays old value ) 
Я новичок в сторе и сомневался. У меня есть страница, которая перенаправляет ее в файл .do, который, в свою очередь, называет страницу Struts. Вышеуказанн...

0  Как отправить httpresponse, включая JSON и HTML  ( How to send the httpresponse including both json and html ) 
В моем приложении динамические данные извлекаются двумя способами к странице После загрузки страницы отправьте запрос AJAX и извлеките данные как JSON ...

0  Представление веб-формы Java Tomcat пытается загрузить Foo.do входной текст / X-Server-Parsed-HTML  ( Java tomcat web form submission tries to download foo do entry text x server par ) 
Веб-форма DUMPSSION пытается загрузить <код> foo.do (например). Эта загруженная форма - «Спасибо, что отправка» пользователь обычно видит после отправки. Эле...

0  Весеннее WebFlow 2.x все еще поддерживает постепенное преобразование от стойки 1.x?  ( Does spring webflow 2 x still support gradual conversion from struts 1 x ) 
Я пробую много времени, чтобы переместить этот большой проект, я работаю от ныне довольно датированных Struts 1.x Framework и на что-то новое. Главный блоки...

1  Рамочная рекомендация Запрос: Весна, стойки, Java EE?  ( Framework recommendation request spring struts java ee ) 
Последний раз, когда я смотрел на веб-приложения, консенсус казался стойки / Java EE. Теперь, похоже, что весна MVC / Java EE или Struts / Java EE являются жи...

0  Задача загрузки файлов Struts  ( Struts file upload problem ) 
У меня есть проблема в загрузке файлов в стойках Мой код файла JSP . Имя кандидата ...

1  Показать список в форме стойки 1  ( Display a list in a struts 1 form ) 
Я должен написать страницу BackOffice, чтобы определить, какие магазины должны быть отображаться на странице FrontOffice, в приложении Struts 1. Поэтому у мен...

-2  Дублируйте стойки данных  ( Duplicate post data struts ) 
Я пытаюсь проверить функцию сохранения, отправив форму, используя jmetter (отправка 100 данных). В моей функции сначала я сохраняю данные в базу данных. Но по...

2  Отключить значение в S: Выбрать  ( Disable value in sselect ) 
Если у меня есть <код> Struts тег, как это ... <код> <s:select name="country.id" list="countries" listValue="name" listKey="id" headerValue="Select Country...

5  Struts 1 Дата Формат Тег  ( Struts 1 date format tag ) 
Есть ли какой-нибудь тег в библиотеке метки Struts1, которая может отформатировать <код> java.util.Date объект? В стойках 2 я могу использовать тег <код> s...

0  Как работают атрибуты метки Struts?  ( How do struts tag attributes work ) 
В этом коде: <код> <html:text property="txtItem5" disabled="disTxtItem5"> Я вижу, что «TXTITEM5» поступает из GetXTITEM5 () в формате ActionForm, но пои...

0  Tomcat Virtual Host Config не работает для действий стойки  ( Tomcat virtual host config not working for struts actions ) 
Первоначально у меня был WebApp под названием «admin» работает нормально, развернуто внутри $ Catalina_home / webApps / Directory из Tomcat 6. Теперь я попыта...

3  Как получить доступ к базе данных MySQL с приложением Android?  ( How to access mysql database with an android application ) 
Я новичок для Struts и Android. Мы разработали приложение Struts. Теперь мы стремимся разработать некоторые модули в Android, где будут разработаны же функцио...