Web中的Spring

Spring Web MVC Spring MVC 是个实现了 MVC 模式的 Web 框架Spring Boot 只是实现Spring MVC的其中种式已.Spring Boot 可以添加很多依赖, 借助这些依赖实现不同的功能. Spring Boot 通过添加Spring WebMVC框架, 来实现web功能不过Spring在实现MVC时, 也结合项的特点, 做了些改变@RequestMapping 是 Spring Web MVC 应程序中最常被到的注解之,它是来注册接的路由映射的. 阅读详情

前言:前面我们学习了关于Spring核心的IOC和AOP知识,除此之外,以此为基础,Spring的MVC框架还经常被用于Web开发(SpringMVC)

一、什么是SpringMVC框架?

在了解SpringMVC之前,我们先回顾一下Spring基础架构:

Spring MVC 是Spring的一部分,基于模型 - 视图 - 控制器( Model-View-Controller , MVC )模式实现,它能够帮你构建像 Spring 框架那样灵活和松耦合的 Web 应用程序。在实际开发中,接收浏览器的请求响应,对数据进行处理,然后返回页面进行显示。

转发此文关注我添加小助手VX:xuanwo008咨询如何获取java技术干货、面试资料

二、SpringMVC组成以及运行原理

Ⅰ、SpringMVC的组成

  1. DispatcherServlet:前端控制器 (SpringMVC的核心)-----相当于MVC中的C,作为中心调用其他组件,降低其他组件之间的耦合性
  2. HandlerMapping:处理器映射器 ----------------------------------根据用户请求找到对应路径的处理器(相当于处理器的名单)
  3. HandlAdapter:处理器适配器 --------------------------------------调用执行处理器方法(适配器模式的应用)
  4. Handler:处理器 --------------------------------------------------------处理用户请求的类,相当于传统意义上的Servlet
  5. ViewResolver:视图解析器 ------------------------------------------处理返回结果,将处理器适配器返回的数据模型转换成具体视图,并进行渲染输出(实际上就是将处理器返回的名称补充成具体的路径也就是一个视图,同时从数据模型中提取数据进行填充)
  6. View:视图 ---------------------------------------------------------------视图是数据最终需要展现给客户的地方,Spring支持多种类型的视图:jstlVies,freemarkerView等,最常用的是JSP和使用模板实现的html等

Ⅱ、SpringMVC请求响应流程

①用户发起请求,携带请求信息到前端控制器进行调度

②前端控制器(DispatcherServlet)调用处理器映射器,根据请求信息从处理器映射器中找到访问路径的目标处理器

③前端控制器(DispatcherServlet)根据得到的目标处理器映射,调用处理器适配器方法(处理器适配器将处理器方法包装成适配器模式)

④处理器适配器(HandlerAdapter)调用处理器(Handler)相应功能方法,并将结果返回给前端控制器

⑤前端控制器(DispatcherServlet)根据得到的数据结果和目标视图名称,调用视图解析器(ViewResolver)返回目标视图完整路径

⑥前端控制器(DispatcherServlet)根据得到的视图路径,对目标视图(view)进行渲染(数据填充等),得到目标视图

⑦前端控制器(DispatcherServlet)将目标视图展现给用户

从上述流程可以看到,SpringMVC的功能流转是围绕前端控制器(DispatcherServlet)实现的,这样的好处是使得各个组件之间的耦合性大大降低,各个组件只做自己应该做的事情。其实这是大部分框架想要实现的目标。

分析DispatcherServlet,从Spring官网查看到的结构图如下:

从结构图可以看到,DispatcherServlet包含了两个Web应用上下文,用于独立控制,其中:

  • Servlet WebApplicationContext:管理用于网络请求的处理器适配器,视图解析器,处理器映射器和处理器
  • Root WebApplicationContext:管理基本的数据库操作类,业务逻辑类等Bean

