一文带你了解SpringMVC基本知识

SpringMVC简介

MVC模式

MVC是软件工程中的一种软件架构模式,它是一种分离业务逻辑与显示界面的开发思想。

  • M(model)模型:处理业务逻辑,封装实体

  • V(view) 视图:展示内容

  • C(controller)控制器:负责调度分发(1.接收请求、2.调用模型、3.转发到视图)

SpringMVC概述

SpringMVC 是一种基于 Java 的实现 MVC 设计模式的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在Spring Web Flow 中。

SpringMVC已经成为目前最主流的MVC框架之一,并且随着Spring3.0的发布,全面超越 Struts2,成为最优秀的MVC框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。

SpringMVC组件

SpringMVC的执行流程

    1. 用户发送请求至前端控制器DispatcherServlet。
    1. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
    1. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如 果有则生成)一并返回给DispatcherServlet。
    1. DispatcherServlet调用HandlerAdapter处理器适配器。
    1. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
    1. Controller执行完成返回ModelAndView。
    1. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。 - 8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
    1. ViewReslover解析后返回具体View。
    1. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
    1. DispatcherServlet将渲染后的视图响应响应用户。

Spring组件解析

1. 前端控制器:DispatcherServlet

用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。

2. 处理器映射器:HandlerMapping

HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器 实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

3. 处理器适配器:HandlerAdapter

通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

4. 处理器:Handler

它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到

Handler。由Handler 对具体的用户请求进行处理。

5. 视图解析器:ViewResolver

View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给 用户。

6. 视图:View

SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、 pdfView等。最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展 示给用户,需要由程序员根据业务需求开发具体的页面。

SpringMVC注解解析

Controller

SpringMVC基于Spring容器,所以在进行SpringMVC操作时,需要将Controller存储到Spring容器 中,如果使用@Controller注解标注的话,就需要使用:

<!--配置注解扫描-->
<context:component-scan base-package="com.111.controller"/>
复制代码

RequestMapping

  • 作用:

          用于建立请求 URL 和处理请求方法之间的对应关系
    复制代码
  • 位置:

      1.类上:请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。
    
      2.方法上:请求URL的第二级访问目录,和一级目录组成一个完整的 URL 路径。
    复制代码
  • 属性:

          1.value:用于指定请求的URL。它和path属性的作用是一样的
          2.method:用来限定请求的方式
          3.params:用来限定请求参数的条件
          
    复制代码

SpringMVC请求

请求参数类型详情

SpringMVC可以接收如下类型的参数:

  •   基本类型参数
  •   对象类型参数
  •   数组类型参数
  •   集合类型参数

获取基本类型参数

Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且能自 动做类型转换;自动的类型转换是指从String向其他类型的转换。

<a href="${pageContext.request.contextPath}/user/simpleParam?id=1&username=杰克"> 基本类型
复制代码
@RequestMapping("/simpleParam")

public String simpleParam(Integer id,String username) {

    System.out.println(id);

    System.out.println(username);

    return "success";

}
复制代码

获取对象类型参数

Controller中的业务方法参数的POJO属性名与请求参数的name一致,参数值会自动映射匹配。

form action="${pageContext.request.contextPath}/user/pojoParam" method="post"> 编号:<input type="text" name="id"> <br>

用户名:<input type="text" name="username"> <br>

<input type="submit" value="对象类型">

</form>
复制代码
public class User {

    Integer id;

    String username;

    // setter getter...

}

@RequestMapping("/pojoParam")

public String pojoParam(User user) {

    System.out.println(user);

    return "success";

}
复制代码

中文乱码过滤器

当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。

<!--配置全局过滤的filter--> 
<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>
复制代码

获取数组类型参数

Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。

<form action="${pageContext.request.contextPath}/user/arrayParam"> 编号:<br>

<input type="checkbox" name="ids" value="1">1<br> <input type="checkbox" name="ids" value="2">2<br> <input type="checkbox" name="ids" value="3">3<br> <input type="checkbox" name="ids" value="4">4<br> <input type="checkbox" name="ids" value="5">5<br> <input type="submit" value="数组类型">

</form>
复制代码
@RequestMapping("/arrayParam")

public String arrayParam(Integer[] ids) {

    System.out.println(Arrays.toString(ids));

    return "success";

}
复制代码

获取集合(复杂)类型参数

