2010-05-04 11 views
134

In questa immagine (che ho ottenuto da here), HTTP richiesta invia qualcosa a Servlet Dispatcher.Che cos'è il servlet Dispatcher in primavera?

enter image description here

La mia domanda è che cosa fa Dispatcher Servlet fare?

È qualcosa come ottenere le informazioni generate dalla pagina Web e gettarle nel controller?

risposta

148

Il lavoro del DispatcherServlet è quello di prendere un URI in entrata e di trovare la giusta combinazione di gestori (in genere i metodi su controller classi) e vista (in genere JSP) che si combinano per formare pagina o una risorsa che dovrebbe essere trovato in quella posizione.

potrei avere

  • un file /WEB-INF/jsp/pages/Home.jsp
  • e un metodosu una classe

    @RequestMapping(value="/pages/Home.html") 
    private ModelMap buildHome() { 
        return somestuff; 
    } 
    

Il Dispatcher servlet è il bit che "sa" chiamare quel metodo quando un browser richiesto estes la pagina e combinare i risultati con il file JSP corrispondente per creare un documento html.

Il modo in cui esegue questa operazione varia notevolmente con la configurazione e la versione Spring.

Non c'è anche alcun motivo per cui il risultato finale deve essere pagine web. Può fare la stessa cosa per individuare i punti finali RMI, gestire le richieste SOAP SOAP, tutto ciò che può entrare in un servlet.

+2

Grande riposte, ora una domanda: come mai DispatcherServlet identifica anche il nome della classe e il nome del metodo. Puoi mostrarmi un esempio di una configurazione in cui ho due classi e due nomi di metodi e come DispatcherServlet cattura la richiesta giusta. – Kevin

+8

Effettua la scansione del percorso della classe all'avvio per tale annotazione e crea una mappatura di "/pages/Home.html" nel metodo Class +. Se avessi due metodi che hanno entrambi "/pages/Home.html" senza altre restrizioni nelle loro annotazioni, questo sarebbe un errore e genererà eccezioni a te. Puoi anche collegarlo con XML se sei vecchio. – Affe

+0

Abbiamo bisogno di un file xml 'Servlet Dispatcher' quando si utilizza l'annotazione' @ RestController'? – viper

39

DispatcherServlet è l'implementazione di Spring MVC dello front controller pattern.

Vedere la descrizione nella documentazione di primavera here.

In sostanza, è un servlet che accetta la richiesta in arrivo e delega l'elaborazione di tale richiesta a uno dei numerosi gestori, la cui mappatura è specifica nella configurazione DispatcherServlet.

+0

È qualcosa di simile a eventi in Flex, in cui ricevo eventi di spedizione da un MXML all'altro o al server. Posso avere più di DispatcherServlet nella mia appicazione. Ogni file di classe ha un DispatcherServlet separato. – Kevin

+0

Di solito c'è solo un front controller. Questo è indipendentemente dai modelli e dalle visualizzazioni che hai. Porta solo modelli e viste specifici insieme. – BalusC

+2

@theband: è possibile * avere più 'DispatcherServlet', se la propria architettura ha più senso in questo modo, ma di solito non c'è motivo. – skaffman

5

Possiamo dire come DispatcherServlet avendo cura di tutto in Spring MVC.

Al contenitore Web Start up:

  1. DispatcherServlet verrà caricato e inizializzato chiamando init() metodo
  2. init() di DispatcherServlet cercherà di identificare il documento di configurazione primavera con le convenzioni di denominazione come "servlet_name-servlet.xml" poi tutto i fagioli possono essere identificati.

Esempio:

public class DispatcherServlet extends HttpServlet { 

    ApplicationContext ctx = null; 

    public void init(ServletConfig cfg){ 
     // 1. try to get the spring configuration document with default naming conventions 
     String xml = "servlet_name" + "-servlet.xml"; 

     //if it was found then creates the ApplicationContext object 
     ctx = new XmlWebApplicationContext(xml); 
    } 
    ... 
} 

Così, in generale DispatcherServlet richiesta di acquisizione URI e consegnare al HandlerMapping. HandlerMapping Cerca il bean di mappatura con il metodo del controller, dove il controller restituisce il nome logico (vista). Quindi questo nome logico viene inviato a DispatcherServlet per HandlerMapping. Quindi DispatcherServlet indicare a ViewResolver di fornire la posizione completa della vista aggiungendo prefisso e suffisso, quindi DispatcherServlet dare la vista al client.

+0

Questa è una bella spiegazione. Il punto numero 2 afferma che DispatcherServlet proverà a identificare il documento di configurazione Spring con convenzioni di denominazione come "servlet_name-servlet.xml". Tuttavia, ho visto progetti che utilizzavano solo nomi come "dispatcher" e funzionano perfettamente. Anch'io ci ho provato. Ma non so perché? –

27

In Spring MVC tutte le richieste in entrata passano attraverso un singolo servlet. Questo servlet - DispatcherServlet - è il controller anteriore. Il front controller è un tipico modello di progettazione nello sviluppo di applicazioni Web. In questo caso, un singolo servlet riceve tutte le richieste e le trasferisce a tutti gli altri componenti dell'applicazione.

L'attività di DispatcherServlet è di inviare una richiesta al controller MVC Spring specifico.

solito abbiamo un sacco di controllori e DispatcherServlet si riferisce a una delle seguenti mappatori per determinare il controllore di destinazione:

Se non viene eseguita alcuna configurazione, il DispatcherServlet utilizza BeanNameUrlHandlerMapping e DefaultAnnotationHandlerMapping per impostazione predefinita.

Quando viene identificato il controller di destinazione, lo DispatcherServlet invia la richiesta. Il controller esegue alcune operazioni in base alla richiesta (o delegato agli altri oggetti) e torna al numero DispatcherServlet con il modello e il nome della vista.

Il nome della vista è solo un nome logico. Questo nome logico viene quindi utilizzato per cercare la vista effettiva (per evitare l'accoppiamento con il controller e la vista specifica). Quindi DispatcherServlet fa riferimento allo ViewResolver e associa il nome logico della vista all'implementazione specifica della vista.

Alcune possibili implementazioni del ViewResolver sono:

Quando lo DispatcherServlet determina la vista che visualizzerà i risultati, verrà visualizzato come risposta.

Infine, lo DispatcherServlet restituisce l'oggetto Response al client.

12
  • Il DispatcherServlet del framework Spring Web MVC è un'implementazione di FrontController ed è un componente Java Servlet. vale a dire, è un fronte servlet per l'applicazione Web Mvc molla.

  • DispatcherServlet t è le classi di FrontController che riceve tutta la richiesta del client HTTP in arrivo per la appliaction Web mvc di primavera.

  • DispatcherServlet è responsabile dell'inizializzazione primavera web framework MVC per la nostra applicazione, ed è un servlet implementato come un sotto-tipo di HttpServlet proprio come qualsiasi altro Servlet.

  • DispatcherServlet richiesto anche essere configurato nella nostra applicazione web come qualsiasi altro servlet esempio, descrittore di distribuzione dell'applicazione web (web.xml)

Possiamo configurare i parametri di inizializzazione per alterare il comportamento di DispatcherServlet in relazione alla localizzazione dei file di configurazione XML di Spring Beans e all'inizializzazione del contesto dell'applicazione.

  • seguito immagine descrivere tutto ciò che riguarda DispatcherServlet enter image description here
10

So che questa domanda è contrassegnato come risolto già, ma voglio aggiungere un immagine più recente spiegare questo modello in dettaglio (fonte: primavera in azione 4):

enter image description here

Spiegazione

Quando la richiesta lascia il browser (1), contiene informazioni su ciò che l'utente sta chiedendo. Al minimo, la richiesta porterà l'URL richiesto. Ma può anche contenere dati aggiuntivi, come le informazioni inviate in un modulo dall'utente.

La prima sosta nei viaggi della richiesta è a Spring's DispatcherServlet. Come la maggior parte dei framework Web basati su Java, le richieste di canalizzazioni Spring MVC tramite un singolo servlet del front controller. Un front controller è un modello di applicazione Web comune in cui un singolo servlet delega la responsabilità di una richiesta ad altri componenti di un'applicazione per eseguire l'elaborazione effettiva. Nel caso di Spring MVC, DispatcherServlet è il front controller. Il lavoro del DispatcherServlet è di inviare la richiesta a un controller MVC Spring. Un controller è un componente Spring che elabora la richiesta. Ma un'applicazione tipica può avere diversi controller, e DispatcherServlet ha bisogno di aiuto per decidere a quale controller inviare la richiesta. Quindi il DispatcherServlet consulta uno o più mapping del gestore (2) per capire dove sarà la prossima fermata della richiesta. La mappatura del gestore presta particolare attenzione all'URL trasportato dalla richiesta quando prende una decisione. Una volta scelto un controller appropriato, DispatcherServlet invia la richiesta in modo allegro al controller selezionato (3). Al controller, la richiesta interrompe il carico utile (le informazioni inviate dall'utente) e attende pazientemente che il controller elabori tali informazioni. (In realtà, un controller ben progettato esegue l'elaborazione minima o nulla e invece delega la responsabilità della business logic a uno o più oggetti di servizio.) La logica eseguita da un controller spesso genera alcune informazioni che devono essere riportate indietro all'utente e visualizzato nel browser. Questa informazione è indicata come il modello. Ma l'invio di informazioni non elaborate all'utente non è sufficiente, deve essere formattato in un formato user-friendly, tipicamente HTML. Per questo motivo, è necessario fornire le informazioni a una vista, in genere una JavaServer Page (JSP). Una delle ultime cose che un controller fa è impacchettare i dati del modello e identificare il nome di una vista che dovrebbe rendere l'output. Invia quindi la richiesta, insieme al modello e al nome della vista, al DispatcherServlet (4). In modo che il controllore non venga accoppiato a una vista particolare, il nome della vista passato a DispatcherServlet non identifica direttamente un JSP specifico. Non suggerisce necessariamente che la vista sia una JSP. Invece, porta solo un nome logico che verrà utilizzato per cercare la vista effettiva che produrrà il risultato. Il DispatcherServlet consulta un risolutore di viste (5) per mappare il nome della vista logica in un'implementazione specifica della vista, che può essere o non essere una JSP. Ora che DispatcherServlet sa quale vista renderà il risultato, il lavoro della richiesta è quasi finito. La sua fermata finale è all'implementazione della vista (6), in genere un JSP, in cui vengono forniti i dati del modello. Il lavoro della richiesta è finalmente completato.La vista utilizzerà i dati del modello per rendere l'output che verrà riportato al client dall'oggetto di risposta (non particolarmente laborioso) (7).

Problemi correlati