通过两个应用上下文管理基本Bean和网络Bean,互不干扰,但是其中管理的Bean之间可以互相使用

三、SpringMVC的简单使用(注解方式)

首先我们应该先引入Spring对WebMvc的支持,maven引入如下:

 

<!--引入网络Servlet支持-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<!--引入SpringMVC-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${org.springframework.version}</version>
</dependency>

①创建DispatcherServlet类,继承并重载AbstractAnnotationConfigDispatcherServletInitializer类的三个方法:

 

//定义DispatcherServlet类名为WebAppInitializer
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 指定DispatcherServlet的基本Bean应用上下文配置类
     * @return
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{RootConfig.class};
    }

    /**
     * 指定DispatcherServlet的网络类应用上下文配置类
     * @return
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    /**
     * 将DispatcherServlet映射到“/”,即应用内所有访问都会经过DispatcherServlet的处理
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        logger.debug("DispatcherServlet获取匹配的前端控制器。。。。。。");
        return new String[]{"/"};
    }
}

②创建上述代码的两个配置类:RootConfig.java和WebConfig.java,其中,RootConfig只扫描除了WebConfig扫描范围外的基本类,而WebConfig只扫描基本的网络类,同时配置视图解析器和处理器映射器,并开启mvc配置

 

//定义WebConfig配置类
@Configuration
@ComponentScan(basePackages = {"com.my.spring.controller"})//WebConfig扫描包的范围
@EnableWebMvc /*<mvc:annotation-driven> 开启mvc配置*/
public class WebConfig extends WebMvcConfigurationSupport {

    /**
     * 定义一个视图解析器
     *
     * @return org.springframework.web.servlet.ViewResolver
     *
     * @author xxx 2019/3/5
     * @version 1.0
     **/
    @Bean
    public ViewResolver viewResolver(){
        //基本的视图解析器
        InternalResourceViewResolver resourceViewResolver = new InternalResourceViewResolver();
        //视图前缀,指向WEB-INF目录下的view目录,意思是所有的视图名称进入视图解析器的时候都会被加上前缀
        resourceViewResolver.setPrefix("/WEB-INF/view/");
         //视图后缀,此处指定后缀为jsp,意思是所有的视图名称进入视图解析器的时候都会被加上后缀,前缀+view名+后缀得到完整路径
        resourceViewResolver.setSuffix(".jsp");
         //可以在JSP页面中通过${}访问beans
        resourceViewResolver.setExposeContextBeansAsAttributes(true);
        return resourceViewResolver;
    }

    /**
     * 配置一个默认的处理器,实现父类接口,自动处理静态资源的映射
     * @param configurer
     */
    @Override
    protected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

//定义RootConfig配置类
@Configuration
//指定扫描范围,排除过滤掉使用了@EnableWebMvc注解扫描范围的bean,不进行扫描
@ComponentScan(basePackages ={"com.my.spring"},excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {EnableWebMvc.class})})
public class RootConfig {
}

③编写基本的Bean类

 

@Data//lombok的注解,编译添加setter和getter方法
public class BaseBean {

    private Integer id;

    private String name;

}

④编写逻辑操作类(暂时没有用到数据库,所以只是模拟)

 

//定义基本Dao接口
public interface BaseRepository {
    /**
     * 根据id获取BaseBean
     * @param id 目标id
     * @return
     */
    BaseBean findOne(Integer id);
}

//定义基本Dao实现类,@Repository注解使用了@Component,可以被当作组件装配
@Repository
public class BaseRepositoryImpl implements BaseRepository {

    @Override
    public BaseBean findOne(Integer id) {
        if(id!=0){
            return null;
        }
        BaseBean baseBean = new BaseBean();
        baseBean.setId(0);
        baseBean.setName("测试bean");
        return baseBean;
    }
}

//定义基本Service接口
public interface BaseService {
     /**
     * 根据id获取BaseBean
     * @param id 目标id
     * @return
     */
    BaseBean findBean(Integer id);
}

