SpringMVCフレームワーク(詳細説明)

1. はじめに

1.1. MVC とは何ですか?

Spring MVC は、MVC デザイン パターンを実装する Java ベースのリクエスト駆動型の軽量 Web フレームワークです。(M) モデル、(V) ビュー、および (C) コントローラーを分離することにより、Web 層は責任から切り離され、複雑な Web アプリケーションは明確なロジックで複数の部分に分割されるため、開発が簡素化され、エラーが減り、チーム内の開発者間の協力が容易になります。

1.2、SpringMVC の長所と短所

MVC の利点:
複数のビューがモデルを共有し、コードの再利用性が大幅に向上します。MVC
の 3 つのモジュールは互いに独立しており、疎結合アーキテクチャを備えています。
コントローラーはアプリケーションの柔軟性と構成可能性を向上させ、
ソフトウェア エンジニアリング管理に役立ちます。

完璧なシステム アーキテクチャ = 疎結合 + 高い再利用性 + 高い拡張性

MVC の欠点:
複雑な原理
、システム構造と実装の複雑さの増加、
ビューによるモデル データへの非効率なアクセス

1.3、MVCパターン
  1. ビュー対応コンポーネント:JSPまたはHTMLファイル
  2. コントローラ対応コンポーネント:サーブレット
  3. モデル対応コンポーネント:JavaBean
    ここに画像の説明を挿入します
    JSP Model1
    ここに画像の説明を挿入します
    JSP Model2
  4. サーブレット: フロントエンドリクエストを受け入れ、JavaBeans を呼び出します。
  5. JavaBean: ビジネスを処理し、データベースを操作します。
  6. JSP:処理結果をブラウザに応答し、ユーザーに提示する
    ここに画像の説明を挿入します
    MVC処理
    ここに画像の説明を挿入します
    Spring MVC
  7. JSP Model2 モデルのサーブレットをコントローラーに置き換える
  8. Controller はリクエストを受信すると業務処理を完了し、Model モデル オブジェクトを使用して処理結果を保存します。
  9. コントローラーは対応するビューパーサー View を呼び出して処理結果を表示し、最終的にクライアントは応答情報を取得します。

次に、SpringMvc を使用します。

21. maven-web プロジェクトを作成し、webapp ディレクトリの下の WEB-INF ディレクトリにある web.xml ファイルを変更します。

ここに画像の説明を挿入します

2.2、web.xml ファイルの内容は次のとおりです。
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <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.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>


<!--  页面中输入的中文,调到后端,出现乱码解决的问题  -->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>
      org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>
2.3、springMVC 依存関係の導入
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.xinxi2</groupId>
  <artifactId>SpringMvc1</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>SpringMvc1 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring.version>5.2.5.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>


  <!-- log4j 日志jar-->

  <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
  </dependency>

  <!-- 连接mysql5 的驱动 -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.10</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.2</version>
  </dependency>

  <!-- mybatis依赖 -->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.2</version>
  </dependency>
  <!-- 参考版本对应 http://www.mybatis.org/spring/ -->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.2</version>
  </dependency>

  <!-- 数据源管理  使用了dbcp2数据 -->
  <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
    <version>2.1.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.4.2</version>
  </dependency>

  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <!-- commons 文件上传jar -->
  <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.4</version>
  </dependency>
  <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
  </dependency>

  <!-- jstl -->
  <dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
  </dependency>

  <!-- 加入JSON转换工具 -->
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
  </dependency>

  </dependencies>

  <build>
    <finalName>SpringMvc1</finalName>
  </build>
</project>

2.4、springmvc.xml ファイルを作成する
<?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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd

	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd">

<!--  扫描  -->
    <context:component-scan base-package="com.controller"></context:component-scan>
</beans>
2.5、コントローラークラスを作成する
import java.util.List;
import java.util.Map;


//标记该类为处理层类
@Controller
@RequestMapping("/hello")

public class HelloController {
    
    
   	
    //把请求路径映射到该方法上
    @RequestMapping("/hello01")
    public String hello01(){
    
    
        System.out.println("hello01");
        
        //请求转发到hello01.jsp界面
        return "hello01.jsp";
    }
}
2.6、springMVC 実行プロセス
  1. クライアントは http://localhost:8080/springMVC17/hello をリクエストします
  2. Tomcatサーバーに来てください。
  3. Springmvc のフロントエンド コントローラー DipatcherServlet はすべてのリクエストを受け入れます。
  4. リクエストアドレスがどの @RequestMaping に一致するかを確認してください。
  5. 対応するメソッドを実行します。このメソッドは文字列を返します。Springmvc は文字列を解析して Web ページに転送します。
  6. ビューパーサーを通じて文字列を連結します。
  7. スプライスされたアドレスを取得し、対応する Web ページを見つけます。
  8. Web ページをクライアントにレンダリングする
2.7、モデルを使用してデータをアップロードする
    @RequestMapping("/hello03")
    public String hello03(Student student,Model model){
    
    
        System.out.println("hello03"+student.getUsername()+"  "+student.getPwd()+" "+student.getBirthday()+" "+student.getAge());
        model.addAttribute("linyuhao","hh");
        return "hello01.jsp";
    }

ここに画像の説明を挿入します

HttpServletRequest を使用してデータをアップロードする

    @RequestMapping("/hello04")
    public String hello04(HttpServletRequest request){
    
    
        System.out.println("hello04");
        request.setAttribute("guangtou","gg");
        return "hello01.jsp";
    }

