Próbuję napisać niestandardowy serwlet (dla AJAX / JSON), w którym chciałbym odwoływać się do mojej @ManagedBeans
nazwy. Mam nadzieję, że zmapuję:
http://host/app/myBean/myProperty
do:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
Czy można załadować komponent bean według nazwy ze zwykłego serwletu? Czy istnieje serwlet JSF lub pomocnik, którego mógłbym użyć?
Wydaje się, że rozpieszcza mnie wiosna, w której to wszystko jest zbyt oczywiste.
jsf
jakarta-ee
servlets
jsf-2
managed-bean
Konrad Garus
źródło
źródło
Odpowiedzi:
W artefaktu oparte serwletu, takich jak
@WebServlet
,@WebFilter
i@WebListener
można złapać „plain vanilla” JSF@ManagedBean @RequestScoped
przez:i
@ManagedBean @SessionScoped
przez:i
@ManagedBean @ApplicationScoped
przez:Zwróć uwagę, że wymaga to wcześniejszego automatycznego utworzenia ziarna przez JSF. W przeciwnym razie te powrócą
null
. Następnie musisz ręcznie utworzyć fasolę i użyćsetAttribute("beanName", bean)
.Jeśli możesz użyć CDI
@Named
zamiast JSF 2.3, który jest przestarzały@ManagedBean
, to jest to jeszcze prostsze, zwłaszcza że nie musisz już ręcznie tworzyć komponentów bean:Zwróć uwagę, że to nie zadziała, gdy używasz,
@Named @ViewScoped
ponieważ komponent bean można zidentyfikować tylko na podstawie stanu widoku JSF i jest to dostępne tylko wtedy, gdyFacesServlet
został wywołany. Więc w filtrze, który działa wcześniej, dostęp do@Inject
ed@ViewScoped
zawsze wyrzuciContextNotActiveException
.Dopiero gdy jesteś w środku
@ManagedBean
, możesz użyć@ManagedProperty
:Należy pamiętać, że to nie działa wewnątrz
@Named
lub@WebServlet
lub innego artefaktu. To naprawdę działa@ManagedBean
tylko w środku .Jeśli nie jesteś w środku a
@ManagedBean
, aleFacesContext
jest łatwo dostępny (tj.FacesContext#getCurrentInstance()
Nie zwracanull
), możesz również użyćApplication#evaluateExpressionGet()
:które można uprościć w następujący sposób:
i może być używany w następujący sposób:
Zobacz też:
źródło
PostBean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", PostBean.class);
FacesContext
jest dostępna, mimo żestatic
metoda narzędziafindBean()
jest zdefiniowana w zwykłej klasie Java. Jak jest tam dostępna w zwykłej klasie Java, która nie jest zarządzana przez JSF?Używam następującej metody:
To pozwala mi uzyskać zwrócony obiekt w sposób wpisany na maszynie.
źródło
Class
argument jest zbędny w tej konstrukcji).Czy próbowałeś podejścia podobnego do tego linku? Nie jestem pewien, czy
createValueBinding()
jest nadal dostępny, ale taki kod powinien być dostępny ze zwykłego starego serwletu. To wymaga, aby fasola już istniała.http://www.coderanch.com/t/211706/JSF/java/access-managed-bean-JSF-from
źródło
Możesz uzyskać zarządzaną fasolę, przekazując nazwę:
źródło
Miałem ten sam wymóg.
Użyłem poniższego sposobu, aby to uzyskać.
Miałem fasolę sesyjną.
Użyłem poniższego kodu w mojej metodzie doPost () serwletu.
rozwiązało mój problem.
źródło
Używam tego:
A potem zadzwoń:
W ten sposób możesz bez problemu refaktoryzować swój kod i śledzić jego użycie.
źródło