//定义基本操作实现类,使用@Service注解,标明该类是一个service,该注解使用了@Comonnet注解,所以可被作为组件进行装配
@Service
public class BaseServiceImpl implements BaseService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    //注入基本操作dao
    @Autowired
    private BaseRepository baseRepository;

    @Override
    public BaseBean findBean(Integer id) {
        return this.baseRepository.findOne(id);
    }
}

⑤创建处理类HomeController,使用@Controller注解标明当前类为一个处理类,同样使用@Component注解,可被装配

 

@Controller
public class HomeController {

    @Autowired
    private BaseService baseService;

    /**
     *使用@RequestMapping注解,将当前方法作为可访问路径,value值指定了访问路径,而method值指定了访问方式
     */
    @RequestMapping(method = RequestMethod.GET,value = "/home")
    public String home(){
        //返回试图名为home的视图
        return "home";
    }
}

看到上述代码,我们首先做最简单的测试,通过访问/home路径,访问具体的静态资源:

根据WebConfig中的视图解析器,我们在相应路径下创建:/WEB-INF/view/home.jsp

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Home Page</title>
</head>
<body>
    <h1>Hello World</h1>
</body>
</html>

路径如下:

启动项目,页面访问如下:本项目名为SpringAction05

从访问结果可以看到,访问被转向了home.jsp,而我们在controller方法中只是return了一个home,也就是说,视图解析器为我们补充了完整的路径并将视图返回给浏览器

注:

AbstractAnnotationConfigDispatcherServletInitializer 会同时创建 DispatcherServlet 和 ContextLoaderListener 。

GetServlet-ConfigClasses() 方法返回的带有 @Configuration 注解的类将会用来定义 DispatcherServlet 应用上下文中的 bean 。

getRootConfigClasses() 方法返回的带有 @Configuration 注解的类将会用来配置 ContextLoaderListener 创建的应用上下文中的 bean 。

四、信息交互

Ⅰ、传递模型数据到视图中

有时候我们并不只是需要对访问进行转发,同时可能需要携带一些信息给浏览器端,SpringMVC提供了Model类对返回信息进行封装返回:

下面我们在上述controller方法home()返回之前封装信息返回给视图,并从视图中获取到对应的数据:

 

@Controller
public class HomeController {

    @Autowired
    private BaseService baseService;

    @RequestMapping(method = RequestMethod.GET,value = "/home")
    public String home(Model model){

        //往model中放置信息(key,value)
        model.addAttribute("Message","I am HomePage!!!");

        //返回试图名为home的视图
        return "home";
    }
}

修改home.jsp获取目标数据,此处我们使用JSTL标签库获取,所以需要先引入JSTL标签库的jar包:

 

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

home.jsp

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!--引入JSTL标签库,并以c为标签前缀-->
<%@ page isELIgnored="false" %><!--禁用tomcat自带的EL表达式,否则无法获取对应的数据-->
<html>
<head>
    <title>Home Page</title>
</head>
<body>
    <h1>Hello World</h1>
    <!--通过EL表达式获取key为Message的属性值-->
    <c:out value="${Message}"></c:out>
</body>
</html>

测试结果如下:

Ⅱ、接受请求的输入

Spring MVC 允许以多种方式将客户端中的数据传送到控制器的处理器方法中,包括:

  • 查询参数( Query Parameter )。
  • 路径变量( Path Variable )
  • 表单参数( Form Parameter )。

①查询参数形式

我们在controller中编写一个getBean方法,要求接收一个参数,参数名为id,通过拿到的id进行查询,将查询到的基本bean封装到数据模型并返回给视图

 

@RequestMapping(method = RequestMethod.GET,value = "/getBean")
public String getBeanByParam(@RequestParam("id")Integer beanId, Model model){

    BaseBean bean = this.baseService.findBean(beanId);
    //以bean为key将目标对象封装到数据模型
    model.addAttribute("bean",bean);

    //返回试图名为home的视图
    return "showMessage";
}

