Spring MVC 是什么?与 Struts 的区别是什么?

news2024/11/25 5:44:15

Spring MVC是Spring框架中的一个模块,它提供了一种基于MVC(Model-View-Controller)架构的Web开发方式。与传统的JSP/Servlet开发方式相比,Spring MVC更加灵活、高效,可以帮助开发人员快速构建高质量的Web应用程序。本文将详细介绍Spring MVC的概念、特点以及与Struts的区别,并附上代码示例。

在这里插入图片描述

一、Spring MVC是什么?

Spring MVC是Spring框架中的一个模块,它提供了一种基于MVC架构的Web开发方式,可以将Web应用程序划分为三个部分:模型、视图和控制器。其中,模型用于封装数据,视图用于展示数据,控制器用于处理用户请求,并将模型数据传递给视图进行展示。

Spring MVC的工作流程如下图所示:

在Spring MVC中,用户请求首先会被DispatcherServlet拦截,DispatcherServlet会根据请求的URL和配置的HandlerMapping,选择合适的Controller进行处理。Controller会处理请求,并将处理结果封装到ModelAndView对象中,然后返回给DispatcherServlet。DispatcherServlet会根据配置的ViewResolver,选择合适的View进行展示,并将ModelAndView中的模型数据传递给View进行展示。

二、Spring MVC的特点

灵活性高

Spring MVC提供了丰富的配置选项,可以根据不同的需求进行配置。例如,可以选择不同的视图解析器、处理器映射器、处理器适配器等,以适应不同的开发需求。同时,Spring MVC也支持多种视图技术,包括JSP、Thymeleaf、FreeMarker等,开发人员可以根据自己的习惯和技能选择合适的视图技术。

易于测试

Spring MVC的控制器是一个普通的Java类,可以通过JUnit等测试框架进行单元测试。开发人员可以轻松地编写测试用例,测试控制器的处理逻辑是否正确,从而提高开发效率和代码质量。

高效性能

Spring MVC采用了基于注解的处理方式,可以将请求和处理方法进行直接映射,避免了繁琐的XML配置。同时,它也采用了多线程和异步处理等技术,可以提高Web应用程序的性能和响应速度。

安全性高

Spring MVC提供了多种安全性控制选项,可以保护Web应用程序免受各种攻击。例如,可以使用Spring Security框架进行身份验证和授权管理,还可以使用CSRF(Cross-Site Request Forgery)防范机制防止恶意攻击。

三、Spring MVC与Struts的区别

设计思想不同

Spring MVC采用了依赖注入和面向切面编程等设计思想,将各个模块解耦,并提供了更加灵活的配置选项。而Struts则采用了MVC设计模式,将应用程序划分为三个部分:模型、视图和控制器,通过配置文件进行控制。

配置方式不同

Spring MVC采用了基于注解的配置方式,可以避免繁琐的XML配置,提高了开发效率。而Struts则采用了XML配置方式,需要编写大量的XML配置文件,增加了开发难度。

处理方式不同

Spring MVC采用了基于方法的处理方式,将请求映射到处理方法上,可以更加灵活地处理请求。而Struts则采用了基于Action的处理方式,需要编写大量的Action类,增加了代码量和维护难度。

性能差异

Spring MVC采用了多线程和异步处理等技术,可以提高Web应用程序的性能和响应速度。而Struts则采用了同步处理方式,性能较低。

下面是一个使用Spring MVC的示例代码:

配置文件:web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" 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">
    <display-name>Spring MVC Example</display-name>
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

在上面的示例中,配置了DispatcherServlet,并指定了配置文件的位置。DispatcherServlet是Spring MVC的核心组件,用于拦截用户请求,根据配置的HandlerMapping选择合适的Controller进行处理,并将处理结果返回给客户端。

配置文件:spring-config.xml

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

    <!-- 配置Controller -->
    <context:component-scan base-package="com.example.controller" />

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

    <!-- 配置静态资源处理器 -->
    <mvc:resources mapping="/static/**" location="/static/" />

    <!-- 配置消息转换器 -->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/plain;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
        </mvc:message-converters>
    </mvc:annotation-driven>

</beans>

在上面的示例中,配置了Controller、视图解析器、静态资源处理器和消息转换器等。其中,Controller使用了基于注解的处理方式,可以通过@RequestMapping注解将请求映射到处理方法上。视图解析器用于解析视图名称,将视图名称转换为实际的视图。静态资源处理器用于处理静态资源,例如CSS、JavaScript等。消息转换器用于将请求和响应中的消息转换为Java对象或JSON格式的数据。

控制器:HelloController.java

@Controller
public class HelloController {

