2011-09-26 23 views
14

Come parte dell'esplorazione/apprendimento di Struts2, JSP e Servlet, vedo da here e there che servlet e mapping delle servlet possono essere utilizzati in web.xml. Tuttavia, Struts2 menziona anche i filtri e la mappatura dei filtri per web.xml.Differenza tra servlet/mappatura servlet e filtro/mappatura del filtro?

Qual è la differenza tra entrambi? Sono questi si escludono a vicenda? Quando dovrei usare quale e perché? Qualcuno può chiarire i concetti? Grazie.

CHIARIMENTO

ho appena avuto modo di capire che avevo bisogno di capire come Struts2 e Servlet sono legati: http://www.coderanch.com/t/57899/Struts/Difference-between-servlet-struts

+0

hai letto di servlet e filtri di servlet?Qualsiasi risorsa che copra i filtri dovrebbe cancellare le cose per te – Bozho

+0

@Bozho che ho fatto, ma suppongo di aver bisogno di http://www.coderanch.com/t/57899/Struts/Difference-between-servlet-struts per capire cosa non sapevo Non ho capito (...) – JVerstry

risposta

9

I filtri servlet implementano il modello intercepting filter. Mentre servlet è l'obiettivo finale della richiesta web, ogni richiesta passa attraverso una serie di filtri. Ogni filtro può modificare la richiesta prima di passarla ulteriormente o rispondere dopo averla ricevuta dal servlet. Può anche astenersi dal passare la richiesta ulteriormente e gestirla completamente come un servlet (non raro). Ad esempio, il filtro di memorizzazione nella cache può restituire i risultati senza chiamare il servlet effettivo.

6

filtri vengono utilizzati come filtri servlet. Ad esempio, se è necessario eseguire controlli di sicurezza su determinati URL, è possibile aggiungere un filtro per tali pagine. Ad esempio, puoi dire che /secure/pages/*.do deve essere intercettato da securityFilter. Quindi il metodo doFilter() della classe SecurityFilter (una classe che implementa l'interfaccia Filtro) gestirà il controllo di sicurezza prima di inoltrarlo al servlet di richiesta effettivo.

Le servlet sono praticamente le cose standard. Si definisce un servlet e si lascia che il contenitore servlet sappia quale tipo di richieste deve essere mappato su quel servlet.

Non si escludono a vicenda. Entrambi possono essere utilizzati allo stesso tempo. Pensa al filtro come il significato della parola: "filtra" le cose (logging, sicurezza, ecc.) Prima di passare al servlet/azione successivo.

3

Il ciclo di vita della richiesta in base alle specifiche del servlet passa attraverso una catena di filtri prima di essere infine eseguito da un servlet.

Questo è abbastanza intuitivo quando si guarda la firma per il metodo doFilter nel Filter interfaccia

doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 

Cioè, nel filtro si ha accesso alla richiesta e la risposta e la catena. Il contratto prevede che tu, come implementatore, invochi lo chain prima o dopo le operazioni che fai nel filtro, o non lo fai affatto se desideri non continuare l'esecuzione. La chiamata a chain.doFilter(...) causerà il filtro successivo nella catena di filtri con una mappatura corrispondente all'URL richiesto da eseguire. Il membro finale della catena è il servlet il cui mapping corrisponde all'URL richiesto.

Tecnicamente, si può fare tutto in un filtro che si può fare in un servlet. Puoi costruire la tua applicazione per fare tutto il processo e il rendering in un filtro e avere un servlet vuoto che non fa nulla. La differenza principale è che se non c'è un servlet mappato su un determinato URL, il contenitore deve rispondere con un errore 404, quindi deve essere sempre presente un servlet associato a qualsiasi URL che si desidera pubblicare. Puoi anche avere un solo servlet mappato su un URL, ma puoi avere un numero qualsiasi di filtri.

Problemi correlati