然后创建一个showMessage.jsp作为目标视图

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>信息主页</title>
</head>
<body>
    <!--判空-->
    <c:if test="${bean==null}">
        <li>bean不存在</li>
    </c:if>
    <c:out value="${bean.id}"></c:out><!--提取目标对象的信息-->
    <c:out value="${bean.name}"></c:out>
</body>
</html>

浏览器访问路径如下:http://locahost:8080/SpringAction05/getBean?id=0

注:其实getBeanByParam(@RequestParam("id")Integer id, Model model)方法中的@RequestParam("id")可以省略不写,如果不写的话,那么访问参数必须与参数位的名称一致,即:http://locahost:8080/SpringAction05/getBean?beanId=0

②表单参数形式

将查询参数通过form表单提交到前端控制器,此时,Spring允许通过对象接收查询参数,要求form表单提交的字段与对象属性字段对应

首先创建一个form表单,表单提交到/getBean

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<form action="./getBean" method="post">
    提交id:<input name="id" type="text"/><br>
    <button type="submit">提交</button>
</form>
</body>
</html>

Contorller接收参数(以对象形式):

 

@RequestMapping(method = RequestMethod.POST,value = "/getBean")
public String getBeanByForm(BaseBean baseBean, Model model){

    BaseBean bean = this.baseService.findBean(baseBean.getId());

    model.addAttribute("bean",bean);

    //返回试图名为home的视图
    return "showMessage";
}

浏览器访问结果如下:

 


③路径变量方式

 

SpringMVC可以通过@PathVariable从路径中提取参数变量:

 

@RequestMapping(method = RequestMethod.GET,value = "/getBean/{id}")//指定getBean/后的参数位id参数占位
public String getBeanByPath(@PathVariable("id") Integer id, Model model){//通过@PathVariable注解提取变量
    BaseBean bean = this.baseService.findBean(id);

    model.addAttribute("bean",bean);

    //返回试图名为home的视图
    return "showMessage";
}

访问结果如下:

转发此文关注我添加小助手VX:xuanwo008咨询如何获取java技术干货、面试资料

《Spring Web Flow 实践》 《Spring Web Flow 实践》在《Spring In Action》这本书上的第八章介绍了Spring Web Flow的相关知识。在《Spring In Action》这本书上是这样介绍的:Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序。比较典型的例子就是电子商务站点的结账流程,从购物车开始,应用程序会引导用户依次经过派送详情、账单信息以及最终的订单确认 阅读详情

相关推荐

【Spring Boot】Web开发 — Web开发简介

Spring Boot自带的spring-boot-starter-web组件为Web应用开发提供支持,它内嵌的Tomcat以及Spring MVC的依赖使用起来非常方便。Spring Boot创建Web应用非常简单,先创建一个普通的Spring Boot项目,然后修改pom.xml文件将spring-boot-starter-web组件加入项目就可以创建Web应用。我们使用IDEA编辑器打开新创建的Web项目。

衍生星球的博客 3545

SpringWeb(SpringMVC)详解

SpringWeb(SpringMVC)详解

weixin_71243923的博客 6485

NFS共享速度慢?麒麟系统性能调优5个关键参数实测对比

本文针对银河麒麟服务器系统上NFS共享速度慢的问题,通过实测对比分析了五个关键调优参数。重点探讨了rsize/wsize传输块大小、TCP/UDP协议选择、sync/async模式权衡等,并结合麒麟系统特性提供了具体的优化建议与配置示例,旨在帮助用户有效提升国产化环境下的文件共享性能。

weixin_29254029的博客 332

Spring框架——springweb(一篇包会)

本篇是有关spring框架中有关springweb部分知识的详细介绍。

2301_78341216的博客 3655

嵌入式C开发必备:用Cursor规则搞定代码风格检查(附Pikachu项目实战)

