Получите управляемый компонент JSF по имени в любом связанном с сервлетом классе

Я пытаюсь записать пользовательский сервлет (для AJAX/JSON), в котором я хотел бы сослаться на мой @ManagedBeans по имени. Я надеюсь отобразиться:

http://host/app/myBean/myProperty

кому:

@ManagedBean(name="myBean")
public class MyBean {
    public String getMyProperty();
}

Действительно ли возможно загрузить боб по имени из регулярного сервлета? Существует ли сервлет JSF или помощник, которого я мог использовать для него?

Я, кажется, испорчен Spring, в котором все это слишком очевидно.

98
задан BalusC 1 February 2015 в 15:26
поделиться

2 ответа

В сервлете вы можете получить 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;
259
ответ дан 24 November 2019 в 05:09
поделиться

Вы пробовали подход, как по этой ссылке? Я не уверен, что 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);
3
ответ дан 24 November 2019 в 05:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: