JavaServer Faces (JSF) med Spring
1. Oversigt
I denne artikel vil vi se på en opskrift på adgang til bønner defineret i Spring fra en JSF-styret bønne og en JSF-side med henblik på at delegere udførelsen af forretningslogik til Spring Beans.
Denne artikel antager, at læseren har en forudgående forståelse af både JSF og Spring separat. Artiklen er baseret på Mojarra-implementeringen af JSF.
2. Om foråret
Lad os få defineret følgende bønne i foråret. Det UserManagementDAO bean tilføjer et brugernavn til en lagerhukommelse, og det er defineret af følgende grænseflade:
offentlig grænseflade UserManagementDAO {boolean createUser (String newUserData); }
Implementeringen af bønnen konfigureres ved hjælp af følgende Java-konfiguration:
offentlig klasse SpringCoreConfig {@Bean offentlig UserManagementDAO userManagementDAO () {returner ny UserManagementDAOImpl (); }}
Eller ved hjælp af følgende XML-konfiguration:
Vi definerer bønnen i XML og registrerer CommonAnnotationBeanPostProcessor for at sikre, at @PostConstruct kommentar hentes.
3. Konfiguration
De følgende afsnit forklarer de konfigurationselementer, der muliggør integration af Spring- og JSF-sammenhænge.
3.1. Java-konfiguration uden web.xml
Ved at implementere WebApplicationInitializer vi er i stand til programmatisk at konfigurere ServletContext. Følgende er onStartup () implementering inde i MainWebAppInitializer klasse:
offentlig ugyldighed onStartup (ServletContext sc) kaster ServletException {AnnotationConfigWebApplicationContext root = ny AnnotationConfigWebApplicationContext (); root.register (SpringCoreConfig.class); sc.addListener (ny ContextLoaderListener (root)); }
Det AnnotationConfigWebApplicationContext bootstraps Spring'g-sammenhængen og tilføjer bønnerne ved at registrere SpringCoreConfig klasse.
Tilsvarende er der i Mojarra-implementeringen en FacesInitializer klasse, der konfigurerer AnsigterServlet. For at bruge denne konfiguration er det nok at udvide FacesInitializer. Den komplette implementering af MainWebAppInitializer, er nu som følger:
public class MainWebAppInitializer udvider FacesInitializer implementerer WebApplicationInitializer {public void onStartup (ServletContext sc) kaster ServletException {AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext (); root.register (SpringCoreConfig.class); sc.addListener (ny ContextLoaderListener (root)); }}
3.2. Med web.xml
Vi starter med at konfigurere ContextLoaderListener i web.xml ansøgningens fil:
org.springframework.web.context.ContextLoaderListener
Denne lytter er ansvarlig for at starte konteksten om forårets applikation, når webapplikationen starter. Denne lytter vil kigge efter en forårskonfigurationsfil med navnet applicationContext.xml som standard.
3.3. ansigter-config.xml
Vi konfigurerer nu SpringBeanFacesELResolver i ansigt-config.xml fil:
org.springframework.web.jsf.el.SpringBeanFacesELResolver
En EL-resolver er en tilslutningsbar komponent, der understøttes af JSF-rammen, hvilket giver os mulighed for at tilpasse JSF-runtimeens opførsel, når vi vurderer Expression Language (EL) -udtryk. Denne EL-resolver giver JSF runtime adgang til Spring-komponenter via EL-udtryk defineret i JSF.
4. Adgang til forårsbønner i JSF
På dette tidspunkt er vores JSF-webapplikation primet for at få adgang til vores Spring Bean fra enten en JSF-backing bønne eller fra en JSF-side.
4.1. Fra en Backing Bean JSF 2.0
Springbønnen kan nu tilgås fra en JSF-bagbønne. Afhængigt af hvilken version af JSF du kører, er der to mulige metoder. Med JSF 2.0 bruger du @ManagedProperty kommentar på JSF-styret bønne.
@ManagedBean (navn = "registrering") @RequestScoped offentlig klasse RegistrationBean implementerer Serializable {@ManagedProperty (value = "# {userManagementDAO}") forbigående privat IUserManagementDAO theUserDao; private streng brugernavn;
// getters og setters}
Bemærk, at getter og setter er obligatoriske, når du bruger @ManagedProperty.
Nu - for at hævde tilgængeligheden af en springbønne fra en administreret bønne, tilføjer vi createNewUser () metode:
public void createNewUser () {FacesContext context = FacesContext.getCurrentInstance (); boolsk operationStatus = userDao.createUser (brugernavn); context.isValidationFailed (); hvis (operationStatus) {operationMessage = "Bruger" + brugernavn + "oprettet"; }}
Kernen i metoden er at bruge userDao Springbønne og få adgang til dens funktionalitet.
4.2. Fra en bagbønne i JSF 2.2
En anden tilgang, der kun er gyldig i JSF2.2 og derover, er at bruge CDI'er @Indsprøjte kommentar. Dette gælder for JSF-styrede bønner (med @ManagedBean annotation) og CDI-styrede bønner (med @Som hedder kommentar).
Faktisk med en CDI-kommentar er dette den eneste gyldige metode til injektion af bønnen:
@Named ("registrering") @RequestScoped offentlig klasse RegistrationBean implementerer Serialiserbar {@Inject UserManagementDAO theUserDao; }
Med denne tilgang er getter og setter ikke nødvendige. Bemærk også, at EL-udtrykket er fraværende.
4.3. Fra en JSF-visning
Det createNewUser () metode udløses fra følgende JSF-side:
For at gengive siden skal du starte serveren og navigere til:
//localhost:8080/jsf/index.jsf
Vi kan også bruge EL i JSF-visningen for at få adgang til Spring Bean. For at teste det er det nok at ændre linjenummer 7 fra den tidligere introducerede JSF-side til:
Her kalder vi createUser metode direkte på Spring DAO, der overfører bindingsværdien af brugernavn til metoden fra JSF-siden og omgå den styrede bønne alt sammen.
5. Konklusion
Vi undersøgte en grundlæggende integration mellem Spring- og JSF-sammenhængen, hvor vi har adgang til en Springbønne i en JSF-bønne og side.
Det er værd at bemærke, at mens JSF-runtime giver den tilslutningsbare arkitektur, der gør det muligt for Spring-rammen at levere integrationskomponenter, kan kommentarerne fra Spring-rammen ikke bruges i en JSF-kontekst og omvendt.
Hvad dette betyder er, at du ikke kan bruge kommentarer som f.eks @Autowired eller @Komponent osv. i en JSF-styret bønne, eller brug @ManagedBean kommentar på en forårsledet bønne. Du kan dog bruge @Indsprøjte kommentar i både en JSF 2.2+ -styret bønne og en springbønne (fordi Spring understøtter JSR-330).
Kildekoden, der ledsager denne artikel, er tilgængelig på GitHub.