    @RequestMapping("/hello")
    public ModelAndView hello(){
      ModelAndView modelAndView = new ModelAndView();
      modelAndView.addObject("message", "Hello, Spring MVC!");
      modelAndView.setViewName("hello");
      return modelAndView;
    }

}

在上面的示例中,定义了一个HelloController,使用了@Controller注解标识该类为控制器。使用@RequestMapping注解将请求映射到/hello路径上,处理方法返回一个ModelAndView对象,其中添加了一个名为"message"的属性,值为"Hello, Spring MVC!“,并将视图名称设置为"hello”。视图名称会被解析为/WEB-INF/views/hello.jsp,最终展示给用户的是该JSP页面中的内容。

视图:hello.jsp

<!DOCTYPE html>
<html>
<head>
    <title>Hello, Spring MVC</title>
</head>
<body>
    <h1>${message}</h1>
</body>
</html>

在上面的示例中,定义了一个JSP页面,其中使用了EL表达式${message},用于展示Controller中添加的"message"属性。

小结

通过上面的示例,可以看出Spring MVC的基本用法。Spring MVC提供了丰富的配置选项,可以根据不同的需求进行配置。同时,它也采用了多种技术,例如基于注解的处理方式、多线程和异步处理等,可以提高Web应用程序的性能和响应速度。与Struts相比,Spring MVC更加灵活、高效、易于测试和安全。开发人员可以根据自己的需求和技能选择合适的Web框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue diff算法与虚拟dom知识整理(10) 梳理patch处理相同节点比较的基本逻辑

这次 我们来讲 diff算法处理到 当新旧节点 是同一个节点时的处理 我们之前也说过 如果不是同一个节点 他就会暴力拆旧 把新的插上去 但当他们是同一个节点 需要精细化比较 最做小化更新 这块我们还没有处理 打开我们的案例 打开 patch.js 对应其实就还是这一块还没有写 我们…

PostgreSQL查询引擎——transform expressions之AEXPR_OP

