重生之我在地球当程序员-SpringMVC篇

重生之我在地球当程序员-SpringMVC篇

本篇主要讲述了SpringMVC框架的使用,以及SpringMVC相关知识点的介绍

SpringMVC 是应用web层的 基于MVC设计模式的轻量级的web框架。 对Servlet封装,支持restful风格

MVC概念和三层架构

MVC

Spring MVC中,MVC 是指「模型-视图-控制器」(Model-View-Controller)设计模式。这是一个广泛应用在现代Web应用程序中的设计模式,它将应用程序分为三个核心部分:

(1)模型(Model):负责处理业务逻辑,包括数据的存储和处理。在Spring MVC中,模型通常
使用Spring的数据访问框架(如JdbcTemplate、Hibernate等)来实现。
(2)视图(View):负责展示模型中的数据。在Spring MVC中,视图通常使用JSP
(JavaServer Pages)或者Thymeleaf等模板引擎来实现。
(3)控制器(Controller):负责接收用户的请求,调用模型进行数据处理,然后将结果传递给
视图进行展示。在Spring MVC中,控制器通常使用Spring的控制器接口(如Controller
或@RequestMapping)来实现。

Spring MVC利用这些组件来简化Web应用程序的开发,提供了一种更加模块化、可测试和可维护的方式来进行Web开发。
三层架构

包括:表现层(web)、业务层(service)、持久层(dao),三层架构在我们的实际开发中使用的非常多。

三层架构中,每一层各司其职,接下来我们就说说每层都负责哪些方面:
(1)表现层(表示层,web):也就是我们常说的web层。它负责接收客户端请求,向客户端
响应结果,通常客户端使用http协议请求web 层,web 需要接收 http 请求,完成 http 响应。
表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。
SpringMVC位于该层
(2)业务层:也就是我们常说的 service 层。它负责业务逻辑处理,和我们开发项目的需求息
息相关。	  spring框架: IOC提供对象, 声明式事务~ 
(3)持久层(Dao data access  object):也就是我们是常说的 dao 层。负责数据持久化,
和数据库做交互。Mybatis DButils JdbcTemplate Jdbc | Mybatis-plus | mapper 
Hibernate JPA 

SpringMVC 是 Spring Framework 中的一个重要模块,它提供了构建 Web 应用程序的全功能 MVC 框架。MVC(Model-View-Controller)是一种常用的软件设计模式,它将应用程序的输入、处理和输出分开,使得应用程序更加模块化、可重用和可维护。

核心配置

SpringMVC重点:
一个中心:根据请求路径找到对应的servlet,负责调度。
三个基本点:处理器映射器(对应着controller层的类)、处理器适配器(对应着控制类里面具体的一个方法)、视图解析器(根据适配器传的数据进行解析然后组装成视图)
导入依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.5.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.5.RELEASE</version>
</dependency>

配置web.xml

<!-- 配置Spring MVC的DispatcherServlet -->
<servlet>
    <servlet-name>springmvc1</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指定Spring MVC的配置文件位置 springmvc.xml为位置-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
</servlet>

<!-- 将Spring MVC的DispatcherServlet映射到根URL -->
<servlet-mapping>
    <servlet-name>springmvc1</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

springmvc1名字随意,<servlet>标签主要是定义一个servlet对应,当有请求的时候会根据路径<url-pattern>的参数进行匹配,根据名字寻找对应servlet,而servlet加载的过程中会根据<servlet-class>进行加载控制器。DispatcherServlet是SpringMVC内部封装的一个servlet类,该类是属于

配置springmvc.xml

 	<!-- 扫描指定包下的组件,将带有@Controller和@RestController注解的类注册为Spring的Bean -->
<context:component-scan base-package="com.test.controller"></context:component-scan>

<!-- 配置处理器映射器,用于将请求映射到控制器方法  根据请求 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>

<!-- 配置处理器适配器,用于将控制器方法适配到处理器映射器所需的格式 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

<!-- 配置视图解析器,用于解析控制器返回的视图名称 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 设置视图前缀,用于拼接控制器返回的视图名称 -->
    <property name="prefix" value="/"></property>
    <!-- 设置视图后缀,用于拼接控制器返回的视图名称 -->
    <property name="suffix" value=".jsp"></property>
</bean>

Spring MVC 配置,用于配置 Spring MVC 的基本组件。具体说明如下:

<context:component-scan>:
指定需要扫描的基础包,Spring 会在这些包及其子包下查找带有 @Controller 和 
@RestController 注解的类,并将它们注册为 Spring 的 Bean。

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>:
配置请求映射处理器,用于将请求映射到相应的控制器方法。 负责处理 HTTP 请求到控制器方
法的映射。换句话说,它决定了哪个 URL 应该调用哪个控制器方法。

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>:配置请求处理适配器,用于将控制器方法适配到请求映射处理器所需的格式。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">:
配置视图解析器,用于解析控制器返回的视图名称,然后将其解析为具体的视图资源。

prefix 属性:设置视图名称的前缀,通常是视图资源的基础路径。
suffix 属性:设置视图名称的后缀,通常是视图资源的文件扩展名。
SpringMVC 的主要组件:

Model(模型):
代表应用程序的数据和业务逻辑。
通常,模型是 POJO(Plain Old Java Object)或 JavaBean,包含应用程序的持久化实体和业务服务。
SpringMVC 支持多种数据绑定技术,如注解、数据绑定器等,将 HTTP 请求参数绑定到模型对象。
View(视图):
负责显示模型数据给用户。
在 SpringMVC 中,视图可以是 JSP、Thymeleaf、FreeMarker 等模板引擎,也可以是 JSON、XML 等数据格式。
SpringMVC 支持多种视图解析技术,如 JSP 视图解析器、Thymeleaf 视图解析器等。
Controller(控制器):
负责处理用户请求,调用业务逻辑,并选择合适的视图进行渲染。
在 SpringMVC 中,控制器是处理 HTTP 请求的 Java 类,通常使用 @Controller 注解进行标记。
控制器方法可以使用 @RequestMapping 注解来映射 HTTP 请求到具体的方法。
DispatcherServlet(前端控制器):
是 SpringMVC 的核心组件,负责接收所有的 HTTP 请求。
当一个请求到达时,DispatcherServlet 会根据请求的 URL 和配置的映射信息找到对应的控制器方法,并调用该方法。
控制器方法执行完毕后,DispatcherServlet 会根据返回的视图名称和配置的视图解析器找到具体的视图进行渲染。
HandlerMapping(处理器映射器):
负责根据请求的 URL 找到对应的控制器方法。
SpringMVC 提供了多种处理器映射器实现,如 SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping 等。
在大多数情况下,开发人员不需要直接配置处理器映射器,因为 SpringMVC 提供了默认的处理器映射器实现。
HandlerAdapter(处理器适配器):
负责调用控制器方法,并将请求参数绑定到控制器方法的参数上。
SpringMVC 提供了多种处理器适配器实现,用于支持不同的控制器类型和方法签名。
ViewResolver(视图解析器):
负责将视图名称解析为具体的视图对象,方法会返回一个逻辑视图名,而不是一个具体的视图对象。视图解析器负责根据这个逻辑视图名来查找对应的实际视图对象。
SpringMVC 提供了多种视图解析器实现,如 InternalResourceViewResolver(用于解析 JSP 视图)、ThymeleafViewResolver(用于解析 Thymeleaf 视图)等。
Handler(处理器)
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。
Interceptor(拦截器):
在请求处理过程中提供额外的功能,如日志记录、身份验证、权限检查等。
开发人员可以自定义拦截器类,并使用 @Component 或 @Bean 注解将其注册到 Spring 容器中。
通过配置拦截器的映射路径和顺序,可以控制哪些请求需要被拦截以及拦截器的执行顺序。
ModelAndView(模型视图)
控制器处理请求后,通常会返回一个 ModelAndView 对象,Spring MVC 将会根据 ModelAndView 中的视图名称去寻找对应的视图解析器,并将模型数据传递给该视图进行渲染。模型数据(Model Data):即控制器处理方法要传递给视图的数据,通常以键值对的形式存储在 ModelAndView 中的 Model 部分。视图名称(View Name):指定要渲染的视图的逻辑名称,通常以字符串的形式存储在 ModelAndView 中的 View 部分。
数据绑定和校验:
SpringMVC 支持自动将 HTTP 请求参数绑定到控制器方法的参数上,并提供了强大的数据校验功能。
可以使用 JSR 303/JSR 380 注解(如 @NotNull、@Size 等)对请求参数进行校验,并自定义校验失败时的处理逻辑。

SpringMVC执行过程
首先由用户使用浏览器进行访问发送请求,http://localhost:8080/user/insert进行访问,
根据8080后面的/匹配对应的DispatcherServlet(前端控制器),前端控制器将请求交给处理器
映射器(HandlerMapping)进行映射路径并且返回映射结果给前端控制器(根据路径找@RequestMapping("user")的
控制器(Handler)),然后根据处理器适配器(HandlerAdapter)找到对应的方法,最后方法返回
的结果由前端控制器交给视图解析器(ViewResolver)来处理,找到对应的结果视图,渲染视图,
将结果返回给浏览器,用户看到带有数据的网页。
Tomcat免配置插件

需要在pom里面配置

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <!--指定编码格式-->
                    <uriEncoding>utf-8</uriEncoding>
                    <!--指定项目启动后的访问路径-->
                    <path>/</path>
                    <!--指定访问端口号-->
                    <port>8888</port>
                </configuration>
            </plugin>
        </plugins>
    </build>
POST编码问题

POST 请求的编码问题,要在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>
/*和/、@RequestMapping(“user”)和@RequestMapping(“/user”)

在中,/ 和 /* 之间的区别在于它们的匹配规则:

/:当一个Servlet被配置了 / 时,它会匹配Web应用的根路径。
例如,如果你的Servlet配置了 /,那么只有当请求的URL为根路径时(例如 http://example.com/),才会被映射到这个Servlet。
/:当一个Servlet被配置了 / 时,它会匹配以其配置的路径开头的所有URL。
例如,如果你的Servlet配置了 /*,那么所有的请求都会被映射到这个Servlet,包括根路径以及根路径下的所有子路径(例如 http://example.com/、http://example.com/foo、http://example.com/foo/bar 等)。
总的来说,/ 匹配根路径,而 /* 匹配根路径及其所有子路径。选择哪种URL模式取决于你想要的映射行为,是只希望处理根路径下的请求,还是希望处理整个Web应用的所有请求。
@RequestMapping(“/user”):这种写法表示绝对路径,即请求路径必须精确匹配 /user。
当一个请求到达时,如果请求路径为 /user,则该注解匹配成功;但如果请求路径为 /user/add 或者其他除了 /user 之外的路径,则不会匹配成功。
@RequestMapping(“user”):这种写法表示相对路径,即请求路径只需匹配末尾为 /user 的路径即可。
当一个请求到达时,如果请求路径为 /user 或者 /user/,则该注解匹配成功;而如果请求路径为 /user/add 或者其他以 /user 开头但不是完全匹配 /user 的路径,则不会匹配成功。
因此,主要区别在于绝对路径需要完全匹配指定的路径,而相对路径只需要匹配路径的末尾部分。根据具体的业务需求和路径规则,选择合适的写法来定义@RequestMapping可以更好地匹配请求。

  • 31
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值