JSF / Spring запрос в области действия bean - PullRequest
1 голос
/ 29 апреля 2011

Поскольку у меня нет большого опыта в программировании на javaee, и у меня нет никого, кто хотел бы спросить, я хотел бы спросить вас.В моем коде есть одна вещь, которая мне не нравится, и я думаю, что она реализована неправильно.Мой управляемый бин - область запроса.в jsf я использую rich: pickList, который берет данные из списка.

@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;
     }

....

}

У меня также есть кнопка отправки, в которой хранятся некоторые данные.

Проблема в том, что каждый раз, когда страница выполняет какие-либо действия (например, нажимая кнопку отправки), этот метод get вызывается каждый раз и переходит на уровень обслуживания, затем в dao и в базу данных.Очевидно, что это не правильное решение.Как этого избежать?Спасибо за ваши ответы.

Ответы [ 4 ]

0 голосов
/ 18 мая 2011

Добавьте Spring RequestContextListener в web.xml, чтобы Spring мог добавить область запроса и область сеанса.

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

Ср .: 3.4.4. Другие области применения

0 голосов
/ 29 апреля 2011

На самом деле в Spring WebFlow есть «область диалога»:

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

0 голосов
/ 29 апреля 2011

Если вы используете JSF 2.0, вы можете использовать новую область просмотра, набрав @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;
    }

}

Когда вы все еще используете JSF 1.x, полезно знать, что *1001* RichFaces '<a4j:keepAlive> и Томагавка <t:saveState> имеют точно такой же эффект на запрос bean-объект scoped с вышеуказанным дизайном кода (т.е. НЕ загружать данные в геттер):

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

и

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

Я не использовал новую аннотацию RichFaces @KeepAlive, но в отношении документов она должна вести себя так же.

0 голосов
/ 29 апреля 2011

У всех есть эта проблема, потому что нет области "разговора".У вас есть «сессия» (если пользователь вошел в систему) и «запрос» (один цикл запроса / ответа).

Вам нужен способ сказать «пользователь начал разговор»затем выполните пару запросов, относящихся к беседе, и, наконец, завершите ее.

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

...