Springmvc-overview

提供:Dev Guides
移動先:案内検索

Spring-MVCフレームワークの概要

Spring Web MVCフレームワークは、モデルビューコントローラーアーキテクチャと、柔軟で疎結合のWebアプリケーションを開発するために使用できる既製のコンポーネントを提供します。 MVCパターンにより、アプリケーションのさまざまな側面(入力ロジック、ビジネスロジック、およびUIロジック)が分離され、これらの要素間の疎結合が提供されます。

  • Model はアプリケーションデータをカプセル化し、一般に POJO で構成されます。
  • View はモデルデータのレンダリングを担当し、一般に、クライアントのブラウザーが解釈できる HTML 出力を生成します。
  • Controller は、 User Requests および Building Appropriate Model を処理し、レンダリングのためにビューに渡します。

DispatcherServlet

Spring Webモデルビューコントローラー(MVC)フレームワークは、すべてのHTTP要求と応答を処理するDispatcherServletを中心に設計されています。 次の図に、Spring Web MVC DispatcherServletのリクエスト処理ワークフローを示します。

Spring DispatcherServlet

以下は、DispatcherServletへの着信HTTP要求に対応する一連のイベントです-

  • HTTPリクエストを受信した後、DispatcherServletは HandlerMapping を参照して適切なコントローラーを呼び出します。
  • コントローラーは要求を受け取り、使用されている GET または* POSTメソッド*に基づいて適切なサービスメソッドを呼び出します。 サービスメソッドは、定義されたビジネスロジックに基づいてモデルデータを設定し、ビュー名をDispatcherServletに返します。
  • DispatcherServletは、 ViewResolver のヘルプを利用して、リクエストに対して定義されたビューを取得します。
  • ビューが完成すると、DispatcherServletはモデルデータをブラウザに渡し、最終的にレンダリングされます。

上記のすべてのコンポーネント、つまり HandlerMapping、Controller、およびViewResolverは WebApplicationContext の一部です。これは、Webアプリケーションに必要な追加機能を備えたプレーンな ApplicationContext の拡張です。

必要な構成

*web.xml* ファイルでURLマッピングを使用して、DispatcherServletで処理するリクエストをマッピングする必要があります。 以下は、 *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* ファイルは、Webアプリケーションの *WebContent/WEB-INF* ディレクトリに保存されます。 *HelloWeb* DispatcherServletの初期化時に、フレームワークは、アプリケーションのWebContent/WEB-INFディレクトリにある *[servlet-name] -servlet.xml* という名前のファイルからアプリケーションコンテキストをロードしようとします。 この場合、ファイルは *HelloWeb-servlet.xml* になります。

次に、 <servlet-mapping> タグは、どのDispatcherServletによってどのURLが処理されるかを示します。 ここでは、.jspで終わるすべてのHTTP要求が HelloWeb DispatcherServletによって処理されます。

デフォルトのファイル名を [servlet-name] -servlet.xml に、デフォルトの場所をWebContent/WEB-INFにしたくない場合は、サーブレットリスナー ContextLoaderListener を追加して、このファイル名と場所をカスタマイズできます。次のようにweb.xmlファイル-

<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>

次に、WebアプリケーションのWebContent/WEB-INFディレクトリに配置されている HelloWeb-servlet.xml ファイルに必要な構成を確認します。

<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.finddevguides"/>

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

</beans>

以下は HelloWeb-servlet.xml ファイルに関するいくつかの重要なポイントです-

  • [servlet-name] -servlet.xml ファイルは、定義されたBeanを作成するために使用され、グローバルスコープで同じ名前で定義されたBeanの定義をオーバーライドします。
  • <context:component-scan …​> タグは、Spring MVCアノテーションスキャン機能を有効にするために使用されます。これにより、 @ Controller@ RequestMapping などのアノテーションを使用できます。
  • InternalResourceViewResolver には、ビュー名を解決するために定義されたルールがあります。 上記のルールに従って、 hello という名前の論理ビューは、 /WEB-INF/jsp/hello.jsp にあるビュー実装に委任されます。

ここで、実際のコンポーネント(コントローラー、モデル、ビュー)の作成方法を理解しましょう。

コントローラーの定義

DispatcherServletは、要求をコントローラーに委任して、固有の機能を実行します。 @ Controller 注釈は、特定のクラスがコントローラーの役割を果たしていることを示します。 @ RequestMapping 注釈は、URLをクラス全体または特定のハンドラーメソッドにマップするために使用されます。

@Controller
@RequestMapping("/hello")
public class HelloController{

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

}
*@ Controller* アノテーションは、クラスをSpring MVCコントローラーとして定義します。 ここで、 *@ RequestMapping* の最初の使用法は、このコントローラーのすべての処理メソッドが */hello* パスに関連していることを示しています。

次の注釈* @ RequestMapping(method = RequestMethod.GET)は、 printHello()*メソッドを、HTTP GET要求を処理するコントローラーのデフォルトのサービスメソッドとして宣言するために使用されます。 同じURLでPOST要求を処理する別のメソッドを定義できます。

上記のコントローラーを別の形式で記述することもできます。この場合、次のように@RequestMappingに追加の属性を追加できます-

@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* 属性は、ハンドラーメソッドがマップされるURLを示し、 *method* 属性は、HTTP GET要求を処理するサービスメソッドを定義します。

以下は、上記で定義したコントローラーに関して注意すべき重要な点です-

  • サービスメソッド内で必要なビジネスロジックを定義します。 要件に従って、このメソッド内で別のメソッドを呼び出すことができます。
  • 定義されたビジネスロジックに基づいて、このメソッド内でモデルを作成します。 さまざまなモデル属性を設定できます。これらの属性は、結果を表示するためにビューからアクセスされます。 この例では、属性「message」でモデルを作成します。
  • 定義されたサービスメソッドは、モデルのレンダリングに使用される view の名前を含む文字列を返すことができます。 この例では、論理ビュー名として「hello」を返します。

JSPビューの作成

Spring MVCは、さまざまなプレゼンテーションテクノロジーの多くのタイプのビューをサポートしています。 これらには、 JSP、HTML、PDF、Excelワークシート、XML、Velocityテンプレート、XSLT、JSON、Atom および RSS フィード、 JasperReports などが含まれます。 ただし、最も一般的なものは、JSTLで記述されたJSPテンプレートです。 そこで、/WEB-INF/hello/hello.jspに簡単なhelloビューを記述しましょう-

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

ここ $ \ {message} ここに属性があり、Controller内で設定します。 ビュー内に表示される複数の属性を持つことができます。