Я пытаюсь написать собственный сервлет (для AJAX / JSON), в котором я хотел бы ссылаться на свое @ManagedBeans
имя. Я надеюсь составить карту:
http://host/app/myBean/myProperty
кому:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
Можно ли загрузить компонент по имени из обычного сервлета? Есть ли сервлет или помощник JSF, который я мог бы использовать для этого?
Кажется, меня избаловала Весна, в которой все это слишком очевидно.
jsf
jakarta-ee
servlets
jsf-2
managed-bean
Конрад Гарус
источник
источник
Ответы:
В артефакте на основе сервлета, таком как
@WebServlet
,@WebFilter
и@WebListener
, вы можете получить "простой ванильный" JSF следующим@ManagedBean @RequestScoped
образом:и
@ManagedBean @SessionScoped
по:и
@ManagedBean @ApplicationScoped
по:Обратите внимание, что для этого требуется, чтобы компонент был предварительно автоматически создан JSF. Иначе они вернутся
null
. Затем вам нужно будет вручную создать bean-компонент и использовать егоsetAttribute("beanName", bean)
.Если вы можете использовать CDI
@Named
вместо устаревшего JSF 2.3@ManagedBean
, то это еще проще, особенно потому, что вам больше не нужно вручную создавать bean-компоненты:Обратите внимание, что это не сработает, когда вы используете,
@Named @ViewScoped
потому что компонент может быть идентифицирован только по состоянию представления JSF и доступен только тогда, когдаFacesServlet
был вызван. Таким образом, в фильтре, который запускается до этого, доступ к@Inject
ed@ViewScoped
всегда будет вызыватьContextNotActiveException
.Только когда вы внутри
@ManagedBean
, вы можете использовать@ManagedProperty
:Обратите внимание, что это не работает внутри
@Named
или@WebServlet
или любого другого артефакта. Действительно работает@ManagedBean
только внутри .Если вы не находитесь внутри
@ManagedBean
, ноFacesContext
легко доступны (т.е.FacesContext#getCurrentInstance()
не возвращаютсяnull
), вы также можете использоватьApplication#evaluateExpressionGet()
:что можно сделать следующим образом:
и может использоваться следующим образом:
Смотрите также:
источник
PostBean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", PostBean.class);
FacesContext
доступен, даже еслиstatic
служебный методfindBean()
определен внутри простого класса Java. Как он доступен в простом классе Java, который не управляется JSF?Я использую следующий метод:
Это позволяет мне получить возвращенный объект типизированным способом.
источник
Class
аргумент в этой конструкции не нужен).Вы пробовали подход, подобный этой ссылке? Я не уверен, что
createValueBinding()
он еще доступен, но такой код должен быть доступен из простого старого сервлета. Это действительно требует, чтобы bean-компонент уже существовал.http://www.coderanch.com/t/211706/JSF/java/access-managed-bean-JSF-from
источник
Вы можете получить управляемый компонент, передав имя:
источник
У меня было такое же требование.
Я использовал способ, указанный ниже.
У меня был компонент с ограниченным сеансом.
Я использовал приведенный ниже код в моем методе сервлета doPost ().
это решило мою проблему.
источник
Я использую это:
А потом звоните:
Таким образом, вы можете без проблем провести рефакторинг кода и отслеживать его использование.
источник