Spring Notes PDF
Spring Notes PDF
Framework-ul este o bucată de software. Acest lucru rezolvă problemele care apar în mod frecvent ș i repetat.
probleme în multiple proiecte.
Framework-ul Spring este o platformă Java open source ș i a fost scris iniț ial de Rod
Johnsonand a fost lansat pentru prima dată sub licenț a Apache 2.0 în iunie 2003.
Spring is more flexible framework when we compared with struts. By using Struts 1.3
ș i 2.3 putem dezvolta doar aplica ț ii bazate pe web. Dar folosind Spring putem
dezvoltă aplicaț ii web, precum ș i aplicaț ii independente.
Putem folosi oricare dintre următoarele cadre pentru a dezvolta aplicaț iile bazate pe web.
Ele sunt :
Struts [Link] [Link] [Link]ă web [Link]
Framework-ul Spring este o bucată de software care conț ine soluț ii pentru problemele comune.
probleme care au avut loc repetat în mai multe proiecte.
DispatcherServlet în Spring
Atunci când folosim un cadru, nu avem nevoie să folosim codul RequestDispatcher.
deoarece nu trebuie să codificăm numele căilor resurselor. Folosind aceste cadre
putem să le configurăm în fiș ierele de configurare.
Dacă folosim JDBC, Servlete, Jsps pentru a dezvolta aplicaț ii bazate pe formulare, trebuie să
scrie o cantitate mare de cod pentru a avea grijă de validările de server ș i de afiș are
erori în aceeaș i formă.
By using JDBC, Servlets, Jsps we have to provide huge amount of code to develop
aplicaț iile I18n. (Programele care afiș ează ieș irea în funcț ie de client)
limbi regionale
Framework-urile precum Struts ș i Spring au fost livrate cu un set de etichete predefinite.
biblioteci. Dacă folosim Servlete ș i JSP-uri, trebuie să dezvoltăm propria noastră bibliotecă de etichete.
ceea ce este dificil.
Fiecare companie î ș i folose ș te propriile cadre pentru a dezvolta proiectele. Toate acestea
framework-urile utilizează intern celelalte framework-uri.
Următoarea este lista câtorva dintre marile avantaje ale utilizării Spring Framework:
Frameworkul web Spring este un framework web MVC bine conceput, care oferă
o alternativă excelentă la cadrele web precum Struts sau alte soluț ii supra-inginerizate
framework-uri web mai puț in populare.
Spring oferă o API convenabilă pentru a traduce excep ț iile specifice tehnologiei
(generat de JDBC, Hibernate sau JDO, de exemplu) într-o stare consistentă, necontrolată
excepț ii.
Containerele LightweightIoC tind să fie uș oare, în special atunci când sunt comparate cu
Containere EJB, de exemplu. Acest lucru este benefic pentru dezvoltarea ș i implementarea
aplicaț ii pe calculatoare cu memorie ș i resurse CPU limitate.
Spring oferă o interfaț ă consistentă de gestionare a tranzacț iilor care poate scala.
la o tranzacț ie locală (folosind o singură bază de date, de exemplu) ș i a creș te la
transacț ii globale (utilizând JTA, de exemplu).
Ce este IOC?
IOC reprezintă Inversiunea Controlului. O persoană 'x' acț ionează aș a cum ar trebui să facă o muncă în schimb.
acelei persoane a realizat sarcinile, iar cealaltă persoană 'y' a finalizat sarcina ș i
rezultatul este savurat de persoana 'X'. Vom numi aceasta Inversarea Controlului.
Framework-ul Spring este împărț it în câteva module. Avantajul acestei abordări este
putem include doar modulele necesare în proiectul nostru.
Ei sunt:
[Link] [Link] [Link] [Link] [Link] [Link]
Modul de bază:
Ca parte a modulului de bază avem IOC.
Acces/Integrare Date:
Stratul de Acces/Integrare a Datelor constă din JDBC, ORM, OXM, JMS ș i Tranzacț ie
module care au detaliile următoare:
ModululDAO: Când folosim modulul DAO, putem reduce mult codul în
proiect. Modul DAO rezolvă toate problemele legate de erorile specifice bazei de date.
Modulul JDBC oferă un strat de abstractizare JDBC care elimină necesitatea de a face
programare legată de JDBC plictisitoare.
Web:
Există câteva module importante precum AOP, Aspects, Instrumentaț ie, Web ș i
Module de test al căror detaliu este următorul:
AOP:
AOP reprezintă programarea orientată pe aspecte. Aceasta rezolvă problema ...
Ups.(moș tenire între clasele multiple)
Grupul de oameni din sursa deschisă vine cu un model de programare numit AOP.
software-ul AspectJ a urmat Aop ș i a dezvoltat modulul Aop. Tipii de la Spring
has developed some classes which follows the aop module.
Modulul AOP oferă o implementare a programării orientate pe aspecte
permiț ându-vă să definiț i interceptori de metode ș i puncte de tăiere pentru a decupla clar
cod care implementează funcț ionalitate care ar trebui să fie separată.
Modulul Aspectsmodule oferă integrare cu AspectJ, care este din nou un instrument puternic.
ș i un cadru de programare orientată pe aspecte (AOP) matur.
Dacă resursa aplicaț iei caută ș i adună valorile sale dependente din alte
resursele aplica ț iei sunt numite căutarea dependen ț elor. În căutarea dependen ț elor
resursele extrag valorile din alte resurse.
Dacă valorile sunt asignate variabilelor doar după ce metoda este apelată explicit, este denumită
cercetarea dependenț ei. Modul în care aplicaț ia client adună referinț a obiectului DataSource de la
software-ul de registru se numeș te căutare a dependenț elor.
Injecț ia de dependenț ă:
Dacă containerul, cadrul, serverul sau mediul de execuț ie de bază este dinamic
atribuirea valorilor dependente resurselor aplicaț iei este denumită Dependenț ă
injecț ie sau IOC.
În injec ț ia de dependen ț ă, containerul/frameworkul de bază împinge dinamic
valori către resurse..
De exemplu: Modul în care ActionServlet scrie datele formularului în obiectul clasei FormBean se încadrează în
Injectarea dependenț ei.
Orice clasă Java predefinită sau definită de utilizator poate fi numită bean Spring.
Clasa Java care conț ine doar logică de persistenț ă ș i separă această logică de altele.
logica aplicaț iei se numeș te DAO.
Spring suportă clasa POJO. Clasa POJO nu este nimic altceva decât o clasă care nu extinde sau
orice altă clasă sau interfaț ă.
Procedura de configurare a primei aplicaț ii Spring:
Paș i:
1. Creează un spa ț iu de lucru pentru aplica ț ia spring.
2. Creează proiectul java.
3. Adăuga ț i bibliotecile Spring la proiect prin selectarea adăugării capacită ț ilor Spring în
MyEclipse. Ș i adaugă biblioteca utilizatorului în IDE-ul Eclipse în următorul mod:
Proiect-- proprietăț i---------- JavaBuildpath--------- Adaugă bibliotecă-----
BibliotecaUtilizator nou oferi nume pentru lib (spring) Adăugaț i borcane--
Apoi adaugă toate fiș ierele jar Spring.
Ș ir de stradă;
String oraș ;
String stare;
[Link](“srnagar”);
[Link]("hid");
[Link]("ap");
Din diagrama de mai sus am observat că objAddress este dependent de obiectele String.
Semnificaț ia acestui lucru este că obiectul Address foloseș te obiectul String.
<boabe>
<beanid="" class="" lazy-init="">
<proprietate> </proprietate>
</bean>
<boabe>
Procedura de configurare a bean-ului spring în fiș ierul de configurare Spring în MyEclipse:
Framework-ul Spring MVC
Spring MVC ajută la construirea de aplicaț ii web flexibile ș i slab legate.
Model-vizionare-controlerul ajută la separarea logicii de afaceri,
logica de prezentare ș i logica de navigare. Modelele sunt responsabile pentru encapsularea
datele aplicaț iei. Vederile redau răspunsul utilizatorului cu ajutorul
model obiect. Controlerele sunt responsabile pentru primirea cererii de la utilizator
ș i apelând serviciile de back-end.
Figura de mai jos arată fluxul de solicitare în cadrul Spring MVC Framework.
Când o cerere este trimisă către cadrul Spring MVC, următoarea secvenț ă de
evenimentele se întâmplă.
Mergi la Fisier -> Nou -> Proiect Web Dinamic, pentru a crea un proiect web.
tipăriț i?
[Link] [Link];
[Link];
03.
[Link];
[Link];
06.
[Link] {
08.
10.
11.@Override
14.}
15.
[Link] = message;
18.}
19.
20.
DispatcherServlet, după cum sugerează numele, este un servlet unic care gestionează
întreaga procesare a cererilor. Când o cerere este trimisă către
DispatcherServlet-ul deleghează sarcina prin invocarea controlerelor corespunzătoare
pentru a procesa cererea. Ca orice alt servlet, DispatcherServlet trebuie să fie
configurat în descriptorul de desfăș urare web, aș a cum este arătat.
vizualizaț i sursa
tipăriț i?
02.<web-app xmlns:xsi="[Link]
instanț ăxmlns=[Link]
com/xml/ns/javaee/web-
app_2_5.xsdxsi:schemaLocation=[Link]
[Link]/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID"version="2.5">
03.<servlet>
04.<numele-servletului>dispatcher</numele-servletului>
06.<load-on-startup>1</load-on-startup>
07.</servlet>
08.<mapare-servlet>
09.<nume-servlet>dispatcher</nume-servlet>
10.<pattern-url>*.htm</pattern-url>
11.</servlet-mapping>
12.<lista-fiș ierelor-de-binevenit>
13.<welcome-file>[Link]</welcome-file>
14.</welcome-file-list>
15.</web-app>
print?
01.<bean id="viewResolver"
[Link]ă=" [Link].
InternalResourceViewResolver
03.<property name="prefix">
04.<value>/WEB-INF/jsp/</value>
05.</property>
06.<property name="suffix">
07.<valoare>.jsp</valoare>
08.</proprietate>
09.</bean>
10.
13.</bean>
14.
15.</beans>
3.</bean>
Aici, atributul name al elementului bean indică modelul URL pentru a mapa
cererea. Deoarece atributul id nu poate conț ine caractere speciale precum "/" , noi
specificaț i modelul URL utilizând atributul thename al elementului beanel. În mod implicit
DispatcherServlet foloseș te BeanNameUrlHandlerMapping pentru a mapa
cerere intrare. TheBeanNameUrlHandlerMapping foloseș te numele bean-ului ca
Model URL. Deoarece BeanNameUrlHandlerMapping este folosit în mod implicit, trebuie
nu faceț i nicio configurare separată pentru asta.
Setăm atributul mesaj al clasei HelloWorldController prin setter
injection. Clasa HelloWorldController este configurată exact ca o altă
Clasa JavaBean în contextul aplicaț iei Spring, aș a că, ca orice alt JavaBean, noi
poate seta valori pentru acesta prin Injectarea de Dependenț ă (DI).
[Link] va redirecț iona cererea către DispatcherServlet, care la rândul său
consultă cu theBeanNameUrlHandlerMapping ș i invocă
ControllerulHelloWorld. Metoda handleRequestInternal() în
Clasa HelloWorldController va fi invocată. Aici returnăm proprietatea mesajului
under the namewelcomeMessageand the view namewelcomePageto
theDispatcherServlet. As of now we only know the view name, and to find the
pentru a invoca vizualizarea actuală, avem nevoie de un aViewResolver.
tipăriț i?
01.<bean id="viewResolver"
[Link]ă="
[Link]
03.<property name="prefix">
04.<value>/WEB-INF/jsp/</value>
05.</property>
06.<property name="suffix">
07.<value>.jsp</value>
08.</property>
09.</bean>
vizualizaț i sursa
print?
[Link]-runtime-3.0
[Link]-logging-1.0.4
[Link]-3.0.0.M3
[Link]-3.0.0.M3
[Link]-3.0.0.M3
[Link]-3.0.0.M3
[Link]-3.0.0.M3
[Link]-3.0.0.M3
[Link]-3.0.0.M3
[Link]-3.0.0.M3
Mapări, Controler, Model, Vedere ș i Rezolvator de Vederi împreună cu API-ul corespunzător sunt
discutat pe scurt. În cele din urmă, articolul va concluziona prin prezentarea unei aplicații de exemplu.
citeș te de asemenea:
Înainte de a analiza diversele componente care sunt implicate în cadrul Spring MVC.
să aruncăm o privire asupra stilului Spring Web Flow.
Clientul solicită o resursă în aplicația web.
2. Controllerul Principal de Primăvară, care este implementat ca un Servlet, va intercepta Cererea și
atunci voi încerca să găsesc mapările handler-ului potrivit.
3. Mapele de gestionare sunt folosite pentru a mapa o solicitare de la Client la obiectul său Controller navigând
6. Front Controller-ul încearcă apoi să rezolve View-ul actual (care poate fi Jsp, Velocity sau Free)
marker) consultând obiectul View Resolver.
7. Apoi, Viziunea selectată este redată înapoi Clientului.
Să examinăm diversele Componente de Bază care alcătuiesc Stratul Web Spring. Următoarele sunt
componentele acoperite în secțiunile următoare.
3) Servlet Dispecer
Servletul Dispatcher, reprezentat de [Link],
urmează modelul de design Front Controller pentru gestionarea cererilor clienților. Asta înseamnă că orice
Url vine de la Client, acest Servlet va intercepta Cererea Clientului înainte de a o transmite.
Obiect la Contoller. Fișierul de configurare TheWeb ar trebui să fie definit într-un mod astfel încât să
acest Dispatcher Servlet ar trebui să fie invocat pentru cererile clientului.
Următoarea este definiția dată în [Link] pentru a invoca Servletul Dispatcher al Spring.
[Link]
1 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4">
2
3
<servlet>
4
<servlet-name>dispatcher</servlet-name>
5
<clasa-servlet>
6
[Link]
7
</clasă-servlet>
8 <load-on-startup>2</load-on-startup>
9 </servlet>
10
11 <mapare-servlet>
12 <servlet-name>dispatcher</servlet-name>
<url-pattern>*.*</url-pattern>
13
</servlet-mapping>
14
15
</web-app>
16
17
Informații pentru aplicație. Contextul aplicației este un fișier Xml care conține variateBean
Definiț ii. În mod implicit, servletul Dispatcher va încerca să caute un fiș ier după numele <servlet-name>-
[Link] în directorul WEB-INF. Așadar, în cazul nostru, Servletul va căuta un fișier numit
fișierul [Link] în directorul WEB-INF.
Este înțelept uneori să împărțiți toate informațiile de Configurare în mai multe Fișiere de Configurare. În
într-un astfel de caz, trebuie să ne bazăm pe un Servlet Listener numit Context Loader.
[Link].
1
<aplicaț ie-web>
2
3 <ascultător>
4 <listener-class>
5 [Link]
6 </casa-de-audiente>
</listener>
7
8
9 </web-app>
În mod implicit, acest Context Listener va încerca să caute Fișierul de Configurare după nume.
'[Link]'in the'/WEB-INF'directory. But with the help of the
parametru 'contextConfigLocation' locația implicită poate fi suprascrisă. Chiar și mai multe
Fișierele de configurare, fiecare conținând o bucată separată de informație, sunt de asemenea posibile.
[Link]
1
<?xml version="1.0" encoding="UTF-8"?>
2
<web-app version="2.4">
3
4
<ascultător>
5 <listener-class>
6 [Link]
7 </listener-class>
8 </ascultător>
10 <parametru-context>
<param-name>contextConfigLocation</param-name>
11
<param-value>/WEB-INF/[Link], /WEB-INF/[Link]</param-value>
12
</context-param>
13
14
</web-app>
15
The above definition instructs the Framework to look and load for the Configuration Files by
numiți '[Link]' și '[Link]' în directorul WEB-INF.
4) Mapările Handler
Când cererea clientului ajunge la Servletul Dispatcher, Servletul Dispatcher încearcă să găsească
appropriateHandler MappingObject to map between the Request and the Handling Object.
Maparea Handler oferă un mod abstract de a spune cum trebuie să fie mapat URL-ul Clientului la
Manipulatoare. Patru variante concrete ale mapării manipulatoarelor sunt disponibile. Acestea sunt definite după cum urmează
Mapare Handler Url NumeFasole
CommonsPathMap HandlerMapping
NumeleClaseiDeControler MappareHandler
SimpleUrl HandlerMapping
Toate obiectele de mapping pentru handler menționate mai sus sunt reprezentate
Aceasta este cea mai simplă dintre Mapările Handler și este folosită pentru a mapa Url-ul care vine de la
Clienți direct la Obiectul Bean. În secțiunea următoare, vom vedea că Bean-ul nu este nimic altceva decât o
Obiect de control. De exemplu, considerați că următoarele sunt URL-urile valide într-o aplicație web care
o aplicație client poate solicita.
1 [Link]
3 [Link]
6 [Link]
2
<bean name="/[Link]"
3
clasa="[Link]">
4
</bean>
5
6 <bean name="/[Link]"
7 clasa="[Link]">
</bean>
8
9
<bean name="/ [Link]"
10
clasa="[Link]">
11
</bean>
12
13
</beans>
14
15
So, inBeanNameUrl Handler Mapping, the Url of the Client is directly mapped to the Controller. To
activează acest tip de mapare a handler-ului în aplicație, fișierul de configurare ar trebui să aibă un conținut similar
3 …
4 <bean id="beanNameUrl"
5 class="[Link]"/>
6 …
7
</beans>
8
Aceasta este o mapare de Handler rar utilizată în care, numele URL-ului la care controlerul are
a fi mapat este specificat direct în fișierul sursă al Controlerului. Având în vedere ce a fost spus anterior
8 /**
9 *@@ [Link].
10 *CaleMap("/[Link]")
11 */
12 publicclassComposeMailController{
}
13
14
/**
15
*@@ [Link].
16
*PathMap("/[Link]")
17
*/
18
publicclassDeleteMailController {
19 }
20
3 <bean id="metaHandlerMapping"class="[Link].
4 [Link]"/>
6 </beans>
În acest tip de mapare a handler-elor, numele controlerului este preluat direct din URL-ul în sine cu
modificări ușoare. De exemplu, să presupunem că cererea Clientului se termină cu Url-ul așa cum este arătat
mai jos
1 [Link]
3 [Link]
[Link]
1 publicclassShowController{
2 }
De asemenea, fișierul de configurare este creat pentru a activa acest tip de mapare a handler-ului prin efectuarea următoarelor
definiție
1 <boabe>
6 </beans>
Primul lucru pe care îl face Framework-ul este să parcurgă lista de controale definite în
Fișier de configurare și efectuează aceste acțiuni. Pentru Controller ShowController, apoi Cadru
va elimina șirul Controller și apoi va transforma prima literă în litera mică. În cazul nostru, șirul acum
devine show. Acum, orice Cerere de Client se potrivește cu pattern-ul/show*, atunci
ControlerulShowva fi invocat.
Aceasta este cea mai simplă dintre toate mapările de handler, deoarece mapează direct cererea clientului la ceva
1
<bean id="simpleUrlMapping"
2
clasa="[Link]">
3
4 <property name="mappings">
5 <props>
6 <prop key="/[Link]">showController</prop>
7 <prop key="/[Link]">composeController</prop>
8 <prop key="/[Link]">deleteController</prop>
</props>
9
</property>
10
11
</bean>
12
Setul de mapări este încapsulat în eticheta 'property' cu fiecare definit într-un element 'prop'
cu atributul 'cheie' fiind Url, valoarea fiind Identificatorul Obiectelor Controlerului. Notă
că boabele pentru identificatorii de mai sus ar trebui să fie definite undeva în fișierul de configurare.
5) Adaptori de manipulare
Este important să înțelegem că Spring Framework este suficient de flexibil pentru a defini ce
Componentele ar trebui să fie delegate cererea odată ce Servletul Dispatcher găsește
Maparea handler-ului adecvat. Acest lucru se realizează sub forma adapterilor de handler. Dacă îți amintești
HandlerAdapter([Link]
pter) ș i SimpleServlet
HandlerAdapter([Link]).
HandlerAdapter-ul TheThrowaway Controller, de exemplu, transportă cererea de la Dispatcher.
Servlet către Controllerul de Aruncare (discutat mai târziu în secțiunea despre Controlere) și Simplu
Adaptorul Handler Servlet va transmite cererea de la Servletul Dispatcher la un Servlet
astfel făcând ca metoda [Link]() să fie invocată.
Dacă, de exemplu, nu doriți adaptorul de gestionare a controlerului defaultSimple, atunci trebuie să
redefine fișierul de configurare cu informații de același tip ca cele prezentate mai jos,
1 <bean id="throwawayHandler" class="[Link].
2 ThrowawayControllerHandlerAdapter"/>
4 sau
SimpleServletHandlerAdapter"/>
7
Dacă cineva doreș te să implementeze un Component de Control Personalizat direct de la zero, atunci în loc de
implementarea interfeței Controller, extinderea AbstractController poate fi preferată deoarece aceasta
oferă suportul de bază pentru metodele GET și POST. Se recomandă ca doar pentru simplu
scop, acest tip de extensii ar trebui folosit. Scopul poate fi la fel de simplu ca returnarea unei
resursa pentru Client la cerere fără a fi necesar să examineze Parametrii Cererii sau
alte lucruri. De exemplu, considerați următorul cod,
[Link]
1 publicclassMySimpleController extindeAbstractController{
4 HttpServletResponse răspuns){
5
8 }
}
9
Conceptul de Controler de Comandă intră în discuție atunci când Logica de Afaceri depinde de
valorile care sunt trimise de utilizator. În loc să depindă de Servlet Api pentru a obține
Valorile parametrilor de cerere și alte obiecte de sesiune, ne putem baza pe această comandă abstractă
Controler pentru a prelua acele informaț ii. De exemplu, luaț i în considerare următorul fragment de cod.
care are o logică de afaceri simplă care spune că, în funcție de existența numelui de utilizator, afișează
formulã[Link]
[Link]
1 public class MySimpleController extinde AbstractCommandController {
3 publicMySimpleController(){
4 setCommandClass([Link]);
5 }
Obiect comanda){
8
9
10 UserInfo userInfo = (UserInfo)comand;
11 if(exists([Link]){
17
privatebooleanexits(String numeutilizator){
18 // Unele logici aici.
19 }
20 }
21
Rețineți că Parametrii Clientului (nume de utilizator, în acest caz) sunt encapsulați într-o clasă simplă
informațiile utilizatorului apelat, care sunt date mai jos. Valoarea dată de Client pentru câmpul numelui de utilizator va fi
3 privateString numeUtilizator;
6 }
6.3) Controler simplu de formulare
Solicitarea utilizatorului de a completa un formular care conține diverse informații și trimiterea formularului în mod normal
se întâmplă în aproape fiecare aplicație web. Controlerul Simplu de Formulare este folosit exact pentru asta
scop. Să ne dăm un exemplu simplu pentru a ilustra acest lucru. Să presupunem că, la cererea clientului, o pagină
se numește [Link] și este redat clientului conținând câmpurile empName, empAge și empSalary.
La finalizarea cu succes, o pagină Jsp numită [Link] este afișată înapoi clientului.
Acum să vedem cum putem folosi Controlerul de Formulare Simple pentru a obține acest tip
funcționalitate.
Primul lucru este că, pentru a colecta valorile de intrare ale clientului, este necesar un obiect Command care conține
3 privateString empName;
4 privateintempAge;
8
}
9
Următorul pas este să scrieți o clasă care extinde SimpleFormController. Dar de data aceasta,
metoda thedoSubmitAction() ar trebui să fie suprascrisă. Aceasta este metoda care va fi apelată când
Clientul trimite formularul. Următoarea este definiția clasei Controller.
[Link]
1 publicclassEmpFormController extendsSimpleFormController{
3 publicEmpFormController(){
4 setCommandClass([Link]);
5 }
6
7 publicvoiddoSubmitAction(Object command){
procesează(info);
9
}
10
11
privat void procesare(EmpInfo info) {
12
//Executaț i câteva procese cu acest obiect.
13
}
14
}
15
16
Așa cum am menționat anterior, formularul care colectează informații de la Client este [Link] și
după trimiterea cu succes, pagina [Link] ar trebui să fie afişată. Aceste informaţii sunt
3 <property name="formView">
4 <value>empInfo</value>
5 </property>
7 <property name="successView">
8 <value>empSuccess</value>
</property>
9
10
</bean>
11
Observați cele două nume de proprietate 'formView' și 'successView' împreună cu
valorile 'empInfo' ș i 'empSuccess'. Aceste proprietăț i reprezintă Vederea iniț ială care va fi afiș ată
și vizualizarea finală (după trimiterea cu succes a formularului) să fie redată Clientului.
Dacă observi cu atenție, odată cu implementarea Controlerului de Formulare Simple, există modalități de a oferi
Viziunea inițială și cea de succes pentru clienți. Dar ce se întâmplă când formularul este anulat de
Utilizatorul? Cine va procesa operațiunea de anulare a formularului?
Problemele de mai sus pot fi rezolvate imediat cu utilizarea Controlerului de Formulare Cancelabil.
The good thing is that Cancellable FormController extendsSimpleForm Controllerso that all the
funcționalitățile sunt vizibile și pentru acest Controler. Să presupunem că utilizatorul apasă butonul de anulare,
Frameworkul va verifica în parametrul Request dacă există o cheie cu numele 'cancelParamKey'. Dacă este
așadar, atunci va apela metoda onCancel(). Considerați următoarea definiție,
[Link]
1 publicclassMyCompleteFormController extendsCancellableFormController{
3 publicModelAndView peAnulare(){
4 returneazănewModelAndView("cancelView");
5 }
}
6
7) Model și Vedere
Modelul ș i Viziunea (reprezentate de)
[Link]) este returnat de Controler
obiect înapoi la Dispatcher Servlet. Această clasă este doar o clasă Container pentru a reține Modelul și
informațiile Vizualizare. Obiectul Mod reprezintă o bucată de informație care poate fi folosită de către
Vedere pentru a afișa informațiile. Ambele aceste obiecte sunt date cu un grad înalt de abstractizare în
Framework-ul Spring.
Orice fel de tehnologie View ([Link]) poate fi integrată
în cadrul Cadru cu ușurință. De exemplu, Excel, Jasper Reports, Pdf, Xslt, Free Marker, Html,
Module, Viteza etc. sunt cadrele acceptate până acum. Obiectul Model (reprezentat
[Link]) este mentinut intern ca o hartă pentru stocarea
Informații.
Următoarele sunt modalitățile de a construi modelul și obiectul View.
Ceea ce este deasupra construiește un obiect ModelAndView prin trecerea efectivă a obiectului View împreună cu
Observați, în exemplul de mai sus, un șir cu „myView” este trecut pentru View. Această modalitate de specificare
aView este numit aLogical View. Aceasta înseamnă că myView poate indica fie către ceva numit
[Link] sau [Link] sau [Link]. Locația Fizică a Vederii corespunzătoare
Viziunea logică poate fi configurabilă în fiș ierul de configurare.
8) Resolver de Vizualizare
În secțiunea anterioară, am vorbit despre Viziunea Logică și Locația Viziunii Fizice pentru
Viziunea logică. Asocierea între numele logic și locația viziunii fizice este gestionată.
de obiectul View Resolver. Fără nicio surpriză, Spring vine cu un set de Built-In Spring
Resolveri. Este chiar posibil să scrii Resolutori de Vedere Personalizată implementând
interfața [Link]. Următoarele sunt disponibile
Vizualizați rezolvatoarele în distribuția Spring.
BeanNameViewResolver
FreeMarkerViewResolver
InternalResourceViewResolver
JasperReportsViewResolver
ResourceBundleViewResolver
UrlBasedViewResolver
VelocityLayoutViewResolver
VelocityViewResolver
XmlViewResolver
XsltViewResolver
Secțiunea următoare se concentrează doar pe Resolverul de Vederi Intern și Numele Bean-ului
Rezolvator de vizualizări în detaliu.
Resolverul de vizualizare a resurselor interne va încerca să mapeze numele logic al resursei așa cum este returnat
de către obiectul Controller sub forma obiectului ModelAndView către locația fizică a Viziunii. Pentru
example, consider the following class definition which returns different ModelAndView objects.
[Link]
1
publicclassMyController {
2
3
public void handle() {
4 dacă(condition1()){
6 }else dacă(condition2()){
8 }
Să presupunem că, dacă cererea clientului satisface condition1(), atunci vizualizarea [Link] care este
1 <bean id="viewResolver"class="[Link].
2 InternalResourceViewResolver
4 <property name="prefix"><value>/WEB-INF/</value></property>
5 <property name="suffix"><value>.jsp</value></property>
7 </bean>
Acesta este modul în care Resolverul de Vizualizare a Resurselor Interne va map localiza Numele Vizualizării Logice la fizic
Locație. Atunci când numele vederii logice este myView1, atunci va construi un nume de vedere care este
sumarea prefixului + Numele Vederii Logice + sufixul, care va fi /WEB-
INF/[Link]. Aceeași situație este pentru [Link] și [Link].
8.2) Resolver de viziune bazat pe numele de bean
One of the dis-advantage of usingInternal Resource View Resolveris that the name of the View
fișierul (indiferent dacă este un fișier Jsp sau un fișier Pdf) trebuie să fie prezent în contextul aplicației web.
Fișierele de vizualizare generate dinamic s-ar putea să nu fie posibile. În acest caz, putem folosi numeleBean
Rezolvator de vizualizare care va genera dinamic Vizualizarea în formate Pdf sau Excel.
De exemplu, dacă obiectul ModelAndView reprezintă o Viziune numită „pdf” așa cum este arătat în
următorul fragment,
1 returneazăModelȘ iVedere("pdf")
Și, dacă vrem să generăm fișierul Pdf, atunci ar trebui să fi definit informațiile de configurare
în fișierul următor,
1 <bean id="beanNameResolver"
2 class="[Link]"/>
Codul de mai sus configurează Framework-ul pentru a utiliza BeanNameViewResolver. Deoarece numele logic
„pdf” trebuie să se rezolve la un nume de Bean, ar trebui să definim o intrare similară cu următoarea în
Fișier de Configurație. Rețineți că, în următoarea MyPdfGenerator poate fi sub-clasa
[Link] generating
Fișierul Pdf.
1 <bean id = " pdf" class="MyPdfGenerator"/>
9) Aplicație de probă
9.1) Introducere
Secțiunea finală a acestui articol detaliază o aplicație simplă de contact care are prevederi pentru crearea,
Ştergerea şi listarea obiectelor de contact. Scopul acestei aplicaţii este de a arăta diferitele utilizări ale
Componentele controller-ului, cum ar fi Controller-ul abstract, Controller-ul abstract de comenzi și Controller-ul de formular
După cum s-a menționat anterior, deoarece Dispatcher Servlet acționează ca un Interceptor pentru Client
Solicitare, o intrare pentru aceasta trebuie menționată în fișierul [Link]. Următorul este un fragment de cod
pentru același lucru,
[Link]
1 [Link]
4<web-app version="2.4"xmlns="[Link]
5 xmlns:xsi="[Link]
xsi:schemaLocation="[Link]
6
7
[Link]
8
9
<servlet>
10
<servlet-name>dispatcher</servlet-name>
11
<clasa-servlet>
12
[Link]
13
</clasă-servlet>
14 <load-on-startup>2</load-on-startup>
15 </servlet>
16
17 <mapare-servlet>
18 <servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
19
20 </mapare-servlet>
21
22 </web-app>
23
24
5
<bean id="beanNameUrlMapping" class="[Link].
6
MapareUrlBeanNameHandler"/>
7
8
<bean name = "/[Link]" class="[Link].
9 [Link]
10
11 <property name="formView">
12 <value>CreateContact</value>
13 </proprietate>
<property name="successView">
14
<value>ContactCreated</value>
15
</proprietate>
16
17
</bean>
18
19
<bean name = "/[Link]" class= "[Link].
20
[Link]
21 </bean>
22
24 [Link]
25 </bean>
26
<bean id="viewResolver" class="[Link].
27
InternalResourceViewResolver
28
<property name="prefix"value="/WEB-INF/contacts/"/>
29
<property name="suffix"value=".jsp"/>
30
</bbean>
31
32
</beans>
33
34
35
9.4) CreareContact și Fișiere Jsp ContactCreat
[Link]
1
<html>
2
<head>
3
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4
5
<title>Create a Contact</title>
6
</cap>
7 <body>
9 <h1>Creează un Contact</h1>
10
17
</body>
18
</html>
19
Rețineți că, deoarece aceasta este pagina care va fi afișată utilizatorului inițial, în fișierul de configurare,
proprietatea 'formView' este indicată către 'CreateContact'. Următorul este codul pentru
[Link]. Deoarece aceasta este Vista care va fi afișată după trimiterea formularului,
property'successView'is made to point to'ContactCreated'.
[Link]
1
<html>
2
<cap>
3 <meta http-equiv = "Content-Type" content = "text/html; charset = UTF-8">
4 <title>Contact is Created</title>
5 </head>
7 <corp>
8
<h1>Contactul a fost creat cu succes</h1>
9
10
</body>
11
</html>
12
9.5) [Link]
Următoarea este lista completă pentru fișierul [Link]. Rețineți că acest fișier Jsp este mapat
controllertodeletecontactinfișierul de configurare.
[Link]
1
<html>
2 <head>
5 <title>Delete Contact</title>
6 </head>
<corp>
7
8
<h1>Ș terge Contact</h1>
9
10
<br>
13
<input type="submit"name = "DeleteContact"value = "Delete Contact"/>
14
</form>
15
16
</body>
17
</html>
18
9.6) [Link]
Această pagină este pentru a lista toate Contactele existente care au fost create anterior. Trebuie menționat că
Obiectul model care conține toate informațiile de contact sub formă de listă este disponibil în
ListContactsController. Modelul informației din Controller după ce a fost legat la
Scope-ul cererii este scos din vizualizare sub formă de limbaj de expresie.
Următoarea este lista pentru [Link]
[Link]
1
<html>
2 <head>
6 </cap>
<body>
7
8
<h1>Arătând Toate Contactele</h1>
9
10
11 <p> Următoarele sunt Contactele create </p>
12
${[Link]}<br>
14
${[Link]}<br>
15
</c:forEach>
16
17
</body>
18
</html>
19
20
9.7) [Link]
Următoarea este structura clasei pentru [Link] pentru încapsularea proprietăților firstname și
nume de familie.
[Link]
1
[Link];
2
3 publicclassContact {
5 privateString firstName;
6 privateString lastName;
8 publicContact() {
}
9
10
publicContact(String firstName, String lastName){
11
12 [Link] = firstName;
13 [Link] = lastName;
}
14
15
publicString getFirstName() {
16
returnfirstName;
17
}
18
19
publicvoidsetFirstName(String firstName) {
20
[Link] = firstName;
21 }
22
23 publicString getLastName() {
24 returnlastName;
25 }
26
publicvoidsetLastName(String lastName) {
27
[Link] = lastName;
28
}
29
30
publicinthashCode() {
31
[Link]() + [Link]();
32
}
33
34
public boolean equals(Object object) {
35 dacă (obiectul este o instanț ă de Contact){
38 [Link]([Link]()));
}
39
returnfalse;
40
}
41
42
publicString toString(){
43
[Prenume =
44
}
45 }
46
47
48
9.8) [Link]
Această clasă de serviciu simplă oferă funcționalități pentru crearea, ștergerea și listarea Contactului
informații. Toate componentele Controlerului folosesc această clasă pentru a-și atinge respectiv.
funcționalități.
[Link]
[Link];
1
2
import [Link].*;
3
4
publicclassContactService {
5
6
privatestaticMap contacte = newHashMap();
7
8
publicContactService() {
9 }
10
[Link](newInteger([Link]()), contact);
12
returnează contactul;
13
}
14
15
publicstaticContact creaContact(String prenume, String numeDeFamilie){
16
returncreateContact(newContact(firstName, lastName));
17
}
18
19 publicstaticbooleandeleteContact(String firstName){
21 în timp ce([Link]()){
30
31 publicstaticList listContacts(){
32 returntoList(contacts);
33 }
34
43 }
44 }
45
46
47
48
Următoarea este lista pentru Controlerul CreateContact. Rețineți că, dat fiind informațiile despre model pentru
crearea unui contact (pentru care Clientul furnizează parametrii prenume și nume de familie) este
Clasa Contact, apelul a fost efectuat în Constructor pentru a seta setCommandClass() prin trecerea clasei
numele claseiContact.
[Link]
1 [Link]. contacte;
3 [Link];
5 publicclassCreateContactController extinsSimpleFormController{
6
7 publicCreateContactController() {
8 setCommandClass([Link]);
}
9
10
publicvoiddoSubmitAction(Object command){
11
Contact contact = (Contact)comandă;
12
[Link]ț iContact(contact);
13
}
14
}
15
[Link]
1 [Link];
3 [Link].*;
4 [Link];
5 import [Link];
6 [Link];
7
publicclassDeleteContactController extendsAbstractCommandController{
8
9
10 publicDeleteContactController(){
11 setCommandClass([Link]);
}
12
13
publicModelAndView handle(HttpServletRequest request,
14
HttpServletResponse răspuns, Obiect comanda, BindException erori)
15
throwsException {
16
17
Contact contact = (Contact)command;
18
[Link]([Link]());
19 returnareNouModelȘ iVedere("ContactSters");
20
21 }
22 }
23
[Link]
[Link];
1
2
importaț i [Link];
3
import [Link].*;
4 [Link];
5 [Link];
6
publicclassListContactsController se extinde dinAbstractController{
7
8
publicListContactsController() {
9
}
10
11
publicModelAndView handleRequestInternal(HttpServletRequest request,
12
HttpServletResponse răspuns) aruncă Excepț ie{
13
14
Listă allContacts = [Link]();
15 returnează noul model ș i vedere ("ListContacts", "allContacts", allContacts);
16
17 }
18 }
19
20
21