Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSF + request bean... обновление со второго раза 
V
    Опции темы
leoric
Дата 25.7.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.7.2008

Репутация: нет
Всего: нет



Попытался создать первое приложение на JSF. Получилось наполовину... Вот код странички index.jsp:
Код

<%@ page contentType="text/html;charset=UTF-8" errorPage="/error.jsp"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>bla</title>
  </head>
  <bоdy><f:view>
      <h:dataTable value="#{MyBean.courses}" var="assa" border="2">
        <!--oracle-jdev-comment:Faces.RI.DT.Class.Key:project1.Course-->
        <h:column>
          <f:facet name="header">
            <h:outputText value="Id"/>
          </f:facet>
          <h:outputText value="#{assa.id}"/>
        </h:column>
        <h:column>
          <f:facet name="header">
            <h:outputText value="Title"/>
          </f:facet>
          <h:outputText value="#{assa.title}"/>
        </h:column>
      </h:dataTable>
      <h:form>
        <h:outputText value="where id="/>
        <h:inputText binding="#{MyBean.id}"/>
        <h:commandButton value="submit" action="#{MyBean.submit_action}"
                         type="submit"/>
        <h:outputText binding="#{MyBean.outputText}"/>
      </h:form>
    </f:view></bоdy>
</html> 

К странице привязан бин MyBean класса CourseGetter, scope=request.
Код:
Код

public class CourseGetter {
    private int id=0;
    private HtmlOutputText outputText;

    List <Course> Courses;
    public CourseGetter() {
        outputText=new HtmlOutputText();
        outputText.setValue("default");
        Courses=new ArrayList<Course>();
        generateCourses();
    }
    public List <Course> getCourses() {
            generateCourses();
            return Courses;
    }
    private void generateCourses() {
        Locale.setDefault(new Locale("en","us"));
        EntityManagerFactory emf= Persistence.createEntityManagerFactory("default", new java.util.HashMap());
        EntityManager em=emf.createEntityManager();
        Query query;
        if(id!=0){
            query = em.createNamedQuery("Course.findByID");
            query.setParameter("id",  id);
        }
        else
            query = em.createNamedQuery("Course.findAll");
           
        Courses=query.getResultList();
    }

    public synchronized String  submit_action() {
        outputText.setValue(id);
        generateCourses();
     
        return "index";
    }

    public void setId(HtmlInputText id) {
        String str =id.getValue().toString();
        this.id = Integer.parseInt(str);
    }

    public HtmlInputText getId() {
        HtmlInputText txt=new HtmlInputText();
        txt.setValue(id);
        return txt;
    }

    public void setOutputText(HtmlOutputText outputText) {
        this.outputText = outputText;
    }

    public HtmlOutputText getOutputText() {
        return outputText;
    }


Все это работает под Tomcat'ом 5.5. Почему-то обновление происходит только со второго раза - то есть ввожу в поле inputText значение 1, нажимаю submit - в поле ouputText появляется 0 (как будто старое прочиталось). Нажимаю еще раз submit - тогда страница обновляется так, как нужно - в outputText - 1 , в dataTable - выбранные значения... Помогите понять, что я не так делаю...
P.S faces.xml выглядит следующим образом:
Код:
Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC
  "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
  "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config xmlns="http://java.sun.com/JSF/Configuration">
  <managed-bean>
    <managed-bean-name>MyBean</managed-bean-name>
    <managed-bean-class>project1.CourseGetter</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
  </managed-bean>
  <navigation-rule>
    <from-view-id>/index.jsp</from-view-id>
    <navigation-case>
      <from-outcome>index</from-outcome>
      <to-view-id>/index.jsp</to-view-id>
    </navigation-case>
  </navigation-rule>
</faces-config> 



Это сообщение отредактировал(а) leoric - 25.7.2008, 18:24
PM MAIL   Вверх
Dwyane
Дата 26.7.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 8.5.2007

Репутация: 1
Всего: 1



Попробуй request поменять на session.
PM MAIL   Вверх
leoric
Дата 28.7.2008, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.7.2008

Репутация: нет
Всего: нет



Не помогает... 
PM MAIL   Вверх
necromancer
Дата 28.7.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



=) менять request на session это радикально =)
<h:inputText binding="#{MyBean.id}"/>
заменяем на 
<h:inputText value="#{MyBean.id}"/>

