首页 > 自考资讯 > 高考百科

spring(springer link)

小条 2024-10-14

8698af04cdd94b6b8c4a659404903fb4~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1729512520&x-signature=YKGzkQC27U46rmLdCUlqRo3RbLs%3D

Spring

Spring业务层框架springmvc表现层框架mybatis/hibrnate持久层框架

什么是Spring

Spring 是一个用于轻量级IOC 和AOP 容器的开源框架,鼓励您以最少侵入性(可以理解为耦合)的方式管理应用程序中的代码。

IOC

概念

控制反转控制:对象的创建和管理反转:对象的控制从程序员转移到框架

核心目的

让Spring管理对象

优点

单例减少了耦合(类之间的依赖性)。

IoC核心容器

顶层接口BeanFactory和ApplicationContext的区别

构建核心容器时,会立即创建对象。换句话说,该对象适合BeanFactory。在构建核心容器时,对象使用延迟加载方法。即,通过ID 指定何时检索和创建对象。

ApplicationContext常用实现类

ClassPathXmlApplicationContext

读取类路径下的配置文件。

FileSystemXmlApplicationContext

读取计算机上任何位置的配置文件

当使用新的注释+配置类而不是XML配置文件时使用

AnnotationConfigApplicationContext

IOC创建对象方式

无参构造器

在Spring 配置文件中使用bean 标签进行配置

bean标签的属性

id

创建的对象名称

class

您需要管理的类的完整路径

静态工厂

条件:需要工厂类并且工厂类必须具有静态方法

配置文件语法

当在spring容器上调用getBean方法时,会创建一个工厂类对象,并执行工厂类的方法返回需要的对象,并将其放置到spring容器中。

实例工厂

条件:需要一个工厂类,并且该工厂类必须具有常规方法。

配置文件语法

您必须首先创建工厂对象,然后调用工厂中的常规方法。

DI(依赖注入)的方式

setter注入

条件:属性必须具有setter 方法

bean标签下标签

name:属性名称value:属性值,对于基本类型和String类型ref:对于对象类型,指向bean标签的id属性值

复杂注入(map、list、[]…)

list类型语法

@RequestMapping('/listEmp')public String ListEmp(ModelMap modelMap) { 列表list=empMapper.listEmpDept() return 'emplist' }

数组类型与list类型类似只是没有ref标签

map类型

properties类型

有参构造器注入

条件:需要施工人员

bean标签下标签

name attribute:属性名称value:值(对于基本类型)和Stirng ref:对于对象类型

p名称空间注入

问题产生条件:配置文件中必须导入p命名空间(Spring提供)。由于底层还在设置,所以属性还需要一个setter方法。

IOC三种开发方式

手动配置方式

bean标签:在配置文件中用bean标签配置一个类

id属性:用于命名对象Class属性:用于写入实体类的全路径名,用于反射

scope属性

singleton

proyotype

request

session

globle-session

010-1 010

对象销毁时机

name 属性:类值的属性名称:定义常规成员变量的值。 ref:如果一个类引用了另一个类的对象,则必须使用该属性。 ***注意:要在配置文件中设置属性的初始值,必须为该属性提供setter方法。

singleton

专门用于给列表集合类型的成员变量赋值。

proyotype

11

若需要给一个类中的成员变量赋初始值则需要在bean标签中定义property子标签

半自动配置方法主要使用注解来实现类之间的依赖关系。

property子标签

@Autowiredprivate EmpDAO empDAO; ***注意:为了效率,Spring框架在扫描类时默认不扫描注解,所以默认情况下只有Autowired注解必须在配置文件中配置。

格式

基本上就是用@Component注解类,并在配置文件中设置需要扫描的包。全自动配置模式还设置私有成员变量。无需提供setter 方法。反射自动打开权限并强制访问*** 注意:如果通过一个类型匹配多个实现类,则会出现错误。解决方案是在引用类型上添加@Qualifier('')注解来指示需要的类。

半自动配置方式

组件:类无法拆分时存储库:常用于标记DAO层或数据库操作层服务:业务层控制器:控制层/表示层(springmvc替代servlet) **上面有四个注解,分别对应不同的场景:已定义类的单个实例和多个实例。

类的对象还是需要手动配置,但类的依赖关系用注解@Autowired自动实现,例如A类中引用了B类,在配置文件中用bean标签配置A,在A中用注解标记引用的B

请注明处置方法

