Spring MVC 学习笔记01 - 入门

Spring MVC 概述

Spring MVC是一种基于Java 的实现了 MVC 设计模式的轻量级 Web 框架,即采用了 MVC 架构模式的思想,将 Web 层进行职责解耦,框架的目的就是帮助我们简化开发,Spring MVC 也是要简化我们日常 Web 开发的。

MVC(Model View Controller 模型-视图-控制器)
Model(模型) 是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
View(视图) 是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
Controller(控制器) 是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

Spring MVC 入门案例

Quick Start

1.环境搭建
创建 Web 工程,导入依赖

<properties>
    <spring.version>5.2.5.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
  </dependencies>

创建 springmvc.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 开启注解扫描 -->
    <context:component-scan base-package="com.hn.controller"></context:component-scan>

    <!-- 配置视图解析器 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 开启 SpringMVC 注解的支持 -->
    <mvc:annotation-driven/>
</beans>

web.xml 中配置 DispatcherServlet 前端控制器,加载 springmvc.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>
    <!-- 配置前端控制器 -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 加载 springmvc.xml 配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- 启动服务器时创建该 servlet -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

2.编写视图层和控制器层代码
在 webapp 目录下创建视图 index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>入门案例</title>
</head>
<body>
<a href="hello">入门</a>
</body>
</html>

在 controller 层中创建 HelloController

@Controller
public class HelloController {
    @RequestMapping(path = "/hello")    //设置访问该方法对应的URL
    public String hello() {
        System.out.println("Hello springMVC !!!");
        return "success";   //      跳转的视图,视图解析器解配置了前缀和后缀,被解析为 WEB-INF\pages\success.jsp
    }
}

webapp/WEB_INF/pages 目录下创建成功跳转视图 success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>入门案例</title>
</head>
<body>
    <h2>Hello springMVC</h2>
</body>
</html>

3.将项目部署到服务器运行测试
在这里插入图片描述
访问首页,点击 链接,执行页面跳转
在这里插入图片描述

成功跳转并显示了 success.jsp的页面信息,至此,一个简单的入门案例完成
在这里插入图片描述

执行流程分析

  1. 启动 Tomcat 服务器,创建 DispatcherServlet 对象并加载 springmvc.xml 配置文件(已在 web.xml 中配置);
  2. 根据 springmvc.xml 配置文件初始化 Spring Ioc 容器,通过注解扫描管理 HelloController 对象的创建;
  3. 访问 index.jsp,点击链接,浏览器发送请求到 DispatcherServlet 前端控制器;
  4. DispatcherServlet 通过 HandlerMapping 处理器映射器找到 Controller,根据 @RequestMapping 注解找到具体要执行的方法;
  5. 执行方法后,InternalResourceViewResolver 视图解析器根据方法的返回值找到对应的视图 success.jsp
  6. DispatcherServlet 通过相应的渲染模板,将视图渲染后响应给浏览器。

流程大致如下【网图,侵删】
在这里插入图片描述

请求路径匹配

@RequestMapping 是一个用来处理请求地址映射的注解,该注解可用于类或方法上,用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

该注解常用的属性有:

属性作用
value | path指定请求的实际地址
method指定请求的方法类型,GET、POST、PUT、DELETE 等
params指定请求中必须包含某些参数值时,才能让该方法处理
headers指定请求头中必须包含某些指定的 header 值,才能让该方法处理

请求参数的绑定

SpringMVC 通过把请求参数作为控制器中方法的参数进行绑定的

基本数据类型和 String 类型的绑定

要求方法参数名称和请求参数名称必须保持一致,严格区分大小写。

<a href="insertUser?name=zhangsan&age=20">基本类型参数的绑定</a>
@Controller
public class HelloController {
    @RequestMapping(value = "/insertUser")
    public String insertUser(String name,int age) {
        System.out.println("添加用户,姓名:" + name + ",年龄:" +age);
        return "success";
    }
}
输出结果:添加用户,姓名:zhangsan,年龄:20

POJO 类型的参数绑定

POJO 类型的参数要想实现绑定,就必须实现其空参构造函数和所有属性的 get,set 方法,并且 POJO 类的属性名作为请求参数名,控制器中方法的参数类型是 POJO 类型。

实体类

public class User implements Serializable {
    private String username;
    private int age;
    private Address address;
    ...
    // getter and setter
}

public class Address  implements Serializable {
    private String province;
    private String city;
    ...
    // getter and setter
}

jsp 对应的请求参数名

<form action="addUser" method="post">
    姓名:<input type="text" name="username"/><br/>
    年龄:<input type="text" name="age"/><br/>
    所在省:<input type="text" name="address.province"/><br/>
    所在市:<input type="text" name="address.city"/><br/>
    <input type="submit" value="提交">
</form>

控制器

    @RequestMapping(value = "/addUser")
    public String addUser(User user) {
        System.out.println(user);
        return "success";
    }

集合类型的参数绑定

对 POJO 类中的集合属性进行参数绑定,给 List 集合中的元素赋值,使用下标;给 Map 集合中的元素赋值,使用键值对。

实体类

public class User implements Serializable {
    private String username;
    private int age;

    private List<Address> addressList;
    private Map<String,Address> addressMap;
    ...
    // getter and setter

jsp 对应的请求参数名

<form action="addUser" method="post">
    姓名:<input type="text" name="username"/><br/>
    年龄:<input type="text" name="age"/><br/>
    之前所在省:<input type="text" name="addressList[0].province"/><br/>
    之前所在市:<input type="text" name="addressList[0].city"/><br/>
    现在所在省:<input type="text" name="addressMap['one'].province"/><br/>
    现在所在市:<input type="text" name="addressMap['one'].city"/><br/>
    <input type="submit" value="提交">
</form>

自定义数据类型参数绑定

以 String 转为 Date 为例,自定义的类型转换器要实现 Converter<String, T> 接口,并在 springmvc.xml 配置文件中配置自定义类型转换器

实现类 StringToDaoConverter

//自定义类型转换器,把 String 转换成 Date
public class StringToDaoConverter implements Converter<String, Date> {

    @Override
    public Date convert(String s) {
        if (s.isEmpty()) {
            throw new RuntimeException("请输入需要转换的日期");
        }
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return dateFormat.parse(s);
        } catch (ParseException e) {
            throw new RuntimeException("数据类型转换异常");
        }
    }
}

springmvc.xml 配置文件中配置自定义类型转换器

    <!-- 配置自定义类型转换器 -->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
        	<!-- 注入自定义的类型转换类 -->
            <bean class="com.hn.utils.StringToDaoConverter"/>
        </property>
    </bean>
    <!-- 开启 SpringMVC 注解的支持 使用自定义类型转换器-->
    <mvc:annotation-driven conversion-service="conversionService"/>

请求参数绑定中文乱码问题

在 web.xml 中配置编码过滤器,即可解决请求参数中文乱码的问题。

    <!-- 配置编码过滤器 -->
    <filter>
        <filter-name>characterEncodingFilter</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>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值