SpringMVC介绍及详细使用

介绍

了解SpringMVC之前我们先要了解什么是三层架构
三层架构
1.开发服务器端程序,一般都基于两种形式,一种C/S架构程序,一种B/S架构程序
2.使用Java语言基本上都是开发B/S架构的程序,B/S架构又分成了三层架构
3.三层架构

 表现层:WEB层,用来和客户端进行数据交互的。表现层一般会采用MVC的设计模型
 业务层:处理公司具体的业务逻辑的
 持久层:用来操作数据库的

MVC(Model-View-Controller)是一种常见的软件设计模式,用于将应用程序的逻辑分离成三个独立的组件:
Model:数据模型,JavaBean的类,用来进行数据封装。
View:指JSP、HTML用来展示数据给用户
Controller:用来接收用户的请求,整个流程的控制器。用来进行数据校验等

Spring Web MVC是基于Servlet API构建的原始Web框架,也是Spring框架的一部分。它提供了灵活可扩展的MVC架构,方便开发者构建高性能的Web应用程序,并与 Spring 生态系统无缝集成。

SpringMVC的入门程序

执行流程

在这里插入图片描述

入门程序

打开idea创建一个mavenWEB项目,在pom文件中导入依赖

<!--  版本锁定  -->
<properties>
  <spring.version>5.0.2.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>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

编写index.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<%--超链接--%>
​
<h3>入门</h3><a href="/hello.do" >入门程序</a>
</body>
</html>

编写Controller类和方法

/**
 * 表现层的类  交给spring去管理
 */
@Controller
//@RequestMapping("/hello")  //第一层路径
public class HelloController {

    @RequestMapping("/hello.do")   //第二层路径
    public String sayHello(){
        System.out.println("SpringMVC入门程序!!");
        return "suc";
    }
}

创建一个springMVC.xml配置文件

<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">
    <!-- 开启注解扫描 -->
    <!--  配置spring创建容器时要扫描的包  -->
    <context:component-scan base-package="com.qcby.controller"/>
    <!--  配置视图解析器  -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

在WEB-INF下面放置一个pages包,创建一个suc.jsp,这就是成功页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功页面</title>
</head>
<body>
<h1>SpringMVC入门案例成功了!!</h1>
</body>
</html>

配置核心的控制器(配置DispatcherServlet)
在web.xml配置文件中核心控制器DispatcherServle

<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 总的Servlet -->
<servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 加载springmvc.xml配置文件,配置的是Spring配置 -->
  <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>dispatcherServlet</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>

之后直接打开就可以了
流程如下:启动tomcat后找到web.xml,就可以加载入SpringMVC.xml的配置文件,配置文件中可以加载视图解析器和找到要管理的类,通过web.xml中的拦截器找到*.do就可以找到方法,调用方法返回字符串suc,最后通过视图解析器找到WEB-INF/pages中的suc.jsp,启动界面
执行流程

RequestMapping注解

在上面的controller中用到了RequestMapping注解,
RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系,通过该注解才能使前端发起请求时找到后端中对应的方法。

RequestMapping注解可以作用在方法和类上
1.作用在类上:第一级的访问目录
2.作用在方法上:第二级的访问目录
3.细节:路径可以不编写 / 表示应用的根目录开始
RequestMapping的属性
1.path 指定请求路径的url
2.value value属性和path属性是一样的,但不可以省略
3.mthod 指定该方法的请求方式
4.params 指定限制请求参数的条件
例如:

 @RequestMapping(path = "/save.do",method = {RequestMethod.GET},params = "username")

请求参数的绑定

SpringMVC 简单的一个或者两个直接可以传递的用参数就可以接收,但是要保证参数名和表单里的input标签的name属性一样
底层通过反射获取到参数进行对比,一旦匹配了就可以接收到
配置文件:

<context:component-scan base-package="com.qcby"/>
<!--  配置视图解析器  -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

基本类型数据

Controller类中接收数据

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/save.do")
    public String save(String username,Integer age){
        System.out.println("名字:"+username);
        return "suc";
    }
}

jsp页面中表单提交数据

<head>
    <title>演示请求参数的绑定</title>
</head>
<body>
   <h3>SpringMVC请求参数的绑定</h3>
   <form method="post" action="/user/save.do">
       姓名:<input type="text" name="username">
       年龄:<input type="text" name="age">
       <input type="submit" value="提交" />
   </form>
</body>

引用类型和集合数据类型

加上了引用数据类型和list集合和map集合
前端:

</form>
<h3>SpringMVC请求参数的绑定(实体类中由引用类型和集合的绑定)</h3>
<form method="post" action="/user/save3.do">
    姓名:<input type="text" name="username">
    年龄:<input type="text" name="age">
    工资:<input type="text" name="address.money">
    工资1:<input type="text" name="list[0].money">
    工资2:<input type="text" name="map['aaa'].money">
    <input type="submit" value="提交" />
</form>

实体类:

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/save3.do")
    public String save3(User user){
        System.out.println(user);
        return "suc";
    }
}
public class Address {
    private Double money;
    public Double getMoney() {
        return money;
    }
    public void setMoney(Double money) {
        this.money = money;
    }
    @Override
    public String toString() {
        return "Address{" +
                "money=" + money +
                '}';
    }
}
public class User {
    private String username;
    private Integer age;
    private Address address;
    private List<Address> list;
    private Map<String,Address> map;
    public String getName() {
        return username;
    }
    public Map<String, Address> getMap() {
    return map;
}
    public void setName(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public List<Address> getList() {
        return list;
    }

    public void setList(List<Address> list) {
        this.list = list;
    }

@Override
public String toString() {
    return "User{" +
            "username='" + username + '\'' +
            ", age=" + age +
            ", address=" + address +
            ", list=" + list +
            ", map=" + map +
            '}';
}
}

如果出现中文乱码问题
可以在配置文件中添加

<!-- 配置过滤器,解决中文乱码的问题 -->
    <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>

日期类型数据

使用日期时xxxx/xx/xx这种形式是可以绑定的,但是实际中xxxx-xx-xx这种形式更多,因此要用别的方法来获取绑定
一、使用DateTimeFormat注解的方式
在类型中的变量前加上注解,pattern为数据按什么格式返回

@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;

再在配置文件中加上

<mvc:annotation-driven>

二、自定义类型转换器

import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 *  
 * 自定义类型转换器 把String转换成Date
 */
public class StringToDate implements Converter<String,Date>{
    /**
     * 进行类型转换的方法
     * @param s     用户输入的内容
     * @return
     */
    @Override
    public Date convert(String s) {
        // 判断
        if(s == null){
            throw new RuntimeException("请输入内容");
        }
        // 进行转换
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            // 进行转换
            return sdf.parse(s);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

注册自定义类型转换器,在springmvc.xml配置文件中编写配置

<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">
    <!-- 开启注解扫描 -->
    <!--  配置spring创建容器时要扫描的包  -->
    <context:component-scan base-package="com.qcby"/>
    <!--  配置视图解析器  -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value
上一篇:ffmpeg/ffplay指令


下一篇:STM32学习笔记(3)- GPIO输出