【Spring】—Spring MVCのアノテーション

Spring MVC のアノテーション

1.Dispatcherサーブレット

DispatcherServlet の完全名:

org.Springframework.web.servlet.DispatcherServlet

プログラムのフロント コントローラーとして機能します。

【例】 DispatcherServlet を使用する場合、プロジェクトの web.xml ファイルに設定するだけでよく、その設定コードは以下のとおりです。

	<servlet>
        <!--配置前端过滤器-->
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--初始化时加载配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-config.xml</param-value>
        </init-param>
        <!--表示容器在启动时立即加载Servlet -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

上記のコードでは、<load-on-startup>要素と<init-param>要素は両方ともオプションです。要素の値が 1 の場合<load-on-startup>、サーブレットはアプリケーションの起動時にすぐにロードされます。<load-on-startup>要素が存在しない場合、アプリケーションは最初のサーブレットが要求されたときにサーブレットをロードします。要素が存在し、Spring MVC 構成ファイルのパスがそのサブ要素を通じて構成されている場合<init-param>、アプリケーションは起動時に構成パスの下に構成ファイルをロードします。要素を通じて構成されていない場合、アプリケーションはデフォルト<init-param>でWEB-INF ディレクトリに移動して、次のような名前の構成ファイルを見つけます。

servletName-servlet.xml

servletName は、web.xml にデプロイされた DispatcherServlet の名前を指します。これは、上記の web.xml の構成コードでは springmvc であり、-servlet.xml は構成ファイルの名前を記述する固定の方法であるため、アプリケーションは次のようになります。 WEB-INF で springmvc-servlet.xml を見つけます。

2. コントローラーのアノテーションの種類

org.springframework.stereotype.Controller アノテーション タイプは、Spring クラスのインスタンスがコントローラーであり、そのアノテーション形式が であることを示すために使用されます@Controllerこのアノテーションを使用する場合、Controller インターフェースを実装する必要はありません。 @Controller アノテーションをコントローラー クラスに追加し、Spring のスキャン メカニズムを通じてアノテーションがマークされたコントローラーを検索するだけです。

【使用例】 コントローラクラスで @Controller アノテーションを使用する例は以下のとおりです。

package com.ssm.controller;
import org.springframework.stereotype.Controller;
......
//Controller注解
@Controller
public class ControllerTest{
    
    
......
}

Spring がコントローラー クラスを確実に見つけられるようにするには、次のように、対応するスキャン構成情報を Spring MVC 構成ファイルに追加する必要もあります。

(1) 設定ファイルの宣言に導入されますspring-context

(2)<context: component-scan>要素を使用して、スキャンする必要があるクラス パッケージを指定します。

完全な構成ファイルは次のとおりです。

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <!--  指定需要扫描的包  -->
    <context:component-scan base-package="com.ssm.controller"/>
</beans>

<context: component-scan>要素の属性base-packageは、スキャン対象のクラスパッケージがcom.ssm.controllerであることを指定します。実行時には、このパッケージとそのサブパッケージの下にあるすべてのアノテーション付きクラスが Spring によって処理されます。Controller インターフェースの実装方法と比較すると、アノテーションを使用する方法は明らかに簡単です。同時に、コントローラー インターフェイスの実装クラスは 1 つのリクエスト アクションのみを処理できますが、アノテーション ベースのコントローラーは複数のリクエスト アクションを同時に処理できるため、使用がより柔軟になります。したがって、実際の開発ではアノテーションベースの形式が一般的に使用されます。

知らせ

アノテーション方式を使用する場合、プログラムの動作は Spring の AOP パッケージに依存する必要があるため、spring.aop-4.3.6 RELEASE.jar を lib ディレクトリに追加する必要があります。そうしないと、プログラムの実行時にエラーが報告されます。 。

3. RequestMapping アノテーションの種類

(1) @RequestMappingアノテーションの利用

org.springframework.web.bind.annotation.RequestMappingSpring は @Controller アノテーションを通じて対応するコントローラー クラスを見つけた後、各リクエストがコントローラー内でどのように処理されるかを知る必要もあります。これにはアノテーション タイプの使用が必要です。RequestMapping はリクエストまたはメソッドをマップするために使用され、その注釈形式は @RequestMapping であり、メソッドまたはクラスに注釈を付けることができます。

(1) メソッドにマークが付いている

メソッドにマークを付けると、そのメソッドはリクエスト処理メソッドになり、プログラムが対応する URL リクエストを受信したときに呼び出されます。