SpringMVC 默认已经提供了一些常用的类型转换器;例如:客户端提交的字符串转换成int型进行参 数设置,日期格式类型要求为:yyyy/MM/dd 不然的话会报错,对于特有的行为,SpringMVC提供了自 定义类型转换器方便开发者自定义处理。

<form action="${pageContext.request.contextPath}/user/converterParam"> 生日:<input type="text" name="birthday">

<input type="submit" value="自定义类型转换器">

</form>
复制代码
public class DateConverter implements Converter<String, Date> {

    public Date convert(String dateStr) {
//将日期字符串转换成日期对象 返回
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date = null;
try {
            date = format.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}
复制代码
<!--处理器映射器和适配器增强-->

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation- driven>

<!--自定义转换器配置-->

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">

    <property name="converters">

        <set>

            <bean class="com.111.converter.DateConverter"></bean>

        </set>

    </property>

</bean>
复制代码

相关注解

RequestParam

当请求的参数name名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注 解显示的绑定

<a href="${pageContext.request.contextPath}/user/findByPage?pageNo=2"> 分页查询

</a>
复制代码
/*

@RequestParam() 注解

*/

defaultValue 设置参数默认值

name 匹配页面传递参数的名称

required 设置是否必须传递参数,默认值为true;如果设置了默认值,值自动改为false

@RequestMapping("/findByPage")

public String findByPage(@RequestParam(name = "pageNo", defaultValue = "1")

Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize) {

    System.out.println(pageNum);

    System.out.println(pageSize);

    return "success";

}
复制代码

RequestHeader

获取请求头的数据。

@RequestMapping("/requestHead")

public String requestHead(@RequestHeader("cookie") String cookie) {

    System.out.println(cookie);

    return "success";

}
复制代码

CookieValue

获取cookie中的数据。

@RequestMapping("/cookieValue")

public String cookieValue(@CookieValue("JSESSIONID") String jesessionId) {

    System.out.println(jesessionId);

    return "success";

}
复制代码

SpringMVC快速入门案例

客户端发起请求,服务器接收请求,执行逻辑并进行视图跳转。

分析步骤

1. 创建web项目,导入SpringMVC相关坐标

2. 配置SpringMVC前端控制器 DispathcerServlet 

3. 编写Controller类和视图页面

4. 使用注解配置Controller类中业务方法的映射地址 

5. 配置SpringMVC核心文件 spring-mvc.xml
复制代码

创建web项目,导入SpringMVC相关坐标

<!-- 设置为web工程 --> 
<packaging>war</packaging>

<dependencies>
<!--springMVC坐标--> 
<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.5.RELEASE</version>
    </dependency>
<!--servlet坐标-->   
<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
   
       </dependency>

<!--jsp坐标--> 
<dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
复制代码

配置SpringMVC前端控制器DispathcerServlet

<?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_3_1.xsd"

         version="3.1">

<!--前端控制器--> <servlet>

        <servlet-name>dispatcherServlet</servlet-name>

        <servlet-

class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>

            <param-name>contextConfigLocation</param-name>

            <param-value>classpath:spring-mvc.xml</param-value>

        </init-param>

        <load-on-startup>2</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>dispatcherServlet</servlet-name>

        <url-pattern>/</url-pattern>

    </servlet-mapping>

</web-app>
复制代码

编写Controller类和视图页面

UserController.java

public class UserController {

    public String quick() {

        System.out.println("quick running.....");

        return "/WEB-INF/pages/success.jsp";

    } 
}
复制代码

/WEB-INF/pages/ success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>success</title>
</head>
<body> <h3>请求成功!</h3>
</body>
</html>
复制代码

使用注解配置Controller类中业务方法的映射地址

@Controller

public class UserController {
    @RequestMapping("/quick")
    public String quick() {
        System.out.println("quick running.....");
        return "/WEB-INF/pages/success.jsp";
    }
}
复制代码

配置SpringMVC核心文件spring-mvc.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">
<!--配置注解扫描-->
<context:component-scan base-package="com.lagou.controller"/>
</beans>
复制代码

web工程执行流程



链接:https://juejin.cn/post/7027987696391815199
 

全部评论

相关推荐

10-24 13:36
门头沟学院 Java
Zzzzoooo:更新:今天下午有hr联系我去不去客户端,拒了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务