全自动配置方式

请指定初始化方法

四个创建对象的注解

PreDestory

用于基本数据类型和字符串类型

PostConstruct

该注释由Spring 框架提供。如果没有找到,使用Qualifier注解会报错。指示应用哪个注释。

三个依赖注入的注解

该注解由JDK提供,首先按名称搜索。如果未指定名称,则设置名称@Resource(name='name')。如果没有找到,则在最后按类型搜索。

Value

创建一个类并为其添加新的注释,以使该类具有与application.xml 相同的功能

Autowired

需要注解表名的类是配置类,但其本质功能并不是将其标记为配置类,添加此注解会导致该类中的所有方法都被代理。该方法将与原始方法完全相同,从而保证对象的生命周期和作用域。在这个类上使用bean注解很容易,不需要添加这个注解。使用AnnotationApplicationContext 从容器中检索对象也很容易。但是,如果该类中创建对象的一个方法调用了另一个方法,则该对象会被多次创建,因为创建该对象时使用了另一个方法,并且不能保证该对象是单例的。也就是说,范围不受保证。

Resource

这个注解告诉Spring在创建容器时应该扫描哪些包属性值。这与XML 配置文件中标记上的BasePackage 属性具有相同的效果。

spring新注解

用于注释配置类中的方法,并将方法的返回值对象存储在Spring容器中。 name 属性用于定义bean 的ID。如果未指定,则键默认为方法名称。存储在容器集合中,值是对象详细信息。当您使用注释配置方法时,如果该方法有参数,Spring会自动联系容器以查看是否有可用的bean。搜索方法是一样的。目前,ClassPathXmlApplicationContext不再用作@Autowired注解方法,而是将AnnotationConfigApplication传递给配置类的类对象。

@Configuration

@ComponentScan

通过IO 读取配置文件并使用反射创建对象:class.forName(配置文件中的完整路径名) 对于全自动模式,通过IO 读取配置文件并读取包。然后使用IO扫描这个包下的所有类(包括子包)。如果扫描的类标有Component 注释,则会创建该类的对象。否则,重点是反射+IO。

@Bean

扫描所有成员变量。如果成员变量有自动注入注解,它会从自己的容器中搜索要注入的对象,如果找到相应的对象,则直接暴力破解该值。如果发现则报告错误

原理

如何创建对象

项目主入口

如何管理依赖关系

Junit 集成main 方法。在运行时,invoke 执行方法来确定测试类是否具有用@Test 标记的方法。

spring整合junit

运行测试方法时,junit 不知道是否使用了框架,因此在执行过程中不会通过配置文件或配置类创建Spring 容器。因此,使用junit进行测试时,会出现以下问题:如果您没有Spring 容器,则使用Autowired 方法没有任何效果。

在spring下junit的问题

junit --- 导入集成spring-test.jar的spring jar包。使用junit提供的注解来告诉Spring容器是否应该运行,方法是将原来的main方法替换为spring自己的main@RunWith(SpringJUnit4ClassRunner.class)。spring和ioc都是基于xml或者注解创建的,用来表示位置。 @ContextConfiguration---使用位置属性。除了xml 文件的位置之外,还指定classpath 关键字以指示该文件位于类路径上。 classes 属性:指定配置类的位置。如果使用spring5.x版本,junit版本必须是4.12或更高版本。

junit单元测试中没有main方法也能执行

junit不会管我们是否用框架

开发效率高

整合思路

每个请求都会更新整个页面。如果页面数据量较大、用户设备较旧、或者网速较慢,就会出现页面卡顿、交互效果降低的情况。

开发模式

当您有多个前端页面(例如移动、计算机和iPad 版本)时,编写多个控制层很困难。

jsp开发模式

后台始终响应数据(json 格式),但不响应页面。前端使用前端语言和后台网络接口来接收数据并显示。

执行效率与交互效果低

不灵活,解决多端变化问题较难

只需要编写后端即可,不同的前端与后端的交互方式不同。

前后端分离

开发效率低在开发前后端分离的开发模式之前,首先要设计文档,指定后端和前端所需的接口和参数的标准格式。这样可以更轻松地同时开发前端和前端,并减少前端调用后端接口时出现问题的机会。

优点

灵活,易于解决多端变化问题

缺点

相同协议、相同IP、相同端口号

跨域问题跨域带数据

