İlkbaharda Dispatcher Servlet nedir?


195

Bu görüntüden ( buradan aldım ), HTTP isteği Dispatcher Servlet'e bir şey gönderir .

resim açıklamasını buraya girin

Benim sorum Dispatcher Servlet ne yapıyor ?

Web sayfasından bilgi alıp kontrolöre atmak gibi bir şey mi?

Yanıtlar:


202

DispatcherServlet'in görevi, gelen bir URI'yi almak ve o konumda bulunması gereken sayfayı veya kaynağı oluşturmak için bir araya gelen doğru işleyici (genellikle Denetleyici sınıflarındaki yöntemler ) ve görünümlerin (genellikle JSP'ler) kombinasyonunu bulmaktır .

Sahip olabilirim

  • bir dosya /WEB-INF/jsp/pages/Home.jsp
  • ve sınıfta bir yöntem

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

Dispatcher servlet "bilir" bunu biraz da bir tarayıcı sayfayı istediğinde bu yöntemi çağırmak için ve bir html dokümanı yapmak için eşleme JSP dosyası ile sonuçlarını birleştirmek.

Bunu nasıl başardığı, yapılandırma ve Spring sürümüne göre büyük ölçüde değişir.

Son sonucun web sayfaları olması için bir neden de yok. RMI bitiş noktalarını bulmak , SOAP isteklerini işlemek , bir sunucu uygulamasına gelebilecek her şeyi yapmak da aynı şeyi yapabilir.


4
Büyük riposte, şimdi DispatcherServlet'in sınıf adını ve yöntem adını nasıl tanımladığı sorusu geliyor. Bana iki sınıf ve iki yöntem adı ve nasıl DispatcherServlet doğru isteği yakalar bir yapılandırma örneği gösterebilir.
Kevin

10
Aslında bu ek açıklama için başlangıçta sınıf yolunu tarar ve "/pages/Home.html" dosyasının Class + Yöntemiyle eşlenmesini sağlar. Her ikisinde de "/pages/Home.html" ek açıklamalarında başka kısıtlama bulunmayan iki yönteminiz varsa, bu bir hata olur ve size istisnalar gönderir. Eski okul iseniz XML ile de bağlayabilirsiniz.
Affe

2
Dispatcher ServletEk Açıklama Tabanlı kullanırken xml dosyasına ihtiyacımız var @RestControllermı?
engerek

1
@viper in web.xml Ek açıklama veya xml yapılandırması kullanmanıza rağmen dağıtıcı sunucu uygulamasını yapılandırmamız gerekir
Mahender Reddy Yasa

Başka bir sunucu uygulaması var mı?
Minh Nghĩa

72

Spring MVC'de, gelen tüm istekler tek bir sunucu uygulamasından geçer. Bu sunucu uygulaması - DispatcherServlet- ön denetleyicidir. Ön kontrolör, web uygulamaları geliştirmede tipik bir tasarım modelidir. Bu durumda, tek bir sunucu uygulaması tüm istekleri alır ve bunları uygulamanın diğer tüm bileşenlerine aktarır.

Görevi DispatcherServlet, belirli bir Spring MVC denetleyicisine istek göndermektir.

Genellikle çok sayıda denetleyicimiz vardır ve DispatcherServlethedef denetleyiciyi belirlemek için aşağıdaki haritacılardan birine atıfta bulunur:

Hiçbir yapılandırma gerçekleştirilirse DispatcherServletkullanır BeanNameUrlHandlerMappingve DefaultAnnotationHandlerMappingvarsayılan olarak.

Hedef denetleyici tanımlandığında, DispatcherServletona istek gönderir. Denetleyici isteğe göre bazı işler yapar (veya diğer nesnelere delege eder) ve DispatcherServletModel ve Görünümün adıyla geri döner .

Görünüm adı yalnızca mantıksal bir addır. Bu mantıksal ad daha sonra gerçek Görünümü aramak için kullanılır (denetleyici ve belirli Görünüm ile eşleşmeyi önlemek için). Ardından , Görünüm'ün mantıksal adını DispatcherServletifade eder ViewResolverve Görünüm'ün belirli uygulamasına eşler.

Bazı olası uygulamalar ViewResolverşunlardır:

Ne zaman DispatcherServlet bu yanıt olarak işlenecek sonuçları gösterir görünümünü belirlemektedir.

Son olarak, nesneyi istemciye geri DispatcherServletdöndürür Response.


47

DispatcherServletMVC'nin ön kontrolör modelini uygulamasıdır .

Bahar belgelerindeki açıklamaya buradan bakın .

Esasen, gelen isteği alan bir sunucu uygulamasıdır ve bu isteğin işlenmesini, eşlemesi DispatcherServletyapılandırmada spesifik olan bir dizi işleyiciden birine devreder .


Bu bir MXML diğerine veya sunucuya olayları sevk olsun Flex olayları gibi bir şey mi. Benim appication birden fazla DispatcherServlet olabilir. Her sınıf dosyası ayrı bir DispatcherServlet var mı.
Kevin

Genellikle sadece bir ön denetleyici vardır. Bu, sahip olduğunuz modellerden ve görünümlerden bağımsızdır. Sadece belirli modelleri ve görüşleri bir araya getirir.
BalusC

2
@theband: Mimariniz bu şekilde daha mantıklıysa çoğul olabilirDispatcherServlets , ancak genellikle bunun için bir neden yoktur.
skaffman

47

Bu soru zaten çözüldü olarak işaretli biliyorum ama ben bu modeli ayrıntılı olarak açıklayan yeni bir görüntü eklemek istiyorum (kaynak: eylem 4 bahar):

resim açıklamasını buraya girin

açıklama

İstek tarayıcıdan (1) ayrıldığında , kullanıcının ne istediğiyle ilgili bilgi taşır. En azından istek, istenen URL'yi taşıyacak. Ancak, kullanıcı tarafından bir formda gönderilen bilgiler gibi ek veriler de içerebilir.

İsteğin seyahatlerindeki ilk durak Spring's DispatcherServlet adresindedir. Çoğu Java tabanlı web çerçevesi gibi, Spring MVC istekleri tek bir ön denetleyici sunucu uygulaması aracılığıyla huniler. Ön denetleyici, tek bir sunucu uygulamasının, uygulamanın diğer bileşenlerine gerçek işlem gerçekleştirme talebinin sorumluluğunu devrettiği ortak bir web uygulaması modelidir. Spring MVC durumunda, DispatcherServlet ön denetleyicidir. DispatcherServlet'in görevi, isteği bir Spring MVC denetleyicisine göndermektir. Denetleyici, isteği işleyen bir Spring bileşenidir. Ancak tipik bir uygulamanın birkaç denetleyicisi olabilir ve DispatcherServlet, hangi denetleyicinin isteği göndereceğine karar vermek için yardıma ihtiyaç duyar. Böylece DispatcherServlet bir veya daha fazla işleyici eşlemesine başvurur (2)isteğin bir sonraki durağının nerede olacağını bulmak için. İşleyici eşlemesi, karar verirken istek tarafından taşınan URL'ye özellikle dikkat eder. Uygun bir denetleyici seçildikten sonra, DispatcherServlet isteği neşeli yoluna seçilen denetleyiciye gönderir (3). Denetleyicide, istek yükünü (kullanıcı tarafından gönderilen bilgiler) bırakır ve denetleyici bu bilgileri işlerken sabırla bekler. (Aslında, iyi tasarlanmış bir denetleyici işlemenin kendisini çok az veya hiç gerçekleştirmez ve bunun yerine iş mantığının sorumluluğunu bir veya daha fazla hizmet nesnesine devreder.) Bir denetleyici tarafından gerçekleştirilen mantık genellikle geri taşınması gereken bazı bilgilerle sonuçlanır. kullanıcı ve tarayıcıda görüntülenir. Bu bilgilere model adı verilir. Ancak kullanıcıya ham bilgi göndermek yeterli değildir; kullanıcı dostu bir biçimde, genellikle HTML olarak biçimlendirilmesi gerekir. Bunun için bilgilerin bir görünüme verilmesi gerekir, genellikle bir JavaServer Sayfası (JSP). Bir denetleyicinin yaptığı son şeylerden biri, model verilerini paketlemek ve çıktıyı oluşturması gereken bir görünümün adını belirlemektir. Daha sonra isteği model ve görünüm adıyla birlikte DispatcherServlet'e geri gönderir(4) . Denetleyicinin belirli bir görünüme bağlanmaması için, DispatcherServlet'e iletilen görünüm adı doğrudan belirli bir JSP'yi tanımlamaz. Görünümün bir JSP olduğu anlamına gelmez. Bunun yerine, yalnızca sonucu üretecek gerçek görünümü aramak için kullanılacak mantıksal bir ad taşır. DispatcherServlet , mantıksal görünüm adını JSP olabilecek veya olmayabilecek belirli bir görünüm uygulamasına eşlemek için bir görünüm çözümleyiciye (5) başvurur . DispatcherServlet, sonucu hangi görünümün oluşturacağını bildiğine göre, isteğin işi neredeyse bitti. Son durağı görüş uygulamasıdır (6), genellikle model verilerini sağladığı bir JSP'dir. İsteğin işi sonunda tamamlandı. Görünüm, (çok çalışkan olmayan) yanıt nesnesi (7) tarafından istemciye geri taşınacak çıktıyı oluşturmak için model verilerini kullanır .


Bir sorum var, tarayıcıda gördüğümüz JSON nesnesinin geri dönmesi durumunda görünümü nasıl seçerim, seçilen mantıksal görünüm yoksa aynı URI'ye dönüyor mu?
Nesrin

1
@Nesrin sorduğunuzdan beri yıllar geçti, ancak bir cevap var: Döndürülen yanıtın bir modele yerleştirilmemesi veya görünüm olarak çözülmemesi için doğrudan HTTP yanıt gövdesine yazılması gerektiğini belirten @Controlleryöntemin hemen üzerine özel bir ek açıklama koyuyorsunuz. @ResponseBody.
gösterge paneli

6

DispatcherServletSpring MVC'deki her şeye dikkat etmek gibi diyebiliriz .

Web kapsayıcısı başlatıldığında:

  1. DispatcherServletçağrı init()yöntemi ile yüklenecek ve başlatılacaktır
  2. init()arasında DispatcherServletgibi adlandırma ile Bahar Yapılandırma Belgesi tanımlamak için çalışacağız "servlet_name-servlet.xml"sonra tüm fasulye tanımlanabilir.

Misal:

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);
    }
    ...
}

