İlkbahar - MVC Çerçevesine Genel Bakış

Spring Web MVC çerçevesi, esnek ve gevşek bağlı web uygulamaları geliştirmek için kullanılabilecek bir model-görünüm-denetleyici mimarisi ve hazır bileşenler sağlar. MVC modeli, uygulamanın farklı yönlerini (giriş mantığı, iş mantığı ve UI mantığı) ayırırken bu öğeler arasında gevşek bir bağlantı sağlar.

  • Model uygulama verilerini içerir ve genel olarak aşağıdakilerden oluşacaktır: POJO.

  • View model verilerinin işlenmesinden sorumludur ve genel olarak, HTML istemcinin tarayıcısının yorumlayabileceği çıktı.

  • Controller işlemden sorumludur User Requests ve Building Appropriate Model ve bunu oluşturma için görünüme aktarır.

DispatcherServlet

Spring Web model-view-controller (MVC) çerçevesi, tüm HTTP isteklerini ve yanıtlarını işleyen bir DispatcherServlet çevresinde tasarlanmıştır. Spring Web MVC DispatcherServlet'in istek işleme iş akışı aşağıdaki şekilde gösterilmektedir.

DispatcherServlet'e gelen bir HTTP isteğine karşılık gelen olaylar dizisi aşağıdadır -

  • Bir HTTP isteği aldıktan sonra DispatcherServlet, HandlerMapping uygun Denetleyiciyi aramak için.

  • Kontrolör talebi alır ve kullanılan duruma göre uygun hizmet yöntemlerini çağırır. GET veya POST method. Hizmet yöntemi, model verilerini tanımlanan iş mantığına göre ayarlar ve görünüm adını DispatcherServlet'e döndürür.

  • DispatcherServlet, ViewResolver istek için tanımlanmış görünümü almak için.

  • Görünüm sonlandırıldığında, DispatcherServlet, model verilerini tarayıcılarda nihayet işlenen görünüme aktarır.

Yukarıda belirtilen tüm bileşenler, yani HandlerMapping, Controller ve ViewResolver, WebApplicationContextovanın bir uzantısı olan ApplicationContext Web uygulamaları için gerekli bazı ekstra özelliklerle.

Gerekli Yapılandırma

DispatcherServlet'in işlemesini istediğiniz istekleri, içinde bir URL eşlemesi kullanarak eşlememiz gerekir. web.xmldosya. Aşağıdaki, bildirim ve eşlemeyi göstermek için bir örnektir.HelloWeb DispatcherServlet -

<web-app id = "WebApp_ID" version = "2.4"
   xmlns = "http://java.sun.com/xml/ns/j2ee" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee 
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
   <display-name>Spring MVC Application</display-name>

   <servlet>
      <servlet-name>HelloWeb</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
      <servlet-name>HelloWeb</servlet-name>
      <url-pattern>*.jsp</url-pattern>
   </servlet-mapping>
</web-app>

web.xml dosya içinde tutulacak WebContent/WEB-INFweb uygulamanızın dizini. Başladıktan sonraHelloWeb DispatcherServlet, çerçeve uygulama bağlamını adlı bir dosyadan yüklemeye çalışacaktır. [servlet-name]-servlet.xmluygulamanın WebContent / WEB-INF dizininde bulunur. Bu durumda dosyamızHelloWeb-servlet.xml.

Sonra, <servlet-mapping>etiketi, hangi URL'lerin hangi DispatcherServlet tarafından işleneceğini belirtir. Burada, .jsp ile biten tüm HTTP istekleri,HelloWeb DispatcherServlet.

Varsayılan dosya adı ile gitmek istemiyorsanız [servlet-name]-servlet.xml ve varsayılan konumu WebContent / WEB-INF olarak seçerseniz, bu dosya adını ve konumunu sunucu uygulaması dinleyicisini ekleyerek özelleştirebilirsiniz. ContextLoaderListener web.xml dosyanızda aşağıdaki gibi -

<web-app...>

   <!-------- DispatcherServlet definition goes here----->
   ....
   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/HelloWeb-servlet.xml</param-value>
   </context-param>

   <listener>
      <listener-class>
         org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>
</web-app>

Şimdi, gerekli yapılandırmayı kontrol edelim HelloWeb-servlet.xml dosyası, web uygulamanızın WebContent / WEB-INF dizinine yerleştirilir.

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:context = "http://www.springframework.org/schema/context"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "
   http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:component-scan base-package = "com.tutorialspoint" />

   <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name = "prefix" value = "/WEB-INF/jsp/" />
      <property name = "suffix" value = ".jsp" />
   </bean>