创建一个虚假网站,将银行网站http://mybank.com 嵌入iframe 中。 调整iframe 的宽度和高度以适合整个页面,以便除域名之外的所有内容都与您银行的网站相匹配。 当用户输入帐户密码时,我们的主网站可以跨域访问http://mybank.com dom 节点,并可以检索用户的帐户密码。

同源策略

当来源不同时,一台服务器向另一台服务器发送ajax请求,浏览器默认禁止这种请求,从而导致跨域错误。

同源

DOM 同源策略:禁止对不同源页面 DOM 进行操作。这里主要场景是 iframe 跨域的情况,不同域名的 iframe 是限制互相访问的。

XMLHttpRequest 同源策略:禁止使用 XHR 对象向不同源的服务器地址发起 HTTP 请求。

解决方案

1. 设置后台允许接受跨域请求

在后端设置响应头

或者通过注解设置

XHR 本机对象withCredentials 用于跨域请求。 false 如果请求跨域,这个数据可移植的跨域模式必须设置为Open**才能承载数据。

通过拦截器设置

在拦截器类上设置响应标头。 response.setHeader('Access-Control-Allow-Credentials', 'true');

2. 设置前端允许跨域请求携带数据

在前端页面设置xhr对象的属性

3. 后台允许跨域请求携带数据

DataSourceTransactionManager实现类主要用于dbutils和jdbcTemplate封装jdbc。这个实现类是一个方面类。

spring事务管理

事务隔离级别事务超时事务是否只读事务传播行为

API方式/硬编码

检查当前事务是否完成。 检查是否是新交易。检查是否已回滚。

PlatformTransactionManager 平台事务管理器 是一个接口 定义了开启事务、提交事务、回滚的方法

这个配置文件中的方法实际上是API的封装。

TransactionDefinition:定义事务参数的接口

交易包spring-tx.jar

TransactionStatus:事务运行状态接口

AOP联盟Aspectsj.jar spring-aspects.jar

声明式/配置文件式

jar包

事务依赖包

详细信息:必须为事务设置一些事务参数:只读、超时、是否在标签上设置传播行为(标签),设置此标签必须用于。交易参数是否应留空并仅保留默认值。

步骤

确定切面类即配置事务管理器

aop:advisor 使用标签设置切面类,标签设置切入点,使用事务作为切入点

用标签配置DataSourceTransactionManager类,该类需要一个数据源用ref属性配置

配置声明事务即切面

配置织入