本文以Pikachu开源项目为例,详细介绍了如何利用Cursor的AI代理规则系统,为嵌入式C开发项目配置一套完整的代码风格检查与规范执行方案。通过实战演示,指导开发者创建项目级规则,实现命名、格式、硬件抽象层及驱动开发的自动化规范,从而提升代码一致性、可维护性和团队协作效率。

weixin_29181861的博客 597

手把手搭建摄像头驱动(一):I2C设备树插件与OV5640实战

本文手把手指导如何搭建OV5640摄像头驱动,重点讲解I2C设备树插件的编写与实战应用。通过硬件连接验证、I2C驱动框架搭建、设备树插件编译及动态加载调试,系统介绍Linux驱动开发全流程,并提供常见问题解决方案,帮助开发者快速掌握摄像头驱动开发技术。

git9versioner的博客 754

spring-web 网络开发

spring-web & spring-mvc & jetty & servlet

懒猫的脚印 4761

【26美赛A题】2026美赛数学建模(MCM/ICM)思路解析及代码分享

本文介绍了2026年美赛数学建模A题的解题思路与方法。A题通常属于连续型系统问题,重点在于构建可解释的机理模型,通过将现实机制转化为动态方程进行仿真预测。文章提出了通用建模路线,包括机理抽象、模型假设、动态建模、参数识别、系统仿真和情景预测六个阶段。专栏将提供从机理到方程的系统建模思路、参数标定方法、Python/Matlab实现代码以及高分论文模板。内容适合参加2026美赛A题、偏重物理/工程建模方向的参赛队伍,旨在提升机理建模能力。后续将更新完整题解和源码。

一键难忘的博客 2004

Springweb详解

RestController //表示此类由spring创建管理@RequestMapping(path = "/loginCtl") //为类定义一个映射地址@Autowired//方便的注入其他对象//为方法定义映射地址,设置该方法允许哪些请求方式访问,可以方便接收请求中的参数//可以直接将返回的对象,自动转为json字符串。

qq_45576281的博客 3192

【数据集8】全球人口数据WorldPop详解

全球人口数据WorldPop详解

WW、forever的博客 7877

系统架构设计师重难点知识脑图

大家都知道现在的软考自从变成机考后,越来越难了,教程上的内容不仅全还细,几乎任何内容都有可能考,出题老师主打一个出其不意,比如2024年5月考试,连UML时序图的片段都考,这。软件工程、系统架构基础知识、系统质量属性与架构评估、软件架构的演化和维护、信息系统架构设计、层次式架构设计、云原生架构设计、面向服务架构设计、安全架构设计、大数据架构设计等。所以对于教程上的任何知识点,都需要去记忆。因此我在这里制作了一个脑图,将所有知识点集中在一个脑图中,通过首词组句法,记忆背诵,通过一个个的展开节点,加强记忆。

分享技术干货和灵感、推荐新书和好玩的项目、分享Java面试题 1100

SpringWeb

SpringWeb 是 spring 框架中的一个模块,基于 Servlet API 构建的 web 框架. springWeb 是 Spring 为 web 层开发提供的一整套完备的解决方案。在 web 层框架历经 Strust1,WebWork,Strust2 等诸多产品的历代更选之后, 目前业界普遍选择了 springWeb 作为 Java EE 项目 web 层开发的首选方。

2301_78085386的博客 1759

北斗导航 | 卫星/惯导组合导航方法

从组合导航结构方面来讲,卫星/惯导(下文以GPS/INS)组合模式一般分为三种,即松组合、紧组合和超紧组合(即深组合)。

尘世冰封的专栏 1533

Spring整合Web环境

我们能想到的 Spring 框架自然也会想到,Spring其实已经为我们定义 好了一个ContextLoaderListener,使用方式跟我们上面自己定义的大体一样,但是功能要比我们强百倍,所以 ,遵循Spring “拿来主义” 的精神,我们直接使用Spring提供的就可以了。Spring容器也重复被创建了,不能每次想从容器中获得一个Bean都得先创建一次容器,这样肯定是不允许。如果需要使用这种方式封装框架,还需要考虑上述代码有多处写死的部分,及其冗余,最好定义一个工具类进行封装。

