/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Alternativ Model 2 med reflection
Fra : Flare


Dato : 08-04-04 17:36

Hejsa

Jeg har tidligere spurgt til patterns ang. model 2 (MVC pattern) på
controller servletten.

Nu har jeg min baggrund (de sidste par i i hvert fald) i dot.net platformen
hvor jeg ivrigt har brugt reflection. Jeg har lige opdaget at java kan noget
tilsvarende, omend ikke helt så gennemført.

Det har let mig hen på en anden måde at implementerer de forskellgei
funktionalitet som min controllerservlet skal udfører.
Ideen er at lave en klasse svarende til hver operation/action som servletten
skal og kalde klassen for det den skal gøre. Fx. createUser.class

Nu kan jeg i min servlet vha. reflection indlæse denne klasse og kører en
metode execte() (som skal implementeres) på den indlæste klasse. Dette
synes jeg umiddelbart er en ret genial måde at lave controller servletten på
da den blive uhyr "simpel" og udviddelse med eksrta operationer øger ikke på
noget tidspunkt kompleksiteten.

Men det kan være der er noget jeg misser. Fx. en hård straf mht.
performance? Men så på koden nedeunder. Jeg er spændt på hvad i har at sige
til det.

(parameten operation er givet med sin parameter til servleten og bliver
trykke ud. Denne paramter bestemmer hvilken klasse der skal loades ind)
---------------------------------------
<SNIP>
String operation = "com.pdastore.servletActions." +
request.getParameter("operation");
String NextPage = null;

// Indlæs klassen
Class annoclass = Class.forName(operation);

Class[] types = new Class[] { HttpServletRequest.class,
HttpServletResponse.class };
Method method = annoclass.getMethod("perform", types);

// invoke metoden perform() som returnere en
// string med den nye side der skal redelegere til
NextPage = (String)method.invoke(annoclass.newInstance(), new Object[] {
request,response });

// Redirect to the new page determined from the perfrom method
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher(NextPage);
rd.forward(request, response); }

<SNIP>
-------------------------------------



 
 
stig (09-04-2004)
Kommentar
Fra : stig


Dato : 09-04-04 15:46

Halløj igen

Jeg har selv lavet en lille web-app api hvor jeg har en controller der
dirigerer requests og actions bl.a. ved brug af reflection. Det hele
defineres i en xml config fil (formentlig i stil med andre frameworks som
struts ol.)

Det er ikke min oplevelse af man taber noget ved brug af reflection. Nu har
jeg heller ikke lavet nogle specielt seriøse tests... Det hele handler vel
om det miljø det skal køres i, om det er en highend app hvor der er pres på
ressourcerne. For en mindre webapp der kører med rigelige ressourcer er
forskellen mellem brug af reflection, og noget der er hardkodet, meget
lille.

Min 'api' opererer med statiske og dynamiske actions, hvor statiske altid
'invoker' det samme, mens dynamiske tager nogle parametre. F.eks. at åbne en
startside er statisk mens at åbne en specifik nyhed el. er dynamisk. Jeg
bruger velocity til at rendere mine sider/komponenter. Parametrene kommer
aldrig ud til klienten, til gengæld kreeres der en dynamisk/random
actionstring som apien så holder styr på, altså hvilken actionstring der
invoker hvad. F.eks. kan en url se ud som:
/blogger.jsp?action=232782378233
Hvor serveren så ved at denne aktion skal slette et specifikt blogger
element el. Selve actionstringen genereres når min velocity template kalder:
action.toHref() (evt. med et parameter input).

Jeg synes ikke umiddelbart det lyder som en god ide at hægte dine
actions/kommandoer op på et klasse navn. Det vil give et noget 'stift'
system hvor det er svært at ændre noget. Det afhænger selvfølgelig også af
formålet... Hvis det er til en lille app kan det måske godt bruges.

Hvad mener du iøvrigt med
> Jeg har lige opdaget at java kan noget
> tilsvarende, omend ikke helt så gennemført.

Stig

