Я пытаюсь записать пользовательский сервлет (для AJAX/JSON), в котором я хотел бы сослаться на мой @ManagedBeans
по имени. Я надеюсь отобразиться:
http://host/app/myBean/myProperty
кому:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
Действительно ли возможно загрузить боб по имени из регулярного сервлета? Существует ли сервлет JSF или помощник, которого я мог использовать для него?
Я, кажется, испорчен Spring, в котором все это слишком очевидно.
В сервлете вы можете получить bean-компоненты с областью запроса:
Bean bean = (Bean) request.getAttribute("beanName");
и bean-компоненты с областью сеанса с помощью:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
и bean-компонентов с областью приложения с помощью:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
Если вы работаете в инфраструктуре / контейнере с возможностью внедрения зависимостей и bean управляется CDI @Named
вместо JSF @ManagedBean
, это еще проще:
@Inject
private Bean bean;
Независимо от объема, когда вы на самом деле внутри FacesContext
(т. е. текущий HTTP-запрос был обслужен через FacesServlet
), тогда обычный способ JSF2 использует Application # AssessmentExpressionGet ()
:
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;
Вы пробовали подход, как по этой ссылке? Я не уверен, что createValueBinding()
все еще доступен, но такой код должен быть доступен из обычного старого сервлета. Это требует, чтобы боб уже существовал.
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);