ここに画像の説明を挿入します

2.8、マップを使用してデータをアップロードする
    @RequestMapping("/hello05")
    public String hello05(Map map){
    
    
        System.out.println("hello05");
        int count = 1/0;
        map.put("wangdao","qq");
        return "redirect:/login.jsp";
    }

ここに画像の説明を挿入します

2.9、静的リソース読み込みの問題

ここに画像の説明を挿入します
これには、 springMVC 構成ファイルに静的リソースをロードする必要があります。

<!--  解决了静态资源的加载问题  -->
    <mvc:resources mapping="/static/**" location="/static/"></mvc:resources>

ここに画像の説明を挿入します

3. ページリダイレクトの実装方法

コントローラー層のメソッドでは戻り値はString型で、リクエスト転送メソッドでインターフェースを返しますが、リダイレクトを利用して他のページにジャンプしたい場合は戻り値にredirect:を追加し、/when springmvc返される文字列に redirect: が含まれている場合、リダイレクトするとみなされます。

「redirect:/login.jsp」を返します。

    @RequestMapping("/hello05")
    public String hello05(Map map){
    
    
        System.out.println("hello05");
        int count = 1/0;
        map.put("wangdao","qq");
        return "redirect:/login.jsp";
    }

4. インターセプター

4.1. インターセプターの作成
package com.Interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class LoginInterceptor implements HandlerInterceptor {
    
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("preHandle");
//        拦截规则,自己根据业务需求实现
        String username = request.getParameter("username");
        if (null==username || "".equals(username)){
    
    
            response.sendRedirect("/index.jsp");
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        System.out.println("postHandle:handle执行完,渲染之前");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        System.out.println("afterCompletion:handle执行完,渲染之后");
    }
}

作成したインターセプタ クラスは HandlerInterceptor インターフェイスを実装し、preHandle メソッドをオーバーライドする必要があります。
定義したインターセプタを使用する場合は、springmvc.xml ファイルにインターセプタを登録する必要があります。

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/hello/**"/>
            <mvc:exclude-mapping path="/hello/hello04"/>
            <bean class="com.Interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

5. ファイルのアップロード

5.1. ローカルサーバーへのアップロード

最初のステップは、ファイルのアップロードのための依存関係をインポートすることです。

  <!-- commons 文件上传jar -->
  <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.4</version>
  </dependency>
  <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
  </dependency>

2番目のステップはページの作成です. ここで注意する必要があるのは、送信方法が投稿後である必要があるということです. フォームタイプ enctype は multipart/form-data の形式に設定する必要があります. input タグの name 属性ここは省略できず、コントローラー層で受け取る必要があります。パラメーター名は同じです。

<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2023/6/25
  Time: 16:39
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>上传文件</title>
</head>
<body>
    <form action="/hello/hello03" method="post" enctype="multipart/form-data">
        <input type="text" name="username"><br>
        <input type="file" name="photo"><br>
        <input type="text" name="age"><br>
        <input type="text" name="birthday">
        <input type="submit" value="提交">
    </form>
</body>
</html>

3 番目のステップは、springMVC 構成ファイルでファイル アップロード パーサーを構成することです。

<!--  配置multipartResolver,用于上传文件,使用spring的CommonsMultipartResolver  -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxInMemorySize" value="5000000"></property>
        <property name="defaultEncoding" value="UTF-8"></property>
    </bean>

4 番目のステップは、ファイル アップロード インターフェイスを実装するメソッドを作成することです。@RequestMapping は、要求されたインターフェイスを表します。

    @RequestMapping("/uploadPage")
    public String uploadPage(){
    
    
        return "upload.jsp";
    }

    @RequestMapping("/upload")
    @ResponseBody // 此方法的返回值就是响应体的内容
    public String upload(String username, MultipartFile photo,HttpServletRequest request){
    
    

        String fileType = photo.getOriginalFilename();
        int index = fileType.lastIndexOf(".");
        fileType = fileType.substring(index);
        String path = request.getSession().getServletContext().getRealPath("static"+File.separator+"uploadfiles");
        long filename = System.currentTimeMillis();
        System.out.println(path);
        System.out.println(fileType);
        System.out.println(path+"\\"+filename+fileType);
        File file = new File(path+"\\"+filename+fileType);
        try {
    
    
            photo.transferTo(file);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        return "上传成功!";
    }

6. 内容補足

@RestController は @Controller+@ResponseBody と同等です。
このアノテーションの下にあるすべてのメソッドは json データを返します。
@RequestMapping: 機能: リクエスト パスをレスポンス メソッドにマップします。

@RequestParam(value = “u”): 受け入れるリクエストパラメータ名を設定します。クエリパラメータ

@Param(value="name"): mybatis のマッパー マッピング ファイルにパラメータを設定します。

@RequestMapping(value = “/addUser”, method = RequestMethod.POST)
メソッド: このインターフェースが受け付けるリクエストメソッドを示します。設定されていない場合は、任意のリクエストメソッドを受け付けます。
@GetMapping("addUser"): get 送信メソッドのリクエストのみが受け入れられることを示します

@RequestBody: リクエストされた json データを Java オブジェクトに変換します。フロントエンドからバックエンドへ
@ResponseBody: バックエンドからフロントエンドへ Java から JSON データに変換します

おすすめ

転載: blog.csdn.net/H20031011/article/details/131511482