в классе:
public class CourseGetter {
    private int id=0;
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}

   public synchronized String  submit_action() {
        generateCourses();
        return "index";
    }
}

можно вопрос, синхронизет зачем тут? =)
что бы 10 пользователей не могли одновременно нажать кнопку? =)


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
Dwyane
Дата 28.7.2008, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 8.5.2007

Репутация: 1
Всего: 1



так а что не правильно у leoric? Смена binding на value не должна как-то кардинально менять ситуацию. Хотя безусловно, в 95% ситуациях inputText успользуеться с параметром value.
PM MAIL   Вверх
leoric
Дата 29.7.2008, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.7.2008

Репутация: нет
Всего: нет



Не знаю, что было неправильно, но вопрос решился. Я написал простейшее JSF приложение без dataTable. Оно заработало как ожидалось. Тогда я сравнил коды и поправил исходное приложение. В результате получил приложение, которое работало верно. Итак, из изменений - перенес всю работу в submut метод, ассоциировал каждый элемент JSP страницы с своим полем бина. Область видимости бина - request. 
Код

package project1;

import java.util.List;
import java.util.Locale;
import javax.faces.component.html.HtmlInputText;
import javax.faces.component.html.HtmlOutputText;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;


public class CourseGetter {
    private int id=0;
    private HtmlOutputText outputText;

    
    private HtmlInputText inputText;

    public CourseGetter() {
    }
    public List <Course> getCourses() {
        Locale.setDefault(new Locale("en","us")/*new Locale("ru","ru")*/);
        EntityManagerFactory emf= Persistence.createEntityManagerFactory("default", new java.util.HashMap());
        EntityManager em=emf.createEntityManager();
        try{
            Query query; 
            if(id!=0){
                query = em.createNamedQuery("Course.findByID");
                query.setParameter("id",  id);
            }
            else 
                query = em.createNamedQuery("Course.findAll");
            
            return query.getResultList();
        }
        finally{
            em.close();
        }
    }
 
    public String  submit_action() {
        this.outputText.setValue(this.inputText.getValue());
        id=Integer.parseInt(this.inputText.getValue().toString());
        return null;
    }

   
    public void setOutputText(HtmlOutputText outputText) {
        this.outputText = outputText;
    }

    public HtmlOutputText getOutputText() {
        return outputText;
    }

    public void setInputText(HtmlInputText inputText) {
        this.inputText = inputText;
    }

    public HtmlInputText getInputText() {
        return inputText;
    }
}

А вот код JSP:
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ page contentType="text/html;charset=UTF-8" errorPage="/error.jsp"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"/>
    <title>bla</title>
  </head>
  <body><f:view>
      <h:dataTable value="#{MyBean.courses}" var="assa" border="2">
        <!--oracle-jdev-comment:Faces.RI.DT.Class.Key:project1.Course-->
        <h:column>
          <f:facet name="header">
            <h:outputText value="Id"/>
          </f:facet>
          <h:outputText value="#{assa.id}"/>
        </h:column>
        <h:column>
          <f:facet name="header">
            <h:outputText value="Title"/>
          </f:facet>
          <h:outputText value="#{assa.title}"/>
        </h:column>
      </h:dataTable>
      <h:form>
        <h:outputText value="where id="/>
        <h:inputText binding="#{MyBean.inputText}" id="InputText"/>
        <h:commandButton value="submit" action="#{MyBean.submit_action}"
                         type="submit" />
        <h:outputText id="OutputText" binding="#{MyBean.outputText}"/>
      </h:form>
    </f:view></body>
</html>

Интересно все же, почему оно изначально не работало...
PM MAIL   Вверх
necromancer
Дата 29.7.2008, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



с биндингом вообще работать не очень приятно. пусть + не затмевают вам -
а из минусов это привязка к jsf api и следовательно не возможность использования кода где либо еще
т.е допустим получить некий простой объект и передать его по сети. опять таки сериализация сесии и многое другое.
если уж необходимо получить ссылку на элоемент на странице то лично я использую:
facesContext.getViewRoot().findComponent("searchresult")
мало того данный подход поможет при помощи instansof оптимизировать код под любые параметры.


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0707 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.