Springmvc-overview
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のリクエスト処理ワークフローを示します。
以下は、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内で設定します。 ビュー内に表示される複数の属性を持つことができます。