Yanıtlar:
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
/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.
Dispatcher Servlet
Ek Açıklama Tabanlı kullanırken xml dosyasına ihtiyacımız var @RestController
mı?
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 DispatcherServlet
hedef denetleyiciyi belirlemek için aşağıdaki haritacılardan birine atıfta bulunur:
BeanNameUrlHandlerMapping
;ControllerBeanNameHandlerMapping
;ControllerClassNameHandlerMapping
;DefaultAnnotationHandlerMapping
;SimpleUrlHandlerMapping
.Hiçbir yapılandırma gerçekleştirilirse DispatcherServlet
kullanır BeanNameUrlHandlerMapping
ve DefaultAnnotationHandlerMapping
varsayılan olarak.
Hedef denetleyici tanımlandığında, DispatcherServlet
ona istek gönderir. Denetleyici isteğe göre bazı işler yapar (veya diğer nesnelere delege eder) ve DispatcherServlet
Model 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ı DispatcherServlet
ifade eder ViewResolver
ve Görünüm'ün belirli uygulamasına eşler.
Bazı olası uygulamalar ViewResolver
şunlardır:
BeanNameViewResolver
;ContentNegotiatingViewResolver
;FreeMarkerViewResolver
;InternalResourceViewResolver
;JasperReportsViewResolver
;ResourceBundleViewResolver
;TilesViewResolver
;UrlBasedViewResolver
;VelocityLayoutViewResolver
;VelocityViewResolver
;XmlViewResolver
;XsltViewResolver
.Ne zaman DispatcherServlet
bu yanıt olarak işlenecek sonuçları gösterir görünümünü belirlemektedir.
Son olarak, nesneyi istemciye geri DispatcherServlet
döndürür Response
.
DispatcherServlet
MVC'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 DispatcherServlet
yapılandırmada spesifik olan bir dizi işleyiciden birine devreder .
DispatcherServlets
, ancak genellikle bunun için bir neden yoktur.
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):
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 .
@Controller
yöntemin hemen üzerine özel bir ek açıklama koyuyorsunuz. @ResponseBody
.
DispatcherServlet
Spring MVC'deki her şeye dikkat etmek gibi diyebiliriz .
Web kapsayıcısı başlatıldığında:
DispatcherServlet
çağrı init()
yöntemi ile yüklenecek ve başlatılacaktır
init()
arasında DispatcherServlet
gibi 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 DispatcherServlet
istek URI yakalama ve teslim HandlerMapping
. HandlerMapping
denetleyici 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 DispatcherServlet
tarafından HandlerMapping
. Ardından önek ve sonek ekleyerek tam görünüm konumu vermeyi DispatcherServlet
söyleyin ViewResolver
, ardındanDispatcherServlet
istemciye görünüm verin.
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.
<?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>