【SpringMVC入門から実戦までのチュートリアル】第2章 SpringMVC入門

2.SpringMVC の紹介

2.1 SpringMVC プロジェクトの構築

2.1.1 WEB プロジェクトを作成する

2.1.2 Spring の jar パッケージをインポートする

    その中で、spring-webmvc-4.3.18.RELEASE.jar が SpringMVC のコア jar パッケージです。

方法 1: jar パッケージをインポートする

 方法 2: Maven 依存関係の構成

<dependencies>
    <!-- spring核心包-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- springbean包 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- springcontext包 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- spring表达式包 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- springAOP包 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- springAspects包 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- spring对web的支持 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.18.RELEASE</version>
    </dependency>
    <!-- springwebMVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.18.RELEASE</version>
    </dependency>

    <!-- 配置javaweb环境 -->
    <!-- servlet-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <!-- jsp-api -->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- jstl -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

2.1.3 フロントコントローラーの設定

    Spring MVC はサーブレットに基づいており、DispatcherServlet は Spring MVC フレームワーク全体のコアであり、主にリクエストをインターセプトし、処理のために対応するプロセッサにディスパッチします。したがって、Spring MVC を構成するには、最初に DispatcherServlet を定義する必要があります。すべてのサーブレットと同様に、ユーザーは web.xml で構成する必要があります。
    
    Spring MVC が初期化されると、アプリケーションの WEB-INF ディレクトリで構成ファイルが検索されます. 構成ファイルの命名規則は、springmvc-servlet.xml のように "servletName-servlet.xml" です。

    Spring MVC 構成ファイルをアプリケーション ディレクトリの任意の場所に保存することもできますが、サーブレットの init-param 要素を使用して構成ファイルをロードし、contextConfigLocation パラメーターを介して Spring MVC 構成ファイルの場所を指定する必要があります。サンプルコードは以下の通りです。

web.xml でフロント コントローラーを構成します。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- 1、配置前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--
            springmvc的核心配置文件,格式与spring的applicationContext.xml一致
            默认路径:/WEB-INF/[前端控制器Servlet的名称]-servlet.xml
            4、自定义springmvc配置文件的名称和位置:
            通过Servlet的初始化参数,修改springmvc的配置文件的路径和名称
        -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- 3、配置服务器启动时初始化前端控制器-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--
            2、配置进入Spring MVC的请求
            第一种:*.后缀名,表示由DispatcherServlet进行解析以某种扩展名结尾的请求路径。
                    例如:*.do,*.action,*.abc..但是不能配置*.jsp,*.css,*.js等视图类型的后缀或静态资源后缀
                    优点:不会导致静态资源的拦截(静态资源的访问不会进入springmvc的流程),无需单独排除静态资源
                    缺点:不支持RESTful风格的开发
            第二种:/,表示所有的访问服务器的路径都进入Spring MVC的流程中(.jsp文件除外)。
                    优点:支持RESTful风格的开发
                    缺点:当访问静态资源时,因没有相应的处理类,会报出404的错误,需要单独排除静态资源
            注意:/*,此种在Spring MVC中是错误的配置,因为它会拦截所有的静态资源,以及jsp文件。
        -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
</web-app>

構成分析:

    contextConfigLocation: springmvc 構成の読み込み場所を指定します. 指定しない場合、デフォルトの読み込みは /WEB-INF/[サーブレット名]-servlet.xml です. 例: springmvc-servlet.xml。
    
    url-pattern: DispatcherServlet で処理するリクエストパスを渡してください。
        最初のタイプ: \*.do。これは DispatcherServlet によって解析され、特定の拡張子で終わります。これにより、静的リソース (jpg、js、css) が傍受されることはありません。
        2 番目のタイプ: /。したがって、アクセスされたアドレスは DispatcherServlet によって解析され、DispatcherServlet が解析しないように静的ファイルの解析を構成する必要があります。このようにして、RESTful スタイルの URL を実現できます。
        3 番目のタイプ: /*、この構成は正しくありません。この構成では、最終的に jsp ページに転送されるときに、DispatcherServlet は引き続き jsp アドレスを解決します。jsp ページに従ってハンドラが見つからない場合、エラーが発生します。報告されます。

2.1.4 プロセッサ マッパーの構成

springmvc 構成ファイルでプロセッサ マッパーを構成します。

<?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:util="http://www.springframework.org/schema/util"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 配置处理器映射器 -->
    <!--
        所有的处理器映射器都实现HandlerMapping接口
        BeanNameUrlHandlerMapping:根据处理器bean标签中name属性值来与请求路径匹配查找相应的处理器对象
    -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
</beans>

2.1.5 プロセッサ アダプタの構成

<!-- 配置处理器适配器 -->
<!--
  所有的处理器适配器都实现HandlerAdapter接口
  SimpleControllerHandlerAdapter:要求在编写处理器时,必须实现org.springframework.web.servlet.mvc.Controller接口
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

元のコードを表示すると、次のようになります。

public class SimpleControllerHandlerAdapter implements HandlerAdapter {
    public SimpleControllerHandlerAdapter() {
    }

    public boolean supports(Object handler) {
        return handler instanceof Controller;
    }

    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return ((Controller)handler).handleRequest(request, response);
    }

    public long getLastModified(HttpServletRequest request, Object handler) {
        return handler instanceof LastModified ? ((LastModified)handler).getLastModified(request) : -1L;
    }
}

    このアダプターは、org.springframework.web.servlet.mvc.Controller インターフェースを実装するハンドラーを実行できます。

2.1.6 開発ハンドラ

SimpleControllerHandlerAdapter アダプターによって実行されるためには、 Controller インターフェースを実装する必要があります。

/**
 * 处理器:用于请求处理
 *
 * 问题:
 * 1.依赖Spring API的处理器
 * 2.每个处理器仅能处理一个请求
 */