[例] @RequestMapping アノテーションを使用してメソッドをマークする例は以下のとおりです。

package com.ssm.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

......
//Controller注解
@org.springframework.stereotype.Controller
public class AnnotationControllerTest {
    
    
    //@RequestMapping注解标注再方法上
    @RequestMapping(value="/annotationController")
    public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1)throws Exception{
    
    
        ......
        return m;
    }

}

http://localhost:8080/chapter11/annotationController@RequestMapping アノテーションを使用すると、アドレスを介して上記のコードの handleRequest() メソッドにアクセスできるようになります。

(2) クラスにマークを付ける

クラスにマークを付けると、クラス内のすべてのメソッドがクラスレベルのリクエストにマップされます。これは、コントローラーによって処理されるすべてのリクエストが、value 属性値で指定されたパスにマップされることを意味します。

//Controller注解
@Controller

//@RequestMapping注解标注再方法上
@RequestMapping(value = "/controll")
public class AnnotationControllerTest {
    
    
    @RequestMapping(value="/annotationController")
    public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1)throws Exception{
    
    
        ......
        return m;
    }

}

クラスに @RequestMapping アノテーションが追加されており、その value 属性値が「/control」であるため、上記コードのメソッドのリクエストパスは http://localhost:8080/chapter11/control/annotationController となります。クラスに他のメソッドが含まれている場合は、他のメソッドのリクエスト パスに「/control」も追加する必要があります。

(2) @RequestMapping アノテーションの属性

@RequestMapping アノテーションでは、value 属性の指定に加えて、表に示すように他の属性も指定できます。

ここに画像の説明を挿入
すべての属性はオプションですが、デフォルトの属性は value です。value が唯一の属性の場合、属性名は省略できます。たとえば、次の 2 つのアノテーションは同じ意味を持ちます。

@RequestMapping(value="/annotationController")
@RequestMapping("/annotationController")

(3) 結合アノテーション

@RequestMapping アノテーションとその属性については上で詳しく説明しました。結合されたアノテーションは、一般的に使用される HTTP メソッドのマッピングを簡素化し、アノテーション付きメソッドのセマンティクスをより適切に表現するために Spring 4.3 で導入されました。結合されたアノテーションは次のとおりです。

  • @GetMapping: GET モードのリクエストと一致します。
  • @PostMapping: POST モードでリクエストを照合します。
  • @PutMapping: PUT リクエストに一致します。
  • @DeleteMapping: DELETE リクエストに一致します。
  • @PatchMapping: PATCH モードでリクエストを照合します。

@GetMapping を例にとると、複合アノテーションは@RequestMapping(method=RequestMethod.GET)Http Get の略語であり、Http Get を特定の処理メソッドにマッピングします。実際の開発では従来の @RequestMapping アノテーションを次のように使用します。

@RequestMapping(value="/user/{id}",method = RequestMethod.GET)
    public String selectUserById(string id){
    
    
        ......
    }

新しいアノテーション @GetMapping を使用した後は、コードを簡素化するためにメソッド属性を省略できます。

  @GetMapping(value="/user/{fid}")
    public String selectUserById(string id){
    
    
        ......
    }

(4) リクエスト処理メソッドのパラメータの型と戻り値の型

コントローラー クラスでは、各リクエスト処理メソッドは、異なる型の複数のパラメーターと、複数の型の戻り結果を持つことができます。先ほどの handleRequest() メソッドのパラメータは、リクエストに対応する HttpServletRequest と HttpServletResponse の 2 種類のパラメータです。さらに、他のパラメータの種類も使用できます。たとえば、リクエスト処理メソッドで HttpSession オブジェクトにアクセスする必要がある場合、HttpSession をパラメータとして追加すると、Spring はそのオブジェクトをメソッドに正しく渡します。以下のとおりであります。

 @RequestMapping(value="/annotationController")
    public ModelAndView (httpSession session)
    {
    
    
        ......
        return m;
    }

リクエスト処理メソッドにおいて、出現可能なパラメータの種類は以下のとおりです。

