Vezérlő, szerviz és DAO példa rugós indítással és JSF-mel

1. Bemutatkozás

A JavaServer Faces egy szerveroldali összetevő-alapú felhasználói felület keretrendszer. Eredetileg a Jakarta EE részeként fejlesztették ki. Ebben az oktatóanyagban megvizsgáljuk, hogyan lehet a JSF-et integrálni a Spring Boot alkalmazásba.

Példaként egy egyszerű alkalmazást valósítunk meg a TO-DO lista létrehozásához.

2. Maven-függőségek

Ki kell terjesztenünk pom.xml a JSF technológiák használatához:

 org.apache.tomcat.embed tomcat-embed-jasper org.glassfish javax.faces 2.3.7 

A javax.arcok az artefaktum tartalmazza a JSF API-kat és a megvalósításokat is. Részletes információk itt találhatók.

3. A JSF Servlet konfigurálása

A JSF keretrendszer XHTML fájlokat használ a felhasználói felület tartalmának és felépítésének leírására. A szerveroldal a JSF fájlokat az XHTML leírásokból állítja elő.

Kezdjük azzal, hogy létrehozunk egy statikus struktúrát egy index.xhtml fájl a src / main / webapp Könyvtár:

    TO-DO alkalmazás 

Üdvözöljük a TO-DO alkalmazásban!

Ez egy statikus üzenet, amelyet az xhtml fájlból nyújtanak.

A tartalom itt lesz elérhető /index.jsf. Bár hibaüzenetet kapunk az ügyfél oldalon, ha ebben a szakaszban megpróbáljuk elérni a tartalmat:

Váratlan hiba történt (type = Not Found, status = 404). Nincs elérhető üzenet

Nem lesz háttér-hibaüzenet. Ennek ellenére rájöhetünk szükségünk van egy JSF szervletre a kérés kezeléséhez és a szervlet leképezés, hogy megfeleljen a kérésnek a kezelővel.

Mivel tavaszi indításban vagyunk, könnyen kibővíthetjük alkalmazási osztályunkat a szükséges konfiguráció kezeléséhez:

@SpringBootApplication nyilvános osztály A JsfApplication kiterjeszti a SpringBootServletInitializer {public static void main (String [] args) {SpringApplication.run (JsfApplication.class, args); } @Bean public ServletRegistrationBean servletRegistrationBean () {FacesServlet servlet = new FacesServlet (); ServletRegistrationBean servletRegistrationBean = új ServletRegistrationBean (servlet, "* .jsf"); return servletRegistrationBean; }}

Ez jól néz ki és elég ésszerű, de sajnos még mindig nem elég jó. Amikor megpróbálunk nyitni /index.jsf most újabb hibát kapunk:

java.lang.IllegalStateException: Nem található biztonsági másolat a gyári javax.faces.context.FacesContextFactory számára.

Sajnos szükségünk van a web.xml a Java konfiguráció mellett. Hozzuk létre src / webapp / WEB-INF:

 Szembesül a kiszolgálóalkalmazással javax.faces.webapp.FacesServlet 1 Szembe a Servlet * .jsf 

Most konfigurációnk készen áll. Nyisd ki /index.jsf:

Üdvözöljük a TO-DO alkalmazásban! Ez egy statikus üzenet, amelyet az xhtml fájlból nyújtanak.

Mielőtt létrehoznánk felhasználói felületünket, hozzuk létre az alkalmazás háttérképét.

4. A DAO Pattern megvalósítása

A DAO az adatelérési objektumot jelenti. Általában a DAO osztály felel két fogalomért. A perzisztencia réteg részleteinek összefoglalása és CRUD interfész biztosítása egyetlen entitás számára. Részletes leírást ebben az oktatóanyagban talál.

A DAO minta megvalósításához először meghatározunk egy általános felületet:

nyilvános felület Dao {Opcionális get (int id); Gyűjtemény getAll (); int mentés (T t); érvénytelen frissítés (T t); érvénytelen törlés (T t); }

Most hozzuk létre az első és egyetlen domain osztályunkat ebben a teendők alkalmazásban:

nyilvános osztály Todo {private int id; privát karakterlánc üzenet; privát int elsőbbség; // szabványos mérőeszközök és beállítók}

A következő osztály a Dao. E minta szépsége, hogy bármikor új megvalósítást nyújthatunk ennek a felületnek.

Következésképpen megváltoztathatjuk a perzisztencia réteget anélkül, hogy megérintenénk a kód többi részét.

Például: memóriában lévő tároló osztályt fogunk használni:

@Component public class TodoDao végrehajtja Dao {private List todoList = new ArrayList (); @Orride public Opcionális get (int id) {return Optional.ofNullable (todoList.get (id)); } @ A nyilvános gyűjtemény felülbírálása getAll () {return todoList.stream () .filter (Objects :: nonNull) .collect (Collectors.collectingAndThen (Collectors.toList (), Gyűjtemények :: unmodifiableList)); } @Orride public int save (Todo todo) {todoList.add (todo); int index = todoList.size () - 1; todo.setId (index); hozamindex; } @Orride public void update (Todo todo) {todoList.set (todo.getId (), todo); } @Orride public void delete (Todo todo) {todoList.set (todo.getId (), null); }}

5. A szolgáltatási réteg

A DAO réteg fő célja a perzisztáló mechanizmus részleteinek kezelése. Míg a szolgáltatási réteg a tetején áll az üzleti követelmények kezeléséhez.

Vegye figyelembe, hogy a DAO felületre hivatkozni fog a szolgáltatás:

@Scope (value = "session") @Component (value = "todoService") public class TodoService {@Autowired private Dao todoDao; magán Todo todo = új Todo (); public void save () {todoDao.save (todo); todo = új Todo (); } nyilvános gyűjtemény getAllTodo () {return todoDao.getAll (); } public int saveTodo (Todo todo) {validate (todo); visszatér todoDao.save (todo); } private void validate (Todo todo) {// Részletek kihagyva} public Todo getTodo () {return todo; }}

Itt a szolgáltatás egy megnevezett összetevő. A nevet arra fogjuk használni, hogy a JSF kontextusából a babra hivatkozzunk.

Ezen túlmenően ennek az osztálynak van egy munkamenete, amely kielégíti ezt az egyszerű alkalmazást.

Ha többet szeretne tudni a tavaszi hatókörökről, tekintse meg ezt az oktatóanyagot. Mivel a Spring beépített hatókörének más modellje van, mint a JSF-nek, érdemes megfontolni egy egyedi hatókör meghatározását.

További útmutatás erről az oktatóanyagról érhető el.

6. A vezérlő

Csakúgy, mint egy JSP alkalmazásban, a vezérlő is kezeli a navigációt a különböző nézetek között.

Ezután egy minimalista vezérlőt valósítunk meg. A kezdőlapról a teendők listájára navigál:

@Scope (value = "session") @Component (value = "jsfController") public class JsfController {public String loadTodoPage () {checkPermission (); return "/todo.xhtml"; } private void checkPermission () {// Részletek elhagyva}}

A navigáció a visszaadott néven alapul. Ezért a loadTodoPage elküld minket a todo.xhtml oldal, amelyet legközelebb megvalósítunk.

7. A JSF és a tavaszi bab összekapcsolása

Lássuk, hogyan hivatkozhatunk összetevőinkre a JSF kontextusból. Először kibővítjük a index.xthml:

  // ugyanaz a kód, mint korábban // ugyanaz a kód, mint korábban 

Itt vezettük be a commandButton egy űrlapelem belsejében. Ez fontos, mivel minden UICommand elem (pl. commandButton)belül kell elhelyezni UIForm elem (pl. forma).

Ebben a szakaszban megkezdhetjük alkalmazásunkat és megvizsgálhatjuk /index.jsf:

Sajnos hibaüzenetet kapunk, amikor rákattintunk a gombra:

Váratlan hiba történt (típus = belső kiszolgáló hiba, állapot = 500). javax.el.PropertyNotFoundException: /index.xhtml @ 11,104 action = "# {jsfController.loadTodoPage}": Cél elérhetetlen, a [jsfController] azonosító nullára oldódott

Az üzenet egyértelműen kimondja a problémát: a jsfController elhatározta nulla. A megfelelő komponens vagy nincs létrehozva, vagy legalábbis láthatatlan a JSF kontextusából.

Ebben a helyzetben ez utóbbi igaz.

Összekapcsolnunk kell a tavaszi kontextust JSF kontextus a webapp / WEB-INF / faces-config.xml:

   org.springframework.web.jsf.el.SpringBeanFacesELResolver 

Most, hogy vezérlőnk készen áll a munkára, szükségünk lesz rá todo.xhtml!

8. Interakció a JSF szolgáltatásával

A mi todo.xhtml Az oldal két célja lesz. Először az összes tennivaló elemet megjeleníti.

Másodszor kínáljon lehetőséget új elemek hozzáadására a listához.

Ehhez a felhasználói felület összetevője közvetlenül kapcsolatba lép a korábban deklarált szolgáltatással:

    Tennivaló alkalmazás Tennivaló elemek listája # {item.message} # számú prioritás {item.priority} Új teendő hozzáadása: 

A fent említett két célt külön-külön hajtják végre div elemek.

Az elsőben a adattábla elem, amely az összes értéket képviseli todoService.AllTodo.

A második div tartalmaz egy űrlapot, ahol módosíthatjuk a Csinálni objektum a TodoService.

Használjuk a inputText elem a felhasználói bevitel elfogadásához, ahol a második bemenet automatikusan átalakul int. A ... val commandButton, a felhasználó megmaradhat (a memóriában most) a Csinálni objektum a todoService.save.

9. Következtetés

A JSF keretrendszer integrálható a tavaszi keretbe. Ki kell választania, melyik keretrendszer kezeli a babot. Ebben az oktatóanyagban a Spring keretrendszert használtuk.

A hatókör modellje azonban kissé eltér a JSF keretrendszertől. Érdemes tehát meghatározni az egyéni hatókörök meghatározását a tavaszi kontextusban.

Mint mindig, a kód elérhető a GitHubon.


$config[zx-auto] not found$config[zx-overlay] not found