public class HelloWorldController implements Controller {
    /**
     * 处理请求的方法
     * @param request 原生的请求对象
     * @param response 原生的响应对象
     * @return 模型与视图对象
     * @throws Exception
     */
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("Hello Springmvc.....");
        
        //创建ModelAndView对象
        ModelAndView modelAndView = new ModelAndView();
        
        //设置数据(相当于将数据存放到域对象中,request域)
        modelAndView.addObject("message", "Hello Springmvc");
        
        //设置视图(相当于进行请求转发的页面路径)
        modelAndView.setViewName("/success.jsp");
        
        return modelAndView;
    }
}

ModelAndView: モデル データとビュー名が含まれます。

2.1.7 ハンドラの構成

Handler オブジェクトを SpringIOC コンテナー管理に渡します。

<!-- 配置处理器-->
<bean name="/helloworld.do" class="com.newcapec.controller.HelloWorldController"/>

Bean の name 属性値がリクエスト URL として使用され、パスはスラッシュで始まります。

2.1.8 ビュー リゾルバーの構成

<!-- 视图解析器 -->
<!--
  所有的视图解析器都实现ViewResolver接口
  InternalResourceViewResolver:JSP视图的解析器
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

2.1.9 ビュー書き込み

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <base href="${pageContext.request.contextPath}/">
    <title>Title</title>
</head>
<body>
    <div style="text-align: center;">
        <h1>首页</h1>
        <p><a href="helloworld.do">测试helloworld</a></p>
    </div>
</body>
</html>

success.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <base href="${pageContext.request.contextPath}/">
    <title>Title</title>
</head>
<body>
    <div style="text-align: center;">
        <h1>跳转成功页面</h1>
        <div style="color:red;">${message}</div>
    </div>
</body>
</html>

2.2 注釈のないプロセッサー・マッパーとアダプター

2.2.1 注釈なしのプロセッサ マッパー

    org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping で、ハンドラーの設定時に bean タグの name 属性にアクセス時のハンドラーに対応する URL を設定する。

    org.springframework.web.servlet.handler.SimpleUrlHandlerMapping は、プロセッサ Bean タグの id 属性値とリクエスト パスの一致に応じて、対応するハンドラ オブジェクトを見つけます.1 つのハンドラ オブジェクトは複数のリクエスト パスに対応できます。

<!--
  SimpleUrlHandlerMapping:
  根据处理器bean标签中id属性值与请求路径匹配查找相应的处理器对象,一个处理器对象可对应多个请求路径
-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <!-- 请求路径的url为key,处理器bean的id为value-->
            <prop key="/hello.do">helloController</prop>
            <prop key="/hello.action">helloController</prop>
        </props>
    </property>
</bean>

注: 同じプロジェクトでは、複数のマッパーが共存できます。フロント コントローラーは、URL をマップできるマッパーを決定し、正しいマッパーに処理させます。

2.2.2 アノテーションなしのハンドラ アダプタ

    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter では、記述された Handler が Controller インターフェースを実装する必要があります。

    org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter では、記述されたハンドラーが org.springframework.web.HttpRequestHandler インターフェースを実装する必要があります。

<!--
  HttpRequestHandlerAdapter:
  要求在编写处理器时,必须实现HttpRequestHandler接口
-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

2.2.3 プロセッサ

コード:

public class HelloController implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        System.out.println("HelloController执行了....");
        httpServletRequest.setAttribute("message", "hello");
        //重定向
        // httpServletResponse.sendRedirect("/success.jsp");
        //请求转发
      	httpServletRequest.getRequestDispatcher("/success.jsp").forward(httpServletRequest, httpServletResponse);
    }
}