Yani, genellikle DispatcherServletistek URI yakalama ve teslim HandlerMapping. HandlerMappingdenetleyici mantıksal adı (görünüm) döndüren denetleyici yöntemi ile arama eşleme fasulye. Sonra bu mantıksal ad gönderilmektedir DispatcherServlettarafından HandlerMapping. Ardından önek ve sonek ekleyerek tam görünüm konumu vermeyi DispatcherServletsöyleyin ViewResolver, ardındanDispatcherServlet istemciye görünüm verin.


Bu güzel bir açıklama. 2 numaralı noktanız, DispatcherServlet öğesinin, Bahar Yapılandırma Belgesini "servlet_name-servlet.xml" gibi adlandırma kurallarıyla tanımlamaya çalışacağını söylüyor. Ancak, sadece "dağıtıcı" gibi bir isim kullanan projeler gördüm ve iyi çalışıyor. Ben de denedim. Ama neden bilmiyorum?
Subhasish Bhattacharjee

0

Dağıtıcı Denetleyicisi şekilde, gelen tüm istek ön denetleyici olarak çalışan dağıtıcı sunucu uygulaması tarafından kesilir. Dağıtım programı sunucu uygulaması, XML dosyasından işleyici eşlemesine bir giriş alır ve isteği Denetleyiciye gönderir.


-1
<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
    <context:component-scan base-package="com.demo" />
    <context:annotation-config />

    <mvc:annotation-driven />


    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="datasource" />
    </bean> 

          <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
        <property name="url" value="jdbc:mysql://localhost:3306/employee" />
        <property name="username" value="username" />
        <property name="password" value="password" />
    </bean> 

</beans>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.