static Node *transformAExprOp(ParseState *pstate, A_Expr *a){Node *lexpr a->lexpr; Node *rexpr a->rexpr; // 操作符左右表达式Node *result;/* Special-case "foo NULL" and "NULL foo" for compatibility with standards-broke…

Bug——后端返回LocalDateTime类型数据中间出现一个T

错误如下图所示: 返回的JSON格式数据里面会有一个多出来的T. 解决方案&#xff1a; 在后端的POJO层的实体类的LocalDateTime属性上面加上一个注解 JsonFormat(pattern"yyyy-MM-dd HH:mm:ss") 如下所示&#xff0c;然后在返回JSON格式数据时就不会出现那个多余的T了…

C++之模板初阶

目录 前言 1.泛型编程 2.模板 2.1 函数模板 2.1.1 函数模板概念 2.1.2 函数模板格式 2.1.3 函数模板的原理 2.1.4 函数模板的实例化 2.1.5 模板参数的匹配原则 2.2 类模板 2.2.1 类模板定义模式 2.2.2 类模板的实例化 前言 我们会不会有疑惑为什么C语言中&#xf…

Python学习笔记——cmeans模糊聚类例程

文章目录 模糊聚类应用简介安装环境demo&#xff1a;运行结果 模糊聚类应用简介 模糊聚类即通过模糊数学&#xff08;处理模糊或不确定性信息的数学方法&#xff09;的相关算法进行聚类分析任务。 常用的模糊聚类算法包括模糊C均值聚类&#xff08;FCM&#xff0c;Fuzzy-c mea…

TryHackMe-Red Team Capstone Challenge (红队挑战)【真实红队模拟】

Red Team Capstone Challenge 注意&#xff1a;我不会在这里提及相关的flag&#xff0c;只专心打&#xff1b;flag可以自己用各个hostname尝试一遍 挑战作者的一句话 这个房间被评为坚硬&#xff0c;但因为它是你前面的一座山&#xff0c;它可能被评为疯狂。但是&#xff0c;…

【Vue3】滑动验证组件 | 滑动验证

前言 滑块验证不只判断是否滑动到尾部&#xff0c;真正的目的是检测用户行为&#xff0c;检测行为是人为、脚本、还是其它。 防止使用脚本大量注册、请求等 。比如发送请求时&#xff0c;判断用户在某个页面停留了多长时间。登录、注册时是否点击了登录、注册按钮&#xff0c;…

Lesson1——数据结构前言

前言&#xff1a; 今天我们正式开始一个新的专栏——初阶数据结构&#xff08;C语言实现&#xff09;&#xff0c;本专栏后续持续更新时间复杂度空间复杂度、顺序表、链表、栈和队列、二叉树、排序等算法的相关知识&#xff0c;欢迎大家互相学习&#xff0c;可以私信互相讨论哦…

一次oracle环境 enq: TX - allocate ITL entry锁问题分析

enq: TX - allocate ITL entry锁问题分析 通过分析问题时间段两个节点的AWR报告&#xff0c;TOP1等待为锁竞争enq: TX - allocate ITL entry&#xff0c;该等待事件是由于缺省情况下创建的表的INITRANS参数为1,索引的INITRANS参数值为2.当有太多的并发DML操作的数据行处于相同的…

日志模块封封装:单例模式+策略模式+构建者模式+bugly

日志模块封封装:单例模式策略模式构建者模式bugly 一.单例模式策略模式构建者模式二.日志模块封装1.日志等级&#xff1a;LoggerLevel枚举类2.日志输出类型&#xff1a;LoggerType枚举类3.ILogger接口4.LogCatLogger/FileLogger/NetWorkLogger/EmailLogger5.使用构建者模式创建…

相同格式相同分辨率图片不同大小分析

1、问题 有三张图片&#xff0c;如下&#xff1a; 这三张图片均为jpg格式&#xff0c;分辨率均为1851*580&#xff0c;肉眼看不出区别。但是大小不同。 2号为217KB&#xff0c;4号为1.15MB&#xff0c;5号为1.06MB。 我们看下常规信息&#xff0c;先看2号&#xff1a; 可以…

初识Linux:第五篇

初识Linux&#xff1a;第五篇 初识Linux&#xff1a;第五篇1.Linux下的用户2.Linux权限管理2.1文件权限管理2.2文件权限的更改2.21改变文件访问权限属性2.22改变文件的身份 3.三个问题 总结 初识Linux&#xff1a;第五篇 &#x1f601;本篇主要介绍Linux权限的相关知识&#x1…

vue+elementui+nodejs高校校园在线打印预约系统

在线提交文档进行打印 首页简单介绍系统 语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 顶部或主页按钮转到打印 用户可以登录 查看历史打印记录 用户分学生和非学生 学生可以享有优惠…

基于.NetCore开源的Windows的GIF录屏工具

推荐一个Github上Start超过20K的超火、好用的屏幕截图转换为 GIF 动图开源项目。 项目简介 这是基于.Net Core WPF 开发的、开源项目&#xff0c;可将屏幕截图转为 GIF 动画。它的核心功能是能够简单、快速地截取整个屏幕或者选定区域&#xff0c;并将其转为 GIF动画&#x…

编写 ROS 消息发布订阅器(五)

执行命令&#xff0c;指定目录添加cpp文件 cd ~/catkin_ws/src/beginner_tutorials如果没有src目录&#xff0c; 就自己创建一个目录叫src cd src/ vim talker.cpp 复制代码粘贴&#xff1a; #include "ros/ros.h" #include "std_msgs/String.h" int m…

C++/R 期末冲刺3h

C 1. 基础程序 #include "iostream" // C头文件 #include "stdio.h" // C 头文件 //using namespace std; // 命名空间// main() 是程序开始执行的地方int main() {std::cout << "Hello, World!" << "\n";return 0; …

【数据结构】线性结构 之 顺序表

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;数据结构与算法 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 前言 顺序表概念及结构 静态代码实现&#xff1a; 动态代码实现&#xff1a; SeqList.h文件 SeqLi…

使用VitePress和Github搭建个人博客网站,可以自动构建和发布

之前我们写过一篇关于如何自动构建和发布个人博客的文章&#xff0c;当时是使用VuePress和GitLab。GitLab持续集成部署CI/CD初探&#xff1a;如何自动构建和发布个人前端博客 现在换了Vue3和Vite&#xff0c;使用VitePress在Github上又搭建了一个博客。博客地址&#xff1a; …

博弈Ai官网ChatGPT能力真实测评

链接&#xff1a;https://chat.bo-e.com/&#xff08;基于ChatGPT4和3.5研发的智能聊天机器人国产镜像&#xff09; 一&#xff0c;博弈Ai的UI设计样式 1、博弈Ai&#xff08;ChatGPT&#xff09;白天模式 2、博弈Ai&#xff08;ChatGPT&#xff09;黑天模式 3、博弈Ai&#x…

五、c++学习(加餐1:汇编基础学习)

经过前面几节课的学习&#xff0c;我们在一些地方都会使用汇编来分析&#xff0c;我们学习汇编&#xff0c;只是学习一些基础&#xff0c;主要是在我们需要深入分析语法的时候&#xff0c;使用汇编分析&#xff0c;这样会让我们更熟悉c编译器和语法。 从这节课开始&#xff0c…