"Flare" <nomail@sorry.dk> wrote in message
news:40757f6d$0$530$edfadb0f@dread14.news.tele.dk...
> Hejsa
>
> Jeg har tidligere spurgt til patterns ang. model 2 (MVC pattern) på
> controller servletten.
>
> Nu har jeg min baggrund (de sidste par i i hvert fald) i dot.net
platformen
> hvor jeg ivrigt har brugt reflection. Jeg har lige opdaget at java kan
noget
> tilsvarende, omend ikke helt så gennemført.
>
> Det har let mig hen på en anden måde at implementerer de forskellgei
> funktionalitet som min controllerservlet skal udfører.
> Ideen er at lave en klasse svarende til hver operation/action som
servletten
> skal og kalde klassen for det den skal gøre. Fx. createUser.class
>
> Nu kan jeg i min servlet vha. reflection indlæse denne klasse og kører en
> metode execte() (som skal implementeres) på den indlæste klasse. Dette
> synes jeg umiddelbart er en ret genial måde at lave controller servletten

> da den blive uhyr "simpel" og udviddelse med eksrta operationer øger ikke

> noget tidspunkt kompleksiteten.
>
> Men det kan være der er noget jeg misser. Fx. en hård straf mht.
> performance? Men så på koden nedeunder. Jeg er spændt på hvad i har at
sige
> til det.
>
> (parameten operation er givet med sin parameter til servleten og bliver
> trykke ud. Denne paramter bestemmer hvilken klasse der skal loades ind)
> ---------------------------------------
> <SNIP>
> String operation = "com.pdastore.servletActions." +
> request.getParameter("operation");
> String NextPage = null;
>
> // Indlæs klassen
> Class annoclass = Class.forName(operation);
>
> Class[] types = new Class[] { HttpServletRequest.class,
> HttpServletResponse.class };
> Method method = annoclass.getMethod("perform", types);
>
> // invoke metoden perform() som returnere en
> // string med den nye side der skal redelegere til
> NextPage = (String)method.invoke(annoclass.newInstance(), new Object[] {
> request,response });
>
> // Redirect to the new page determined from the perfrom method
> ServletContext sc = getServletContext();
> RequestDispatcher rd = sc.getRequestDispatcher(NextPage);
> rd.forward(request, response); }
>
> <SNIP>
> -------------------------------------
>
>



Anders (07-07-2004)
Kommentar
Fra : Anders


Dato : 07-07-04 08:22

Flare wrote:
> Hejsa
>
> Jeg har tidligere spurgt til patterns ang. model 2 (MVC pattern) på
> controller servletten.
>
> Nu har jeg min baggrund (de sidste par i i hvert fald) i dot.net platformen
> hvor jeg ivrigt har brugt reflection. Jeg har lige opdaget at java kan noget
> tilsvarende, omend ikke helt så gennemført.
>
> Det har let mig hen på en anden måde at implementerer de forskellgei
> funktionalitet som min controllerservlet skal udfører.
> Ideen er at lave en klasse svarende til hver operation/action som servletten
> skal og kalde klassen for det den skal gøre. Fx. createUser.class
>
> Nu kan jeg i min servlet vha. reflection indlæse denne klasse og kører en
> metode execte() (som skal implementeres) på den indlæste klasse. Dette
> synes jeg umiddelbart er en ret genial måde at lave controller servletten på
> da den blive uhyr "simpel" og udviddelse med eksrta operationer øger ikke på
> noget tidspunkt kompleksiteten.
>
> Men det kan være der er noget jeg misser. Fx. en hård straf mht.
> performance? Men så på koden nedeunder. Jeg er spændt på hvad i har at sige
> til det.
>
> (parameten operation er givet med sin parameter til servleten og bliver
> trykke ud. Denne paramter bestemmer hvilken klasse der skal loades ind)
> ---------------------------------------
> <SNIP>
> String operation = "com.pdastore.servletActions." +
> request.getParameter("operation");
> String NextPage = null;
>
> // Indlæs klassen
> Class annoclass = Class.forName(operation);
>
> Class[] types = new Class[] { HttpServletRequest.class,
> HttpServletResponse.class };
> Method method = annoclass.getMethod("perform", types);
>
> // invoke metoden perform() som returnere en
> // string med den nye side der skal redelegere til
> NextPage = (String)method.invoke(annoclass.newInstance(), new Object[] {
> request,response });
>
> // Redirect to the new page determined from the perfrom method
> ServletContext sc = getServletContext();
> RequestDispatcher rd = sc.getRequestDispatcher(NextPage);
> rd.forward(request, response); }
>

Har du set på struts ? Det lyder umiddelbart som om du er igang med at
lave det som de har lavet.

http://jakarta.apache.org/struts

MVH

Anders

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste