Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Один вопрос по Struts


Автор: Kraska 16.6.2006, 18:54
Достаю данные из базы, в jsp-странице пытаюсь их вывести в виде таблицы:

Код

 <logic:present name="some">

<table border="1" width='100%'>
 
 <logic:iterate id="data" name="some"> 
  <tr> 

 <td height='18' width='11%'align=center> <bean:write name="data" property="name"/> </td>
 <td height='18' width='11%'align=center> <bean:write name="data" property="age"/> </td>

  </tr>
  </logic:iterate> 
</table>

</logic:present>


..... выводятся! Но при обновлении страницы, они выводятся второй раз (т.е. таблица становится в 2 раза больше за счет продублированных! данных)


Цитата

Значит в обработчике запроса при каждом вызове в один и тот же бин с именем "some" данные заносятся без проверки есть ли там уже что-то. Проверяй перед добавлением, вот и все решение. 


Не могли бы вы подробнее рассказать, как сделать эту проверку? 
Спасибо! smile 

Автор: tux 17.6.2006, 08:03
Цитата(Kraska @  16.6.2006,  23:54 Найти цитируемый пост)
Не могли бы вы подробнее рассказать, как сделать эту проверку? 

Можно, только хорошо бы сначала посмотреть как эти данные попадают в бин. Приведи код экшна, в котором происходит переход на эту JSP-страницу. 

Автор: Kraska 17.6.2006, 10:49
Код

public class TestAction extends Action 
{
    int age; String name ; 
    ArrayList list =  new ArrayList();
    
    public ActionForward execute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
    throws IOException, ServletException 
    {
    String target = new String("success");
    
    DataSource ds;
    Connection conn=null;
    Statement statement=null;
try{
    ds = getDataSource(request, "userDB");
    conn = ds.getConnection();
    statement = conn.createStatement();
    ResultSet rs = statement.executeQuery("SELECT * FROM Table1");

    while (rs.next())
      {
age = rs.getInt(1);
name = rs.getString(2);

Data data = new Data();
data.setAge(String.valueOf(age));
data.setName(name);
 
list.add(data);
        }
request.setAttribute("some", list);

}catch(SQLException e)
  {
    e.printStackTrace();
  }

finally {
       
        try {
           conn.close();
        } catch (SQLException e) {
           e.printStackTrace();
        }
    }

        
return (mapping.findForward(target));
      }
}


Для этого перехода в struts-config.xml 

  
Код

  <action path="/index"
    type="pack.TestAction"
    scope="request" >
           <forward name="success" path="/new.jsp"/>
    </action>
 

Автор: Maksym 18.6.2006, 12:22
Kraska
Твой list определен на уровне action'а. При повтороном обращении к action'у его экземпляр уже существует в памяти (и list уже заполнен данными). Определи list в теле execute(), либо обнуляй его перед заполнением. 

Автор: Nobody 18.6.2006, 13:48
Maksym, обнулять нельзя, Action должен быть thread-safe, т.к. к его методу execute могут параллельно обращаться сколько угодно клиентов.
Kraska, не объявляй в Action'ах полей, а пользуйся только локальными переменными, и всё будет хорошо. 

Автор: Kraska 18.6.2006, 21:14
Огромное спасибо за ответы, вы мне очень помогли! smile 

Автор: Maksym 19.6.2006, 10:57
Nobody
Ты прав, только внутри execute 

Автор: stoweesh 20.6.2006, 18:59
Общепринятая практика хранить данные на форме. Данные из списка могут понадобиться тебе без перезаписывания позже. Так что лучше ArrayList положи на форму, а в экшене чисти когда надо, когда не надо - юзай заполненный. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)