서블릿 관련 클래스에서 이름으로 JSF 관리 Bean 가져 오기
@ManagedBeans
이름 으로 참조하고 싶은 사용자 지정 서블릿 (AJAX / JSON 용)을 작성하려고합니다 . 다음을 매핑하고 싶습니다.
http://host/app/myBean/myProperty
에:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
일반 서블릿에서 이름으로 빈을로드 할 수 있습니까? 사용할 수있는 JSF 서블릿이나 도우미가 있습니까?
나는이 모든 것이 너무 명백한 봄에 망가진 것 같다.
서블릿에서 다음을 통해 요청 범위 Bean을 가져올 수 있습니다.
Bean bean = (Bean) request.getAttribute("beanName");
및 세션 범위 Bean :
Bean bean = (Bean) request.getSession().getAttribute("beanName");
및 애플리케이션 범위 Bean :
Bean bean = (Bean) getServletContext().getAttribute("beanName");
의존성 주입이 가능한 프레임 워크 / 컨테이너에서 실행 중이고 Bean이 @Named
JSF 대신 CDI에서 관리되는 @ManagedBean
경우 훨씬 더 쉽습니다.
@Inject
private Bean bean;
범위에 관계없이 실제로 내부에 있을 때 FacesContext
(즉, 현재 HTTP 요청이를 통해 FacesServlet
제공됨) 일반적인 JSF2 방식은 다음을 사용합니다 Application#evaluateExpressionGet()
.
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
다음과 같이 편리 할 수 있습니다.
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
다음과 같이 사용할 수 있습니다.
Bean bean = findBean("bean");
그러나 이미 내부에 있으면 선언 적이기 때문에 @ManagedBean
사용하는 @ManagedProperty
것이 더 깨끗합니다.
@ManagedProperty("#{bean}")
private Bean bean;
다음 방법을 사용합니다.
public static <T> T getBean(final String beanName, final Class<T> clazz) {
ELContext elContext = FacesContext.getCurrentInstance().getELContext();
return (T) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, beanName);
}
이를 통해 반환 된 개체를 형식화 된 방식으로 가져올 수 있습니다.
이 링크와 같은 접근 방식을 시도해 보셨습니까? createValueBinding()
여전히 사용 가능한지 확실하지 않지만 이와 같은 코드는 일반 오래된 서블릿에서 액세스 할 수 있어야합니다. 이것은 이미 존재하는 bean이 필요합니다.
http://www.coderanch.com/t/211706/JSF/java/access-managed-bean-JSF-from
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
// May be deprecated
ValueBinding binding = app.createValueBinding("#{" + expr + "}");
Object value = binding.getValue(context);
이름을 전달하여 관리 Bean을 가져올 수 있습니다.
public static Object getBean(String beanName){
Object bean = null;
FacesContext fc = FacesContext.getCurrentInstance();
if(fc!=null){
ELContext elContext = fc.getELContext();
bean = elContext.getELResolver().getValue(elContext, null, beanName);
}
return bean;
}
I had same requirement.
I have used the below way to get it.
I had session scoped bean.
@ManagedBean(name="mb")
@SessionScopedpublic
class ManagedBean {
--------
}
I have used the below code in my servlet doPost() method.
ManagedBean mb = (ManagedBean) request.getSession().getAttribute("mb");
it solved my problem.
I use this:
public static <T> T getBean(Class<T> clazz) {
try {
String beanName = getBeanName(clazz);
FacesContext facesContext = FacesContext.getCurrentInstance();
return facesContext.getApplication().evaluateExpressionGet(facesContext, "#{" + beanName + "}", clazz);
//return facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, nomeBean);
} catch (Exception ex) {
return null;
}
}
public static <T> String getBeanName(Class<T> clazz) {
ManagedBean managedBean = clazz.getAnnotation(ManagedBean.class);
String beanName = managedBean.name();
if (StringHelper.isNullOrEmpty(beanName)) {
beanName = clazz.getSimpleName();
beanName = Character.toLowerCase(beanName.charAt(0)) + beanName.substring(1);
}
return beanName;
}
And then call:
MyManageBean bean = getBean(MyManageBean.class);
This way you can refactor your code and track usages without problems.
'code' 카테고리의 다른 글
Android에서 스피너에 항목을 추가하려면 어떻게해야합니까? (0) | 2020.08.21 |
---|---|
java.io.NotSerializableException (0) | 2020.08.21 |
GooglePlayServicesUtil 대 GoogleApiAvailability (0) | 2020.08.21 |
그림자 확산 및 흐림을 제어하는 방법은 무엇입니까? (0) | 2020.08.21 |
ExecuteScalar, ExecuteReader 및 ExecuteNonQuery의 차이점은 무엇입니까? (0) | 2020.08.21 |