m0_62943934的博客 1565

自动驾驶---Planning模块详细介绍(以Apollo为例)

主要介绍高速场景下Planning模块,至于低速的泊车场景对比高速场景或者城区场景有比较大的差距(后面也会介绍泊车场景),本篇Planning介绍主要包括三大子模块Routing,Behavioural Planning以及Motion Planining,并且对比较重要的Decider和Optimizer都做了通俗化的说明供大家思考,以便于后续理解更深入的内容,后面有时间会再开一些篇幅对这些模块进行更加深入的讲解。

智能汽车人的博客 2084

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring:spring-webmvc和spring-web有什么区别

spring-webmvc和spring-web有什么区别区别工程结构差别spring-webspring-web-mvc <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.1.2.RELEASE</version> </dependency&

非著名JAVA程序员的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring理论知识(Ⅴ)——Spring Web模块

Spring由20个核心依赖组成,这20个核心依赖可以分为6个核心模块 众所周知,Java目前最大的一个用途就是作为Web应用的服务端(Java Web)Spring又是JavaEE中使用最广泛的开发框架,所以Spring的Web模块的重要性,不言而喻Spring Web模块是Spring框架的重要组成部分,主要用于构建基于HTTP协议的Web应用程序,尤其是RESTful服务。它提供了对Web开发的支持,包括处理HTTP请求、响应、会话管理等,是开发现代Web应用和服务的核心模块之一。Spring

敢问路在何方,路在脚下 1306

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Spring Webflux对比Spring Web有何优点

原创于 【模棱博客】 Spring Webflux和Spring Web是两个完全不同的Web栈。 然而, Spring Webflux继续支持基于注解的编程模型 使用这两个堆栈定义的端点可能看起来相似,但测试这种端点的方式是相当不同的,写这样一个端点的用户必须知道哪个堆栈处于活动状态并据此制定测试。 样品端点 考虑一个基于示例注释的端点: import org.springframe...

【模棱博客】 – Java技术博客 1万+

【JavaEE】Spring Web MVC

Spring MVC简介,以及@RequestMapping注解讲解,Postman介绍

yj20040627的博客 8756

Spring集成Web

Spring集成web

逐梦苍穹的博客 1235

(七)Spring Web

Spring Web 是一个强大的 Web 开发框架,支持从传统的 Servlet 基础的 Web 应用程序到响应式和异步的现代 Web 应用程序。它通过 Spring Web MVC、Spring WebFlux 和 Spring REST 等模块,提供了构建高效、灵活和可维护 Web 应用程序所需的所有工具。

qq_50847694的博客 834

Spring Boot 中的 Web 应用与 Reactive Web 应用

Spring Boot 应用类型自动检测机制 📊 Spring Boot 在启动时会自动检测应用类型: 1️⃣ 检查类路径依赖: 发现spring-webmvc → 传统Web应用 发现spring-webflux → Reactive应用 2️⃣ 根据检测结果配置: ✔️ Web应用:默认启用Tomcat ✔️ Reactive应用:默认启用Netty ✔️ 二者共存时优先Web应用 3️⃣ 关键差异: 🔹 Web应用使用Servlet线程模型 🔹 Reactive应用采用事件循环模型 (注:系统准

Yqha1的博客 1644

Spring学习笔记之Spring Web Flow

Spring Web Flow 是Spring MVC 的扩展,它支持开发基于流程的应用程序。它将流程的定义与实现流程行为的类和视图分离开来。

薛小强Forever 8619
上一篇: 看好了,这才是递归的正确打开方式
下一篇: 一条java入门到进阶成神之路
java架构学习基地
博客等级 码龄6年 8粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值