Introducere în programarea în rețea. Vedeți ce este „JSP” în alte dicționare
1) NetBeans 7.3;
2) Maven;
3) Hibernați;
4) Spring MVC;
5) JSP+JSTL;
6) Cunoștințe despre Servlets, Sessions, JavaBean, XML etc.;
7) HTML+CSS (puțină frumusețe pentru gusturile dvs., dar este mai bine să plătiți persoanele nepotrivite - veți avea destule probleme cu partea de server);
8) Java SE (cunoașterea colecțiilor, capacitatea de a gestiona excepții... În general, un set standard);
9) Cunoașterea modelelor de proiectare (DAO, Factory);
10) JPA;
11) SVN;
12) SQL (pentru scrierea de scripturi care populează bazele noastre de date).
Să începem cu unde ne vom stoca codul și cum să-l partajăm prietenilor. Cred că nu toți începătorii știu despre depozite, iar această parte este doar pentru ei.
SVN Există un astfel de lucru ca un depozit - server la distanta stocarea codului.Daca iti dau Test, și îl trimiți ca arhivă, atunci cel mai probabil vei fi trimis și tu. Poate că nu te vor trimite, dar cu siguranță vor fi dezamăgiți de tine.
Există diferite depozite CVS, SVN, Git. Pentru începători, cred că SVN este optim. Ei bine, principalul lucru pentru tine nu este să știi ce este, ci să îl poți aplica. Deocamdată va fi suficient, restul va veni cu experiență.
După toate acestea, vei avea un link către spațiul tău. Pentru a înțelege ce este acesta, trebuie să luați unul dintre proiectele dvs. (sau să creați un proiect gol în NetBeans). Faceți clic dreapta pe el și „Gestionarea versiunilor” -> „Importați în depozitul Subversion” va fi disponibil în meniul dvs. După aceasta, va apărea o casetă de dialog care conține calea către depozit - acesta este linkul pe care l-ați primit pe site în fila „ Sursă».
Apoi, ștergeți complet proiectul pe care l-ați angajat. Apoi, accesați folderul în care sunt stocate proiectele dvs. și verificați dacă totul a fost efectiv șters. Apoi reveniți la NetBeans și căutați fila Grup în bara de meniu (pe panoul unde File, View, Edit, Go, Source...) conține Subversion. Și în submeniul de pe el există „Obțineți”. Următorul în casete de dialog Va trebui să furnizați un link către depozit (acesta este linkul pe care l-ați primit pe site-ul web în fila „Codul sursă”). Și când vă oferă să descărcați foldere, va trebui să vă găsiți proiectul în arborele depozitului. și selectează-l, iar la final îți vei descărca proiectul. Acesta este modul în care se schimbă codul.
Proiectul dvs. se va sincroniza în mod constant cu depozitul și va marca fișierele care au fost modificate sau noi (oricare este diferită de versiunea din depozit). Pentru a actualiza, trebuie să apelați meniul contextual, iar în fila „Version Control” va exista o listă mare cu ceea ce puteți face cu proiectul. „Actualizare” înseamnă actualizarea fișierelor; „Commit” - puneți codul pe care l-ați scris sau modificat în depozit; „Resetare” - revine la versiunea din depozit, iar „Comparare” - afișează modificări ale rândurilor care diferă de cele șterse. Acesta este un mod de partajare a codului de echipă care este întotdeauna folosit și trebuie să vă obișnuiți.
Ați descărcat deja NetBeans, v-ați jucat cu SVN - acum să trecem la treabă. Creați un proiect. Faceți clic pe „Creați un proiect”, acolo selectați Maven-> Aplicație web. Spune-i cum vrei, este toată imaginația ta. Deci, avem o aplicație web, proiectul nostru este asamblat folosind Maven, avem un obiectiv și acum este timpul să ne gândim cum să o implementăm. Adică, tu, ca dezvoltator, trebuie să te gândești la cum va arăta aplicația ta, ce arhitectură va avea, arborele pachetelor și așa mai departe. Numărul total de linii de cod aici este de aproximativ 4000 și este mai bine să ai grijă de arhitectura frumoasă în avans, altfel mai târziu pur și simplu nu vei înțelege ce este unde și cum funcționează pentru tine, prin ce minune tu, de exemplu, afișați ultimul lucru achiziționat, cum calculați suma totală a achizițiilor. Și dacă ți se cere apoi să termini sau să adaugi ceva, îți vei da seama că este mai ușor să scrii totul de la zero.
Și, desigur, trebuie să ne dăm seama de planul nostru de acțiune.
Deci: Planul de acțiune 1) descrieți entitatea(entitățile) - entități. Acesta este un POJO - o clasă asociată cu baza de date folosind o adnotare (@Entity) sau prin XML. Vom folosi JPA, deci trebuie să importam javax.persistence.* De ce nu API-ul Hibernate Persistence, pentru că dacă îl folosim și apoi vrem să schimbăm biblioteca ORM, va trebui să ne rescriem clasele, iar JPA este un standard de la Soare. Referitor la ce este JPA - ei bine, vă pot spune cu propriile mele cuvinte: este o bibliotecă care oferă un API pentru lucrul cu obiecte *de lungă durată*, adică ne permite să ne salvăm convenabil obiectele în baza de date. Vă pot da un sfat: creați un pachet separat pentru asta, numiți-l entitate sau domeniu - orice doriți, principalul lucru este că vă este clar. S-ar putea să arate astfel: edu.shop.model.domain.Customer.java edu.shop.model.domain.Notebook.java.O voi descrie mai detaliat direct atunci când voi lua în considerare acest articol. Acum sarcina este să găsești un plan de acțiune.
2) Creați HibernateUtil (în general, sufixul sau prefixul Util implică faptul că codul din această clasă este universal și este folosit de multe clase).
Deci, în HibernateUtil plasăm o SessionFactory. E greu. Acest cod, în teorie, ar trebui să fie independent de întreaga aplicație, deoarece stabilește o conexiune la baza de date la pornire și ar trebui să ne ofere doar Sesiuni cu baza de date. Înregistrăm și clasele noastre de entități în această clasă. Vă voi spune mai multe despre această clasă mai târziu. Să-l punem și într-un pachet separat, de exemplu, edu.shop.model.hbutil.HibernateUtil.java
3) Scrieți DAO.
Ce ar trebui să scriu în el? Scriem ceea ce dorim să obținem din baza de date, dar nu trebuie să ne gândim la modul în care au fost obținute aceste date, rezultatul este important. De exemplu, definim interfața ProductDAO și scriem metode în ea
Lista getAllProducts(); apoi scriem implementarea lui ProductDAOImpl.
Care este ideea? Dacă tu și cu mine am scris această aplicație, ai spune: „Micha, am nevoie de următoarele date din baza de date: toate produsele pe care le am în baza de date.” Răspund: „nu o întrebare”. Și apoi următoarea dezvoltare a evenimentelor: în codul dvs., oriunde trebuie să faceți interogări la baza de date, scrieți următorul%
*aici este un apel la metoda*.getAllProducts(); - și vezi că compilatorul nu înjură, și s-ar putea să nu fi avut timp să scriu încă implementarea acestei interfețe. Și care este rezultatul? Ai totul compilat, dar nici măcar nu ai cod de lucru. Aici vom folosi Enums și modelul Factory și altceva, dar totul are timpul lui. În DAO trebuie să acordați o atenție deosebită gestionării excepțiilor, cel puțin generând pagini de eroare. Astfel încât să puteți găsi rapid o bucată de cod rupt. În caz contrar, veți fi pur și simplu torturat cu depanare.
3) Lucrul nostru cu Spring MVC va începe aici. Aceasta este o poveste lungă și un articol separat îi va fi dedicat. Voi spune imediat că acesta este cel mai dificil lucru din această aplicație. Dar vă voi arăta o opțiune mai simplă, cum să afișați totul fără să vă faceți griji cu adevărat Model MVC.
Să ne referim la utilizarea scriptlet-urilor.
4) Aici vom avea clase auxiliare care adaugă tot felul de bunătăți proiectului nostru: calcularea sumei totale de achiziții; ultimul articol cumpărat; variabile auxiliare care ne vor fi utile pentru funcționarea metodei, care, de exemplu, vor afișa lucruri din baza de date pentru noi nu mai mult de 5000 UAH, sau nu mai puțin de 500; afișajul tuturor laptopurilor Asus. Acest punct este strâns legat de cel precedent.
Să lăsăm așa deocamdată. Ne vom da seama de restul puțin mai târziu. Deci, avem un plan, să începem să-l implementăm.
Entitate Am creat proiectul nostru și am creat pachetul nostru de entitate. Să fie edu.shop.entity. Acolo creăm următoarele clase:Notă. Coșul în care vor fi stocate bunurile noastre achiziționate va fi ca un tabel în baza de date, am făcut asta pentru că voi arăta câteva elemente de bază ale lucrului cu baza de date pe el. Pentru un caz real, mai potrivit ar fi să folosim colecții pentru a ne depozita bunurile.
1) Produs
2) Caiet
3) Camera foto
4) Cartea
5) Cablu
6) Client
7) Cărucior
Să vorbim puțin despre ce este o clasă de entități.
Entity este o clasă POJO asociată cu baza de date folosind o adnotare (@Entity) sau prin XML. Următoarele cerințe se aplică acestei clase:
Trebuie să aibă un constructor gol (public sau protejat);
- Nu poate fi imbricat, interfață sau enumerare;
- Nu poate fi definitivă și nu poate conține câmpuri/proprietăți finale;
- Trebuie să conțină cel puțin un câmp @Id.
În acest caz, entitatea poate:
Entitățile pot fi legate între ele: unu-la-unu, unu-la-mulți, mulți-la-unu și mulți-la-mulți.
Vom folosi adnotări. Și aici avem imediat ocazia să o descriem în două moduri. Fie vom scrie adnotări direct deasupra câmpurilor, fie deasupra getter-urilor. Voi spune un lucru: este corect să scrieți mai sus getters și puteți întreba motivul pe Google. Nu pot descrie absolut toate subiectele aici.
Mai este un lucru pe care vreau să-l spun. Pentru a face acest lucru, va trebui să afișați 2 exemple de descriere a clasei de entități. Deci, primul exemplu:
Am scris comentarii la el în codul însuși:
Import java.io.Serializable; import javax.persistence.*; import javax.validation.constraints.Size; /** * * @author Mikhail Shumenko */ @Entity //Cu această adnotare indicăm că această clasă este o entitate. @Table(name = "CART") // Cu această adnotare indicăm că un tabel numit CART este responsabil pentru această entitate din baza de date // Aș dori să remarc că cazul nu este important, această adnotare poate fi omisă, atunci Hibernate va crea o bază de date pentru noi cu //nume precum clasa publică a clasei CartEntity implementează Serializable ( //Aici scriem adnotări deasupra câmpurilor. Scrierea corectă deasupra getters-ului //Descrieți ID-ul tabelului @Id //Indicați că această clasă câmpul este responsabil pentru o coloană din tabel cu numele Id //Dacă nu o vom specifica, hibernate va crea o coloană cu același nume ca și câmpul @Column(name = "ID") // Puteți scrie un mult aici)) De ce am scris-o așa aici? În general, puteți scrie AUTO în //@GeneratedValue(strategy=GenerationType.instead of TABLE), apoi //când tabelul este încărcat pentru prima dată, Id-ul va fi generat automat de la 1 la valoarea sa maximă. //Dacă aveți 20 de lucruri în tabel, atunci de la 1 la 20 vor fi generate //Dar cu adăugările ulterioare, id-ul lucrului adăugat va fi cam așa - 345768. //Am scris totul astfel încât ultimul meu. id a fost stocat în tabel și generat apoi în mod adecvat cu adăugările ulterioare. //Există și SEQUENCE, dar nu este acceptată în Derby și vom lucra cu ea. //În general, acestea sunt nuanțe. Puteți afla despre ele singur @TableGenerator(name = "cartid", table = "cartpktb", pkColumnName = "idCart", pkColumnValue = "idCartValue",allocationSize = 1) @GeneratedValue (strategy = GenerationType.TABLE, generator = "cartid") private Integer id; //Указываем !} dimensiune maximă. Acesta este un șir de 25 de caractere. @Size(max = 25) @Column(name = "NAMEITEM") //Dacă tipul câmpului nostru este String, atunci va fi creată o coloană cu tipul VARCHAR (în Derby) //Dacă Integer, atunci va fi o coloană în pe care îl puteți plasa numai Integer //boolean în Derby este o coloană de tip SMALLINT private String nameItem; @Column(name = "PRICE") private Integer price; public CartEntity() ( ) public CartEntity(String nameItem, int preț) ( this.nameItem = nameItem; this.price = price; ) public CartEntity(Integer id, String nameItem, int preț) ( this.id=id; this. nameItem = nameItem; this.price = price ) public CartEntity(Integer id) ( this.id = id; ) public Integer getId() ( return id; ) public void setId(Integer id) ( this.id = id; ) public String getNameItem() ( return nameItem; ) public void setNameItem(String nameItem) ( this.nameItem = nameItem; ) public Integer getPrice() ( return price; ) public void setPrice(Integer price) ( this.price = price; ) )
A doua cale: scriem deasupra getters. Consultați codul pentru explicații. import java.io.Serializable; import javax.persistence.*; /** * * @author miha */ @Entity //Vezi, nu am specificat adnotarea @Table //Hibernate va înțelege totul pentru mine. clasă publică Produsul implementează Serializabil ( id Integer privat; nume șir privat de caractereProdus; Integer privat Produs disponibil; @Id @GeneratedValue(strategy = GenerationType.AUTO) //Am descris Id-ul deasupra getterului, ceea ce înseamnă că restul câmpurilor vor fi prelucrate getters public Integer getId() ( return id; ) public void setId(Integer id) ( this.id = id; ) public String getNameProduct() ( return nameProduct; ) public void setNameProduct(String nameProduct) ( this.nameProduct = nameProduct) ; ) public Integer getAvailableProduct() ( return availableProduct; ) public void setAvailableProduct (Integer availableProduct) ( this.availableProduct = availableProduct; ) )Deci, aveți două exemple de clase de entități. Creați restul folosind aceste exemple. Domenii precum: model, an apariție, denumire, cost - totul depinde de imaginația ta. Asigurați-vă că includeți câmpul Disponibil. Îți va fi de folos mai târziu. Puteți să o faceți boolean și să adăugați o coloană numită cantitate. Toate acestea ne vor fi de folos.
Acum să dăm un exemplu de HibernateUtil /* * Pentru a schimba acest șablon, alegeți Instrumente | Șabloane * și deschideți șablonul în editor. */ pachet edu.shumenko.hibernate; import edu.shumenko.entity.BookEntity; import edu.shumenko.entity.CableEntity; import edu.shumenko.entity.CameraEntity; import edu.shumenko.entity.CartEntity; import edu.shumenko.entity.CustomerEntity; import edu.shumenko.entity.NotebookEntity; import edu.shumenko.entity.ProductEntity; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.SessionFactory; /** * Clasa Hibernate Utility cu o metodă convenabilă pentru a obține obiectul Session Factory *. * * @author Mikhail Shumenko */ public class HibernateUtil ( //Creați SessionFactory. privat static final SessionFactory sessionFactory; static ( încercați ( //Creați o nouă instanță de AnnotationConfiguration AnnotationConfiguration ac = nou AnnotationConfiguration(); //Avem nevoie de aceasta în astfel încât să adăugăm toate clasele noastre de entități // fiecare dintre entitățile tale trebuie să fie înregistrată aici, dacă nu o înregistrezi, nu va funcționa .class).addAnnotatedClass(NotebookEntity.class).addAnnotatedClass(. CustomerEntity.class); //Deci am creat Session Factory //Este necesar pentru că lucrăm cu baza de date prin sesiuni //Detaliile vor veni mai târziu, deocamdată știm cum să o facem și cum să lucrăm cu ea ac.configure().buildSessionFactory(); catch (Throwable ex) ( // Înregistrează excepția. System.err.println(" Crearea inițială a SessionFactory a eșuat." + ex); aruncă un nou ExceptionInInitializerError(ex); ) ) public static SessionFactory getSessionFactory() ( return sessionFactory; ) ) DAO Să trecem la următoarea parte. Ce este DAO. Acesta este un model de design.Intelesul sau:
- Toate accesul la baza de date în sistem se face prin DAO pentru încapsulare.
- Fiecare instanță DAO este responsabilă pentru un obiect sau entitate de domeniu primar. Dacă un obiect de domeniu are un ciclu de viață independent, trebuie să aibă propriul său DAO.
- DAO este responsabil pentru operațiunile de creare, citire (prin cheie primară), actualizare și ștergere (adică CRUD (creare, citire, actualizare, ștergere)) a unui obiect de domeniu.
- DAO poate rezolva interogări pe baza altor criterii decât cheia principala. Mă refer la metode precum finder sau finders. Metoda finder returnează de obicei o colecție de obiecte de domeniu pentru care DAO este responsabil.
- DAO nu se ocupă de tranzacții, sesiuni sau conexiuni. Acest lucru se face în afara DAO pentru a oferi flexibilitate.
Google vă va spune întotdeauna mai multe.
Vom scrie un DAO pentru produsele noastre pentru moment.
Deci, să ne gândim la ceea ce avem de fapt nevoie. Tabelul Product va avea 4 câmpuri Id, nameProduct,available+amount+actionForServlet. Vom avea nevoie de el pentru a crea categorii pe site-ul nostru. Nu ne deranjam încă cu ultimul câmp. Singurul lucru de care avem nevoie este să obținem o listă de produse.
Scrierea unei interfețe
interfață publică ProductDAO ( ProductDAO INSTANCE_PRODUCT= new ProductDAOImpl(); ListGetProducts(); //și metoda cu care vom lucra)
Implementarea interfeței noastre. Consultați codul pentru explicații.
/* * Pentru a schimba acest șablon, alegeți Instrumente | Șabloane * și deschideți șablonul în editor. */ pachet edu.shop.model.dao; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; /** * * @author Mikhail Shumenko */ public class ProductDAOImpl implementează ProductDAO ( @Override public ListGetProducts() ( ListResult = null; //Creează o sesiune, este necesară pentru a utiliza tranzacții //În linii mari, o tranzacție este ca un punctul de recuperare, dacă nu este finalizat, atunci toate modificările sunt anulate Session session = HibernateUtil.getSessionFactory().openSession(). din baza de date // Această formulare cred că vă va fi suficientă deocamdată // Ca parametru, trecem clasa de entitate pe care o folosim Dacă datele ar fi primite din tabelul Cart, atunci // ar trebui pass Cart.class Criteria criterii = session.createCriteria(Product.class result = (List) criteria.list(); session.getTransaction().commit ) catch (Exception e) ( // Asigurați-vă că scrieți gestionarea excepțiilor); Dar vă las să faceți singuri acest lucru e.printStackTrace() în final ( if (session != null) session.close(); ) returnează rezultatul; ) )
Deci acum avem capacitatea de a prelua date din baza de date. Puteți folosi scriptlet-uri pentru a crea o buclă simplă pentru fiecare și pentru a vă afișa produsele pe pagina index.jsp
Dar aceasta este pentru prima dată și, în general, este rău să faci asta. Acest lucru rupe modelul nostru MVC. Voi explica cum să o fac corect în lecția următoare, dacă îmi dau o invitație. În a doua lecție ne vom ocupa de primăvară, în a treia vom atinge modelul Factory și vom aprofunda mai mult în Hibernate. Pentru cei care sunt deosebit de nerăbdători, vă voi arăta cum să ștergeți din baza de date, să salvați în baza de date și să ștergeți complet totul din baza de date. Ei bine, să lăsăm o discuție detaliată pentru mai târziu despre cum să facem ca toate acestea să interacționeze în ansamblu cu aplicația noastră.
Salvați în DB public void addItemToCart(CartEntity cart) ( Session session = HibernateUtil.getSessionFactory().openSession(); try ( session.beginTransaction().begin(); session.save(cart); session.getTransaction().commit (); ) catch (Exception ex) ( ex.printStackTrace(); ) finally ( if (session != null) ( session.close(); ) ) Ștergeți din baza de date prin id public void deleteItemFromCart(Integer id) ( Session session = HibernateUtil.getSessionFactory().openSession(); try ( session.beginTransaction().begin(); CartEntity itemDelete = (CartEntity) session.get(CartEntity.class, id); session.delete(itemDelete); getTransaction().commit(); catch (excepție ex) (ex.printStackTrace(); ) finally ( if (session != null) ( session.close(); ) ) Se elimină id-ul grupului din baza de date. public void deleteAllItemToCart(List idAllItemsInCart) ( Sesiune de sesiune = HibernateUtil.getSessionFactory().openSession(); try ( session.beginTransaction().begin(); for(Integer id:idAllItemsInCart)( CartEntity itemDelete =) sesiune (CargettEntity =) (CartEntity.class, id); session.delete(itemDelete); session.getTransaction().commit(); închide(); ) ) )Veți avea nevoie și de un fișier de configurare Hibernate. Creați o bază de date de magazin în Derby. Nume de utilizator și parolă utilizator rootși respectiv trece. Dacă nu merge, nu fi supărat - îi voi mai acorda ceva timp.
org.hibernate.dialect.DerbyDialect org.apache.derby.jdbc.ClientDriver jdbc:derby://localhost:1527/shop root pass UTF-8 update
Vom vorbi despre cum să ne completam bazele de date mai târziu. Le puteți completa manual. Sau așteptați următoarea lecție.
Continui să descriu procesul de creare a unei aplicații web folosind servlet-uri, jsp, Maven și Tomcat. , dacă este nevoie.
Creăm entități. Să creăm o clasă User în pachetul de entități, în care vom crea două variabile șir private nume și parolă. Să creăm constructori (implicit și unul care ar accepta ambele valori), getters/setters, suprascriem metoda toString() pentru orice eventualitate, precum și metodele equals() și hashCode(). clasă publică Utilizator (nume șir privat; parolă șir privat; utilizator public() ( ) public Utilizator(nume șir, parolă șir) ( this.name = nume; this.password = parolă; ) public String getName() ( return name; ) public void setName(String name) ( this.name = nume; ) public String getPassword() ( returnează parola; ) public void setPassword(String parola) ( this.password = parola; ) @Override public String toString() ( return "Utilizator(" + "nume="" + nume + "\"" + ", parola="" + parolă + "\"" + ")" ) @Override public boolean equals(Object o) ( dacă (acest = = o) returnează adevărat; dacă (o == null || getClass() != o.getClass()) returnează fals; Utilizator utilizator= (Utilizator) o; if (nume != null ? !name.equals(user.name) : user.name != null) returnează false; returnează parola != null ? password.equals(user.password): user.password == null; ) @Override public int hashCode() ( int rezultat = nume != nul ? name.hashCode() : 0; rezultat = 31 * rezultat + (parolă != null ? parola.hashCode() : 0); rezultat returnat; ) ) Acum putem începe să creăm o listă de utilizatori, unde ne vom adăuga utilizatorii și de unde îi vom lua pentru afișare. Dar aici e o problema. Nu creăm obiectele noastre servlet; Tomcat le creează pentru noi. Metodele pe care le suprascriem în ele sunt, de asemenea, deja definite pentru noi și nu putem adăuga un parametru. Cum să creez atunci lista comuna, care ar fi vizibil în ambele servlet-uri? Dacă pur și simplu ne creăm propriul obiect listă în fiecare servlet, se va dovedi că vom adăuga utilizatori la o singură listă, dar afișarea unei liste de utilizatori care utilizează servletul ListServlet va fi complet diferită. Se pare că avem nevoie de un obiect care ar fi comun ambelor servlet-uri. În general, avem nevoie de un obiect care să fie comun tuturor claselor din programul nostru; singurul obiect pentru întregul program. Sper că ați auzit ceva despre modelele de design. Și poate pentru unii aceasta este prima nevoie reală de a folosi un șablon în programul lor. Poți fi creativ și să faci niște singleton cool, cu verificări duble și sincronizare (da, avem o aplicație multi-threaded, deoarece Tomcat rulează servlet-uri în fire diferite), dar voi folosi opțiunea cu inițializare timpurie, deoarece în acest caz destul de potrivit. Crearea unui model. Apoi vom crea o clasă (și vom implementa șablonul singleton în ea) în pachetul de model și o vom numi, de asemenea, destul de colorat Model. Să creăm un obiect listă de utilizatori privat în el și să facem două metode: una astfel încât să puteți adăuga un utilizator, iar a doua - lăsați-l să returneze pur și simplu o listă de șiruri de caractere (nume de utilizator). Deoarece obiectul nostru utilizator constă dintr-un nume și o parolă, nu am dori să „dezvăluim” parolele de utilizator, așa că vom returna doar o listă cu numele acestora. clasă publică Model ( private static Model instance = new Model(); private List model; public static Model getInstance() ( return instance; ) private Model() ( model = new ArrayList(); ) public void add(Utilizator utilizator) ( model.add(user); public List list() ( return model.stream() .map(User::getName) .collect(Collectors.toList()); ) ) Un pic despre mvc. Din moment ce ați auzit despre singleton, înseamnă că probabil ați auzit despre un alt model de design - MVC (model-view-controller, sau în rusă model-view-controller, sau la fel ca în engleză model-view-controller). Esența sa este de a separa logica afacerii de prezentare. Adică, separă codul care definește ce să fac din codul care defineste cum se afișează. Vizualizarea (vizualizarea sau doar vizualizările) este responsabilă pentru forma în care sunt prezentate unele date. În cazul nostru, vizualizările sunt paginile noastre JSP. De aceea le-am pus într-un folder numit vederi. Modelul reprezintă datele reale cu care funcționează programul. În cazul nostru, aceștia sunt utilizatori (lista de utilizatori). Ei bine, controlorii - legătură de legăturăîntre ele. Ei preiau date din model și le transferă în vizualizări sau primesc unele date de la Tomcat, le procesează și le transferă pe model. Logica de afaceri (de ex. ce să fac) ar trebui să fie descrise în ele, și nu în model sau vedere. Astfel, fiecare își face treaba lui:- modelul stochează date
- Vizualizările desenează o reprezentare frumoasă a datelor
- controlorii procesează datele
Și, în sfârșit. Dacă doriți să exersați cu acest proiect, puteți încerca:
- faceți un servlet și jsp pentru a șterge un utilizator și încă câteva pentru a schimba/editați utilizator existent. Veți obține o aplicație web reală CrUD :) pe servlet-uri))
- înlocuiți lista (Lista) cu lucrul cu o bază de date, astfel încât utilizatorii adăugați să nu dispară după repornirea serverului :)
Paginile JSP au o sintaxă hibridă: o combinație dintre sintaxa standard conformă cu specificația HTML și sintaxa JSP definită de specificația Java Server Pages. Sintaxa JSP definește regulile pentru scrierea paginilor JSP constând din etichete standard Etichete HTML și JSP.
Paginile JSP, pe lângă etichetele HTML, conțin etichete JSP din următoarele categorii:
directive JSPDirectivele JSP oferă informații globale cu privire la cereri specifice, trimise către server și furnizați informațiile necesare în etapa de difuzare. Directivele sunt întotdeauna plasate la începutul paginii JSP înaintea tuturor celorlalte etichete, astfel încât analizator(analizator) La analizarea textului, JSP a evidențiat instrucțiunile globale chiar de la început. Astfel, JSP Engine (JSP runtime) analizează codul și creează un servlet din JSP. Directive reprezintă mesaje către containerul JSP.
Sintaxă directive JSP după cum urmează:
Sintaxa jobului directiveîn XML:
O directivă JSP poate avea mai multe atribute. În acest caz, directiva poate fi repetată pentru fiecare dintre atribute. În același timp, cuplurile „NumeAtribut=valoare” poate fi plasat sub o directivă cu un spațiu ca separator.
Există trei tipuri de directive:
- pagină
- taglib (biblioteca de etichete)
- include
Directiva de pagină JSP definește proprietățile paginii JSP care afectează traducătorul. Ordinea atributelor într-o directivă pagină nu contează. Încălcarea sintaxei sau prezența atributelor nerecunoscute duce la o eroare de traducere. Exemplu de directivă pagină Următorul cod ar putea servi:
Directiva de pagină declară că această pagină JSP nu utilizează buffering, că este posibil ca mulți utilizatori să acceseze o anumită pagină JSP în același timp și că o pagină de eroare numită error.jsp.
Directiva de pagină JSP poate conține informații despre pagină:
Lista de atribute posibile ale directivei pagină prezentate în tabel.
limba | Linia | Specifică limba utilizată în scriptleturile, expresiile sau orice fișiere incluse ale fișierului JSP, inclusiv corpul codului tradus. Valoarea implicită este „java” |
se extinde | Linia | Specifică superclasa pentru servletul generat. Acest atribut trebuie folosit cu mare grijă, deoarece este posibil ca serverul să folosească deja o superclasă |
import | Linia | Definiția pachetelor de importat, de exemplu: declaraţie< jsp : scriptlet >scriptlet< jsp : expression >expresie |