核心控制器路径。如果这里的URL模式是/,则表示将包含除jsp文件之外的所有请求。 /* 包含jsp核心控制器创建时序。核心控制器所需的配置文件

ssm整合

当服务器启动时,侦听器通过配置文件初始化Spring 容器并实现IOC。配置监听器实现IOC时,必须配置以下全局配置参数:

在web.xml中配置

该参数指向Spring配置文件(该配置文件用于集成Spring和mybatis)。侦听器加载配置文件并在配置文件中创建数据源、对象和映射器扫描器。

配置核心控制器

mybatis.xml(可选),settings和typeAliases通常配置在此文件下,但也可以在配置sqlFactoryFactoryBean时配置别名。

配置监听器

数据源(德鲁伊)

配置全局参数

数据来源

持久层(dao)

applicationContext-dao.xml

配置sqlSession 工厂时,使用属性标记将name 值设置为mapper,将Locations 值设置为classpath:com/wxs/mapper。这样你就可以扫描任何路径。解决项目下的文件和接口不在约定路径的问题。

sqlSessionFactory

底层mapper接口仍然必须来自sqlSession,所以用这个bean标签配置sqlSessionFactoryBean。配置需要扫描的包。

别名

配置mapper扫描器

事务包扫描器(主要针对@Service注解)

mapper扫描器

业务层

applicationContext-service.xml

处理器适配器和处理器映射器的最新驱动程序配置主要用于@Controller 注释的包扫描器

web层(有mvc支持)

Setter 模式下的前缀和后缀插入异常处理程序、文件解析器和拦截器

springmvc.xml

Spring容器(配置文件)和springmvc容器(配置文件)存在父子容器关系,这两个容器内只能显示一个标签加载文件,子容器无法显示加载的配置文件您可以访问它。父容器和父容器Container无法访问子容器加载的文件

注解驱动版本

AOP,通常称为面向方面,是面向对象的补充,它抽象和封装与业务无关但影响多个对象的公共行为和逻辑,以便可以重用。名为“方面”,

减少了系统中的重复代码,降低了模块之间的耦合度,同时提高了系统的可维护性。使用动态代理提取常见内容并根据需要插入。除了代码之外,还可以扩展源代码。最底层是动态代理。扩展目标类的功能。

视图解析器

***父子容器关系

缺点:要扩展的方法的类必须继承。

AOP

缺点:除了扩展方法外,还必须实现该接口下的其他方法。

对目标类方法进行加强的方式

继承

需要接口,但可以指定扩展方法,不需要实现所有方法。

装饰者模式

参数列表:与目标对象相同的类加载器、目标类的所有接口、扩展类(可以自定义扩展类实现InvlcationHandler接口并重写其内部方法,也可以直接调用匿名内部方法这里的InvocabularyHandler 可以是一个匿名内部类,它实现了定义了扩展逻辑的内部调用方法。 (通过))我们已经知道该方法所需的所有代理方法参数)。

动态代理模式

proxyperson.run(); //该方法执行时,run的内容作为该方法的扩展返回值返回,返回的内容为最终值。通过判断if-else中的方法名,而不是需要扩展的方法的返回值来扩展指定的方法。

JDK

不需要接口,可以指定扩展方法,但代码量比较大

Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 返回一个指定接口的代理类实例

这种代理模式使用拦截器和过滤器来继承和扩展目标类的方法。

细节

CGLIB

CGLIB原理

要确定目标类(要剪切的类,即需要扩展的类),需要定义一个入口点。这里的入口点是所需的方法。对于Knife,您必须定义扩展方法编织配置,并在执行前、执行后、异常和最终执行入口点指定扩展方法。配置文件

AOP的三种方式

自由式

使用标签进行配置在入口点之前介入是指在需要扩展的方法(执行前记录)之前介入其他业务逻辑(例如打印等操作)。原始方法。

步骤

在原始方法执行后通过标签设置干预扩展方法。

织入时机

public void log(ProceedingJoinPoint joinPoint) { System.out.println('打印日志'); try { joinPoint.proceed(); } catch (Throwable throwable) { throwable.printStackTrace() } ('打印日志')要使用; } 标记进行设置,您必须将参数传递给扩展方法(ProceedingJoinPoint 类型的对象)。该对象包含必须由目标类扩展的方法。扩展method()方法相当于调用原来的方法。要实现环绕干预,您必须在此方法之前和之后编写自己的业务逻辑。

前置增强

当原始方法发生异常时,使用标签设置进行干预。这通常用于处理数据库事务。

标签中配置的

后置增强

将在需要扩展的方法成功返回后执行。

环绕增强

异常增强

定义一个切面类并让它实现特定的接口(5种编织机会) 确定目标类(要介入的类)并确定其切入点切面类(扮演对象的类)(确定)干预角色)配置文件

最终增强

定义的方面类必须实现MethodBeforeAdvice 接口并实现before 方法。该方法的底层调用必须在目标类中扩展的方法。只需编写自己的业务逻辑即可。方面类的方法之前。

接口规范式

中定义的方面类必须实现AfterReturnAdvice 接口并实现afterReturn 方法。

步骤

前置增强

后置增强

参数

Object returnValue

Method method

方面类必须实现MethodInterceptor 接口并实现invoke(MethodInitation incall) 方法。阻止方法。调用的progress()方法调用目标方法,并在语句前后实现自己的业务逻辑,从而达到环绕增强效果。

Object[] args

Aspect 类实现ThrowsAdvice 接口。该接口需要在方面类中自定义一个名为afterThrowing(Exception e) 的方法。

Object target

spr 是什么?

ingmvcspringmvc实际上是springframwork的一个模块,这个模块主要是对web的支持 springmvc是基于IoC和aop的

servlet缺点

获取参数比较繁琐,如果类型不是字符串类型则需要进行类型转换,还需要判断是否为空 如果每个servlet对应一个请求,则会产生大量的servlet,如果一个servlet对应多个请求,则违反可单一原则

原理

springmvc提供了一个servlet,我们把所有的请求都发送给这个servlet,这个servlet我们称之为核心控制器 核心控制器在tomcat启动时就会创建,在其init方法中会读取配置文件并扫描指定的包,会为由@Controller注解标记的类创建对象, 并把所有的由@RequestMapping注解标记的映射关系放到HandlerMapping中,键放注解的地址,值放方法 当在地址栏输入地址,核心控制器会根据资源路径从HandlerMapping中寻找要执行的方法,找到后并调用 在控制类的方法中处理请求和响应,用return实现请求转发(携带的参数放到ModelMap中)和重定向(在返回的字符串前加redirect)

三大核心组件

处理器映射器

作用:帮我们找到对应的controller

HandlerMapping

传统开发方式,即配置文件方式

依赖BeanNameUrlHandlerMapping类

注解开发方式,已过时类

AnnotationMethodHandlerAdapter(过时的注解开发方式)

注解开发方式,最新类

RequestMappingHandlerAdapter(最新版本的注解开发方式)

在springmvc内部配置文件中,注解开发方式配置的还是过时的注解驱动类,需要在springmvc配置文件中用标签配置新版注解驱动类

处理器适配器

作用:帮我们找到响应的方法 方法返回ModelAndView

视图解析器

在springmvc配置文件中配置,用来配置contorller类中方法返回的字符串类型的前缀和后缀,简化返回的静态地址的字符串 将结果渲染成页面

控制类中的注解

@Controller

标记控制类,该类拥有处理请求的能力

@RequesMapping

标注方法,定义请求路径 窄化映射,可以定义到controller类上,隔离各个控制类中的方法

value和path属性

标注这个方法处理请求的地址,支持传数组,可以响应多个请求

method

设置接收的请求的请求方式 RequestMethod.GET, RequestMethod.POST

@ResponseBody

用此注解标记该方法,则底层会将该方法的返回值转换为json格式,spring没有内置转json的类,需要依赖三方jar包

@CrossOrigin

设置跨域访问 传统方式需要设置响应头setHeader("Access-Control-Allow-Origin", "协议+ip+端口")

浏览器的同源策略

同源指的是同一个服务器 如果a服务器向b服务器发送ajax请求,b服务器接收并响应数据,在默认情况下,a服务器的ajax拒绝接收b服务器的响应,所以需要在b服务器端设置跨域访问,解决跨域错误问题

@PathVaribale

用于绑定url的占位符,例如:在请求的url中,/emplist/{empId},{empId}就是一个占位符,在参数列表中想要对应占位符的参数前用该注解标注,该注解中的值应当与占位符的值一致。url支持占位符是在spring3.0以后引入的 用于实现restful风格 如果想要实现restful风格,则需要将web.xml文件中核心控制器的请求路径设置为/,但此时将会把所有的静态文件例如js、css等也作为请求发送到核心控制器并去找相应的方法执行,此时就会访问不到静态资源,所以释放静态资源 在springmvc配置文件中配置静态资源,用

restful风格

用占位符的方式接收参数,占位符的参数名叫啥,前端name应该叫啥

传统风格

RequestMapping("/delete")localhost:8080/delete?id=10

restful风格

RequestMapping("/delete/{id}")restful风格:localhost:8080/delete/10

@ModelAttribute

被该注解标注的方法会先执行 适用场景:当前端提交表单,带着表单数据向控制类中的某个方法发送请求,但表单数据并不是一个完整的JavaBean对象的数据,此时可以定义一个新的方法,用该注解标注,那么在执行对应请求方法时会先执行该方法,该方法也可以从请求中获取请求参数,可以在该方法中通过请求参数从数据库查询完整数据, 并将最后JavaBean对象返回,这样数据就会完整,另一种方式是无返回值方法,可以参参数列表定义一个map集合,将最后的JavaBean放入map集合中,在对应的请求方法的参数列表中也用ModelAttribute注解标注参数,并在注解中给出放入map集合的key

注解语法糖

在spring4.2.x版本及以后出现了复合注解 @GetMapping("/")

@PostMapping

直接指明请求方式

@RestController

@Controller和@ResponseBody的符合注解

参数绑定

默认参数绑定

request response session ModelMap

基本数据类型

在对应方法的参数列表中定义请求参数 类型写你需要的,底层会帮你转,要求参数列表中的参数名与请求参数名一致

原理

mvc会反射你的方法参数列表,根据参数名去找请求参数对应的值,会尝试将数据转成你想要的类型,如果不能转成你想要的,抛异常

bean方式

可以使用对象接收,在参数列表定义对象类型,mvc可以直接自动封装成对象,前提是对象的属性名跟请求参数名一致

绑定包装的bean

即对象中有对象引用,要求前端数据的name为bean中的bena名称.属性名,例如订单实体中有商品实体(pro),如果要绑定商品id,则在前端需要将参数name定义为pro.id

数组绑定

一般用于批量删除,在前端定义复选框,复选框的名称相同且和控制类对应方法的数组名一致,springmvc可自动帮你获取参数

集合绑定

应用场景不多,一般用于批量修改,前端修改n条数据,提交多个对象到后台,但只能支持向对象中接收集合,即控制类对应方法中需要定义一个集合,接收参数时会接收到该对象的集合中,而且要求前端name属性为集合名[下标].对象属性名在jsp页面的c:foreach标签中的status属性可以获取遍历的集合的每次索引值

注解方式

@RequestParam注解,标记参数列表

注解属性

value/name

指明要获取的参数名,用于跟请求参数名匹配

required

默认为true,要求请求参数必须有,如果没有,则出现400,设为false则可以没有

defaultValue

用于定义参数列表的默认值,如果请求参数没有传来,则默认值生效

自定义转换器

当前端参数出现springmvc无法自动转换的参数时,例如时间,可以使用自定义转换器

步骤

创建一个类,实现Converter,T:源,V:目标,即需要将什么类型转换为什么类型 实现convert(T t)方法并返回想要的

将自定义转换器配置到springmvc容器中

在注册新版处理器映射器,处理器适配器驱动时,将自定义转换器配置 配置自定义转换器

注解方式解决mvc不支持的参数绑定

将spring不支持的绑定类型参数上用@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

springmvc如何响应

返回String类型的地址

在方法中直接return页面地址默认就是请求转发 在返回的页面地址字符串前加redirect:则为重定向

请求转发携带的参数需要放到ModelMap中

例如

配置视图解析器

在spring配置文件中配置前缀和后缀 配置语法 将配置文件的前缀和后缀与控制类中方法return的字符串拼接即可得到想要的路径

拦截器

框架提供的有跟过滤器功能类似但更强大的拦截器

拦截器会拦截Controller类中方法的调用

在controller类中方法执行前被拦截 在controller类的方法执行之后但在视图解析前被拦截 方法执行完且视图解析之后拦截

快速入门

定义一个类实现HandlerInterceptor接口

2. 实现该接口中的方法,所有的方法返回值为boolean,真放行,假拦截

该接口中的方法为默认方法,每个方法都有不同的拦截时机

preHandle(req,resp)

在controller的方法被调用之前执行该方法

postHandle(req, resp)

在方法被调用视图解析之前调用

afterCompletion(req, resp)

在方法执行完视图解析之后调用

3. 在配置文件中配置拦截器,可以配置多个拦截器,哪个在上边,最先执行哪个拦截器

执行顺序

两个兰拦截器,1拦截器配置在前,2拦截器配置在后

文件上传

springmvc文件上传原理

浏览器通过input标签将需要上传的文件自动读入到内存,当提交表单的时候,会将该文件发送到后台核心控制器,在请求中会携带这个文件,此时会调用到文件解析器,文件解析器会解析请求对象,将请求对象的文件解析出来返回给核心控制器 核心控制器再调用处理器映射器,找到相应的控制类的方法,通过参数绑定的形式,绑定给该方法, 该方法的参数类型必须是MultipartFile类型,参数名必须要和input标签中的name属性保持一致,最后调用该MultipartFile对象的方法进行上传

文件解析器配置

前后端要求

页面要求

传统表单方式

表单提交方式一定是post表单的enctype的值一定是multipart/form-datainput的type一定是file

ajax方式

type:postdata:FormDataprocessData: falsecontentType: false,

springmvc要求

需要两个jar包commons-io.jar和commons-fileupload.jar在ppringmvc配置文件中配置文件解析器绑定参数类型一定为MultipartFile,参数名字要和input的name属性的值保持一致

springmvc和struts2优劣

相同点

都基于mvc设计模式 底层都是对ServletAPI的封装 处理请求的机制都是一个核心控制器

区别

springmvc的入口是Servlet,struts2的入口是Filter springmvc的最小单元是方法,是基于方法设计的,struts2的最小单元是基于类,每次执行都会创建一个动作类,所以mvc更快 springmvc使用更简洁,发送ajax更方便 s2的OGNL表达式使页面开发效率更高,但执行效率没有并没有比JSTL有所提升 版权声明:本文转载于网络,版权归作者所有,如果侵权,请联系本站编辑删除

猜你喜欢