javax.servlet.ServletRequest/javax.servlet.http.HttpServletRequest
javax.servlet.ServletResponse/javax.servlet.http.HttpServletResponse 
javax.servlet.http.HttpSession 
org.springframework.web.context.request.WebRequest或 
org.springframework.web.context.request.NativeWebRequest 
java.util.Locale
java.util.TimeZone (Java 6+)/java.time.Zoneld(on Java 8) 
java.io.InputStream/java.io.Reader 
Java.io.OutputStream/java.io.Writer 
org.springframework.http.HttpMethod 
java.security.Principal
@PathVariable@MatrixVariable@RequestParam@RequestHeader@RequestBody、 
@RequestPart@SessionAttribute@RequestAttribute注解 
HttpEntity<?> 
java.util.Map/org.springframework.ui.Model/lorg.springframework.ui.ModelMap 
org.springframework.web.servlet.mvc.support.RedirectAttributes 
org.springframework.validation.Errors/org.springframework.validation.BindingResult 
org.springframework.web.bind.support.SessionStatus 
org.springframework.web.util.UriComponentsBuilder

知らせ

org.springframework.ui.Model 型はサーブレット API 型ではなく、Map オブジェクトを含む Spring MVC 型です。Model パラメータがメソッドに追加されている場合、Spring MVC はリクエスト処理メソッドが呼び出されるたびに Model オブジェクトを作成し、それをパラメータとしてメソッドに渡します。

エントリの場合、リクエスト処理メソッドは ModelAndView タイプのデータを返します。このタイプに加えて、リクエスト ハンドラー メソッドは他のタイプのデータを返すことができます。Spring MVC でサポートされる一般的なメソッドの戻り値の型は次のとおりです。

 ModelAndView 
 Model 
 Map 
 View 
 String 
 void 
 HttpEntity<?>ResponseEntity<?> 
 Callable<?> 
  DeferredResult<?>

上記の戻り値の型のうち、一般的な戻り値の型は ModelAndView、String、および void です。このうち、ModelAndView型はModelデータを追加できビューを指定できること、String型の戻り値はビューにジャンプできるがデータを運ぶことはできないこと、void型は主に非同期リクエストで使用されることなど、データを返すだけで、ビューにはジャンプしません。

ModelAndView 型はデータとビューの間の分離を実現できないため、開発中は通常、メソッドの戻り値の型には String が使用されます。String 型の戻り値ではデータを運ぶことができないため、メソッド内のビュー ページにデータを取り込むにはどうすればよいでしょうか? これは、上で説明した Model パラメータ タイプを使用し、これを通じてビューに表示する必要がある属性を追加できます。

String型を返すメソッドのサンプルコードは以下のとおりです。

 @RequestMapping(value="/annotationController")
    public String handleRequest(HttpServletRequest arg0, HttpServletResponse arg1,
                                Model model)throws Exception{
    
    
        model.addAttribute("msg","第一个Spring MVC程序");
        return "/WEB-INF/jsp/welcome.jsp";
   }

上記のメソッド コードでは、Model 型のパラメーターが追加され、パラメーター インスタンスの addAttribute() メソッドを通じて必要なデータを追加できます。String型では上記コードでビューページを返す以外に、リセットリダイレクトやリクエスト転送も行うことができ、具体的なメソッドは以下の通りです。

(1) リダイレクトリセット

たとえば、ユーザー情報を変更した後、リクエストをユーザークエリメソッドにリダイレクトする実装コードは次のとおりです。

@RequestMapping(value="/update")
    public String update(HttpServletRequest request, HttpServletResponse response,
                                Model model){
    
    
        //复位向请求路径
        return "redirect: queryUser";
   }

(2) 転送リクエスト転送

たとえば、ユーザーが変更操作を実行すると、ユーザー変更ページに転送される実装コードは次のとおりです。

    @RequestMapping(value="/toEdit")
    public String toEdit(HttpServletRequest request, HttpServletResponse response,
                         Model model){
    
    
        //复位向请求路径
        return "forward: editUser";
    }

4. ViewResolver(ビューリゾルバー)

Spring MVC のビュー リゾルバーはビューの解析を担当します。設定ファイルに ViewResolver を定義してビュー リゾルバーを設定できます。設定例は次のとおりです。

    <!--定义视图解析器-->
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--设置前缀-->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!--设置后缀-->
        <property name="suffix" value=".isp" />
    
    </bean>

上記のコードでは、ID が viewResolver であるビュー リゾルバーが定義され、ビューのプレフィックス プロパティとサフィックス プロパティが設定されます。この設定を行うと、メソッド内で定義されたビューパスが簡略化されます。たとえば、エントリケースの論理ビュー名を「/WEB-INF/jsp/welcome.jsp」ではなく「welcome」に設定するだけで、アクセス時にビューリゾルバーが自動的にプレフィックスとサフィックスを追加します。

おすすめ

転載: blog.csdn.net/weixin_45627039/article/details/131258309