우리는 JSF 2.2 + PrimeFaces 지원 응용 프로그램에서 SPA 방식을 사용하고 있습니다. 기본 개념은 원래 아주 잘 여기에 설명했다 : 이 콩을 @ViewScoped 사용할 때 우리가 아는 한이 SPA 방식을 사용하여,SPA JSF 2.2 응용 프로그램에서 @ViewScoped beans 제거
Refreshing dynamic content with AJAX in JSF using SPA approach
그러나 단점이있다.
실제로 동일한 JSF 뷰에 머무르기 때문에 새 SPA 내용으로 패널 그룹의 내용을 바꿀 때 @ViewScoped beans는 메모리에서 제거되지 않습니다.
나는 해결책을 찾았지만 정확한 접근 방법인지 그리고 누락 된 것이 있는지 알고 싶습니다. 새로운 SPA 후,
private void clearViewScopedBeans() {
Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();
for(Iterator<Map.Entry<String, Object>> it = viewMap.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, Object> entry = it.next();
it.remove();
}
}
이 사항을 확인해야합니다
기본적으로, SPA AJAX 요청시 렌더링 할 페이지의 이름을 보관 유지하는 우리의 NavigationService 콩,에, 우리는 항상 다음과 같은 코드를 실행 스 니펫이 렌더링되면 기존의 모든 @ViewScoped 빈이 제거됩니다.
그러나 위의 코드는 View Scoped beans 만 제거하지만 관련 View States는 제거하지 않는다고 생각합니다. 그 맞습니까 ?
나는 좀 더 논리 할 것으로 보인다 오래된 블로그 항목 발견 : http://javaevangelist.blogspot.sg/2014/08/jsf-21-tip-of-day-clearing-viewscope.html을하지만 그것뿐만 아니라 올바른 있다면 난 몰라.
또한, 우리는 여러 창 탭을 지원하려는 경우, 현재의 SPA 조각 페이지 이름을 잡고 우리의 NavigationService 빈은,뿐만 아니라 @ViewScoped해야하며, 이것은 작은 문제가 소개합니다 다음을 실행하는 경우
을 기존의 모든 @ViewScoped 빈을 제거하기위한 위의 코드 ... NavigationService 빈을 제외해야합니다 !! 그렇지 않으면 새 페이지 대신 기본 SPA 페이지 이름으로 NavigationService의 새 인스턴스가 인스턴스화되므로 항상 동일한 페이지를로드해야합니다.
우리 코드는 결국 SPA 페이지 새로 고침에서 제거하지 않으려는 "제외 된"bean 이름의 맵 (즉, SPA를 포함하는 NavigationService bean 페이지 이름)
private void clearViewScopedBeans() {
Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();
for(Iterator<Map.Entry<String, Object>> it = viewMap.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, Object> entry = it.next();
if(!exclusionViewScopedBeans.contains(entry.getKey())) {
logger.info("Removing an instance of a @ViewScoped bean -> " + entry.getKey());
it.remove();
}
}
}
이제 질문 ... 이가 SPA 상황의이 종류를 처리하기위한 올바른 접근 방식인가? 여기에 뭔가가 빠졌습니까?
의견을 보내 주시면 대단히 감사하겠습니다 ... 미리 감사드립니다. 내가 많이 찾을 시도
private void clearViewScopedBeans() {
Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();
for(Iterator<Map.Entry<String, Object>> it = viewMap.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, Object> entry = it.next();
it.remove();
}
}
하지만 SPA는 "공식적인 권장"되지 않습니다 : 내가 생각
그게 내가 사용하는 구현 - 정확한 접근 방식의 관점에서 얻을 수있는 인상은 JSF에서 이런 종류의 일을 피해야한다는 것이지만 때로는 당신이 필요합니다 – farrellmr
대화 범위의 콩을 사용하지 않는 이유는 무엇입니까? – Kukeltje
이 특정 프로젝트는 CDI 대신 Spring IoC를 사용하기 때문에 ... 지금까지 기본 제공 대화 범위가 없습니다. 필자는 지금까지 동일한 기능을 수행 할 수있는 새로운 (스프링) 스코프를 만들려고합니다. 지금까지 PrimeFaces TabView 구성 요소에 대한 TabScope를 성공적으로 만들었습니다. 각 탭에는 자체 JSF 빈 범위가있을 수 있습니다. 탭이 생성 될 때 만들어지며 탭이 닫힐 때 파괴됩니다. 같은 접근 방식을 사용하여 좀 더 일반적인 대화 범위를 개발할 수있을 것 같습니다 ... –