Pregunta

Como no tengo mucha experiencia en la programación de Javaee y que no ha preguntado, me gustaría preguntarle. Tengo una cosa en mi código que no me gusta y creo que se implementa de manera incorrecta. Mi frijol administrado se solicita. En JSF utilizo Rich: PickList que toma datos de la lista.

@Scope("request")
public class MyBean{
     private List<String> sourceList;
     ....     

     public List<String> getsourceList() {
            //if (sourceList == null)    <--- Has no sence in request scoped bean
             { sourceList = service.loadList();
             }
             return sourceList;
     }

....

}

También tengo el botón Enviar que almacena algunos datos.

El problema es que cada vez que la página realiza algunas acciones (por ejemplo, hacer clic en el botón Enviar) Este método GET se invoca cada vez y va a la capa de servicio, luego a DAO y a la base de datos. Obviamente parece no ser una solución correcta. ¿Cómo evitarlo? Gracias por tus respuestas.

¿Fue útil?

Solución

Si estás en JSF 2.0, puedes usar el nuevo alcance de vista de @ViewScoped.

@ManagedBean
@ViewScoped
public class Bean {

    private List<Foo> foos;

    @EJB
    private FooService fooService;

    @PostConstruct
    public void init() {
        foos = fooService.list();
    }

    public List<Foo> getFoos() {
        return foos;
    }

}

Cuando todavía estás en JSF 1.x, es bueno saber que el Richfaces ' <a4j:keepAlive> y Tomahawk <t:saveState> Tenga exactamente el mismo efecto en una solicitud de frijol alcanzado con el diseño del código anterior (es decir, no cargue datos en el getter):

<a4j:keepAlive beanName="#{bean}" />

y

<t:saveState beanName="#{bean}" />

No he usado los nuevos richfaces ' @KeepAlive Anotación, pero con respecto a los documentos, también debe comportarse igual.

Otros consejos

Todos tienen este problema porque no hay alcance de "conversación". Tiene "sesión" (siempre que el usuario haya iniciado sesión) y "solicitud" (un ciclo de solicitud/respuesta).

Lo que necesitaría es una forma de decir que "el usuario ha comenzado una conversación", luego realiza un par de solicitudes que pertenecen a la conversación y finalmente la envuelven.

Como esto no es compatible con Javaee, debes emularlo. Cuando el usuario inicie la conversación, coloque el frijol en el alcance de la sesión y manténgalo allí. Cuando el usuario termine la conversación, elimine el frijol manualmente o dígale que limpie sus cachés.

En realidad, hay un "alcance de conversación" en Spring Webflow:

http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch12s06.html

Agregue el Spring RequestContextListener en Web.xml que Spring puede agregar el alcance de la solicitud y el alcance de la sesión.

<listener>
     <listener-class>
          org.springframework.web.context.request.RequestContextListener
     </listener-class>  
</listener>

CF: 3.4.4. Los otros alcances

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top