</beans>

Aşağıdakiler hakkında bazı önemli noktalar HelloWeb-servlet.xml dosya -

  • [servlet-name]-servlet.xml dosyası, genel kapsamda aynı adla tanımlanan herhangi bir fasulyenin tanımlarını geçersiz kılarak, tanımlanan fasulyeleri oluşturmak için kullanılacaktır.

  • <context:component-scan...> etiketi, Spring MVC açıklama tarama özelliğini etkinleştirmek için kullanılacaktır, bu da aşağıdaki gibi ek açıklamalardan yararlanmaya olanak tanır @Controller ve @RequestMapping, vb.

  • InternalResourceViewResolvergörünüm adlarını çözmek için tanımlanmış kurallara sahip olacak. Yukarıda tanımlanan kurala göre, adında bir mantıksal görünümhello adresinde bulunan bir görünüm uygulamasına atandı /WEB-INF/jsp/hello.jsp.

Şimdi gerçek bileşenlerin, yani Denetleyici, Model ve Görünümün nasıl oluşturulacağını anlayalım.

Bir Denetleyicinin Tanımlanması

DispatcherServlet, denetleyicilere kendisine özgü işlevselliği yürütme isteğini yetkilendirir. @Controllerek açıklama, belirli bir sınıfın bir denetleyici rolüne hizmet ettiğini gösterir. @RequestMapping ek açıklama, bir URL'yi tüm bir sınıfa veya belirli bir işleyici yöntemine eşlemek için kullanılır.

@Controller
@RequestMapping("/hello")
public class HelloController{
 
   @RequestMapping(method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }

}

@Controllerek açıklama, sınıfı bir Spring MVC denetleyicisi olarak tanımlar. Burada ilk kullanım@RequestMapping bu denetleyicideki tüm işleme yöntemlerinin, /hello yol.

Bir sonraki açıklama @RequestMapping (method = RequestMethod.GET) beyan etmek için kullanılır printHello()HTTP GET isteğini işlemek için denetleyicinin varsayılan hizmet yöntemi olarak yöntem. Herhangi bir POST talebini aynı URL'de ele almak için başka bir yöntem tanımlayabiliriz.

Yukarıdaki denetleyiciyi, @RequestMapping'e aşağıdaki gibi ek öznitelikler ekleyebileceğimiz başka bir biçimde de yazabiliriz -

@Controller
public class HelloController{
 
   @RequestMapping(value = "/hello", method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }

}

value öznitelik, işleyici yönteminin eşlendiği URL'yi ve method öznitelik, HTTP GET isteğini işlemek için hizmet yöntemini tanımlar.

Aşağıda, yukarıda tanımlanan denetleyici ile ilgili dikkat edilmesi gereken bazı önemli noktalar verilmiştir:

  • Bir hizmet yöntemi içinde gerekli iş mantığını tanımlayacaksınız. Gereksinime göre bu yöntemin içinde başka bir yöntem çağırabilirsiniz.

  • Tanımlanan iş mantığına göre bu yöntem dahilinde bir model oluşturacaksınız. Farklı model özniteliklerini ayarlayabilirsiniz ve bu özniteliklere, sonucu sunmak için görünüm tarafından erişilebilir. Bu örnek, "mesaj" niteliğine sahip bir model oluşturur.

  • Tanımlanmış bir hizmet yöntemi, viewmodeli oluşturmak için kullanılacak. Bu örnek, mantıksal görünüm adı olarak "merhaba" döndürür.

JSP Görünümleri Oluşturma

Spring MVC, farklı sunum teknolojileri için birçok görünüm türünü destekler. Bunlar arasında -JSPs, HTML, PDF, Excel Worksheets, XML, Velocity Templates, XSLT, JSON, Atom ve RSS beslemeleri, JasperReports, vb. Ancak, en yaygın olanları JSTL ile yazılan JSP şablonlarıdır. Öyleyse, /WEB-INF/hello/hello.jsp içinde basit bir merhaba görünümü yazalım -

<html>
   <head>
      <title>Hello Spring MVC</title>
   </head>
   <body>
      <h2>${message}</h2>
   </body>
</html>

Buraya ${message}Kontrolör içinde kurduğumuz nitelik burada. Görünümünüzün içinde görüntülenecek birden çok özelliğe sahip olabilirsiniz.