構成:

<bean id="helloController" class="com.newcapec.controller.HelloController"/>

2.2.4 ビュー書き込み

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <base href="${pageContext.request.contextPath}/">
    <title>Title</title>
</head>
<body>
    <div style="text-align: center;">
        <h1>首页</h1>
        <p><a href="helloworld.do">测试helloworld</a></p>
        <p><a href="hello.do">测试hello.do</a></p>
        <p><a href="hello.action">测试hello.action</a></p>
    </div>
</body>
</html>

2.3 SpringMVC のデフォルト設定

    org.springframework.web.servlet パッケージの下に DispatcherServlet.properties リソース ファイルがあります。

     フロント コントローラーは、このプロパティ ファイルからプロセッサ マッパー、プロセッサ アダプター、ビュー リゾルバー、およびその他のコンポーネントを読み込みます. springmvc.xml で構成されていない場合は、デフォルトで読み込まれます.

2.4 注釈付きプロセッサ マッパーとアダプター

2.4.1 デフォルト構成とは異なるプロセッサー・マッパーおよびアダプター

spring3.1 より前に使用:

    org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping アノテーション ハンドラー マッパー。
    
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter アノテーション プロセッサ アダプタ。

spring3.1 の後に使用:

    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping アノテーション ハンドラー マッパー。
    
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter アノテーション プロセッサ アダプタ。

2.4.2 コンポーネントのスキャン

<!-- springmvc的注解式开发 -->
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.newcapec.controller"/>

2.4.3 RequestMappingHandlerMapping

    アノテーション プロセッサ マッパーは、@RequestMapping でマークされたメソッドをクラスにマッピングし、RequestMapping で定義された URL に従って RequestMapping でマークされたメソッドを照合し、照合が成功した場合は HandlerMethod オブジェクトをフロント コントローラーに返し、対応するメソッド Method をカプセル化します。 HandlerMethod オブジェクトの URL。

<!--配置处理器映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

2.4.4 RequestMappingHandlerAdapter

注釈プロセッサ アダプタの構成は次のとおりです。

<!--配置处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

2.4.5 ハンドラ プロセッサ

    @Controller アノテーションは、クラスのインスタンスがコントローラーであることを宣言するために使用されます。
    
    Spring MVC はスキャン メカニズムを使用して、アプリケーション内のすべてのアノテーション ベースのコントローラー クラスを検索します. したがって、コントローラー クラスが Spring MVC フレームワークによってスキャンされるようにするには、構成ファイルで spring-context を宣言し、<context を使用する必要があります。 :component-scan/> 要素は、コントローラー クラスの基本パッケージを指定します (すべてのコントローラー クラスが基本パッケージとそのサブパッケージの下にあることを確認してください)。

/**
 * 注解式处理器
 *
 * 好处:
 * 1.零侵入:无需继承或实现任何的接口或类
 * 2.一个处理器中可以处理多个请求,每个请求对应一个方法
 *
 * @Controller
 * 作用:配置bean和标识当前类为spirngmvc中的处理器
 */
@Controller
public class DemoController {

    /**
     * 处理请求的方法
     *
     * @RequestMapping
     * 作用:将请求的路径与处理请求的方法进行绑定...
     */
    @RequestMapping("/find.do")
    public ModelAndView find(){
        System.out.println("查询请求...");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message", "find");
        modelAndView.setViewName("/success.jsp");
        return modelAndView;
    }

    @RequestMapping("/add.do")
    public ModelAndView add(){
        System.out.println("新增请求...");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message", "add");
        modelAndView.setViewName("/success.jsp");
        return modelAndView;
    }
}

注: アノテーション マッパーとアノテーション アダプターはペアで使用する必要があります。

2.4.6 ビュー書き込み

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <base href="${pageContext.request.contextPath}/">
    <title>Title</title>
</head>
<body>
    <div style="text-align: center;">
        <h1>首页</h1>
        <p><a href="find.do">测试find</a></p>
        <p><a href="add.do">测试add</a></p>
    </div>
</body>
</html>

success.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <base href="${pageContext.request.contextPath}/">
    <title>Title</title>
</head>
<body>
    <div style="text-align: center;">
        <h1>跳转成功页面</h1>
        <div style="color:red;">${message}</div>
    </div>
</body>
</html>

2.5 Getting Started プログラムの概要

  • スターター プログラムを通じて、 SpringMVC フロント コントローラー、プロセッサー マッパープロセッサー アダプター、ビュー リゾルバーの使用方法を理解します。注釈的ではない理解で十分であり、注釈は熟達している必要があります。

おすすめ

転載: blog.csdn.net/ligonglanyuan/article/details/125104384