Spring框架是由于软件开发的复杂性而产生的。Spring使用基本的JavaBeans来做以前只有EJB才能做的事情。然而,Spring的使用并不局限于服务器端开发。绝大多数Java应用程序都可以在简单性、可测试性和松散耦合方面受益于Spring。Spring相关视频教程:https://www.bilibili.com/video...SpringMVC是Spring提供的基于MVC设计模式的轻量级Web开发框架,本质上等同于Servlet。SpringMVC角色分工明确,分工细化。由于SpringMVC本身就是Spring框架的一部分,可以说是与Spring框架无缝集成。在性能方面,它具有先天优势。它是当今业界最主流的Web开发框架和最流行的开发技巧。SpringMVC相关视频教程:https://www.bilibili.com/video...废话不多说,一起走进Spring和SpringMVC框架的世界吧!!!1、为什么要用Spring?1).方便解耦,简化开发通过Spring提供的IoC容器,Spring可以控制对象之间的依赖关系,避免硬编码导致的程序过度耦合。2).AOP编程支持通过Spring提供的AOP功能,方便面向切面的编程,如性能监控、事务管理、日志记录等。3).支持声明式交易4)。方便各种优秀框架的集成5).降低JavaEEAPI的使用难度,比如为JDBC、JavaMail、远程调用等提供简单的封装。2、什么是IoC,为什么要使用IoC?IoC代表IversionofController,控制反转。这个概念是你不创建对象,而只是描述它是如何创建的。你不是直接在代码中组装你的组件和服务,而是在配置文件中描述哪些组件需要哪些服务,然后由一个容器(IOC容器)负责组装。它可以指导我们如何设计松散耦合的、更好的程序。3.什么是AOP,为什么要用AOP?AOP的全称:Aspect-OrientedProgramming,面向方面的编程。AOP,aspect-orientedprogramming,就是把可重用的功能抽取出来,然后在合适的时候把这些常用的功能编织到应用程序中,比如事务管理,权限控制,日志记录,性能统计等等。AOP并没有帮助我们解决任何新的问题,它只是提供了一种更好的方法,以更少的工作量解决一些存在的问题,使系统更加健壮和可维护。4、什么是Spring事务管理?事务是对一系列数据库操作(如插入多条数据)的统一提交或回滚操作。如果插入成功,他们将一起成功。如果中间出现异常,那么之前的所有操作都会回滚。这样可以防止脏数据,防止数据库数据出现问题。在开发中为了避免这种情况,一般会进行事务管理。Spring的声明式事务通常指的是配置文件中事务的配置语句,其中包括很多声明属性。它使用SpringProxy来帮助您充当代理。不需要自己额外写代码,在Spring配置文件中声明即可。是的;通常用于数据库操作;编程事务是指硬编码事务处理。这种处理方式需要写代码,交易中的逻辑可以自己定制;它可以是数据库的东西,也可以是其他操作。Spring也有自己的事务管理机制,一般由TransactionManager来管理,这个功能可以通过Spring注入来完成。5、Spring框架支持以下五种bean作用域:singleton:默认值,bean在每个Springioc容器中只有一个实例。原型:一个bean定义可以有多个实例。request:为每个http请求创建一个bean,这个作用域只在基于web的SpringApplicationContext的情况下有效。session:在一个HTTPSession中,一个bean定义对应一个实例。此范围仅在基于web的SpringApplicationContext的情况下有效。global-session:在一个全局的HTTPSession中,一个bean定义对应一个实例。此范围仅在基于web的SpringApplicationContext的情况下有效。6、Spring的MVC框架是什么?Spring带有用于构建Web应用程序的全功能MVC框架。Spring可以很容易地与其他MVC框架集成,例如Struts。Spring的MVC框架使用控制反转来明确隔离业务对象和控制逻辑。它还允许将请求参数声明性地绑定到业务对象。SpringMVC是一个基于MVC的Web框架。springmvc是spring框架的一个模块,springmvc和spring不需要通过中间集成层集成。7.如何开启注解:以上内容可以省略8、SpringMVC的请求流程:第一步:向前端控制器(DispatcherServlet)发起请求第二步:前端控制器请求HandlerMapping根据xml配置和注解查找Handler即可第三步:ProcessormapperHandlerMapping返回Handler给前端控制器Step4:前端控制器调用处理器适配器执行HandlerStep5:处理器适配器执行HandlerStep6:Handler执行后返回ModelAndView给adapterStep7:处理器适配器发送给前端Controller返回ModelAndView。ModelAndView是springmvc框架的一个底层对象,包括Model和viewStep8:frontcontroller请求viewparser进行视图解析,根据逻辑视图名解析成真实的view(jsp)Step9:view解析器发送给前端控制器返回给视图第十步:前端控制器渲染视图。视图渲染将模型数据(在ModelAndView对象中)填充到请求字段中第十一步:前端控制器将结果响应给用户9.web.xml配置10.注解处理器映射器和适配器在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注释映射器。spring3.1之后,使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。使用mvc:annotation-driven代替上面的注解映射器和注解适配器配置11.spring与mybatis集成过程第一步:将dao层mybatis与spring集成,通过spring管理mapper接口。使用mapper的scanner自动扫描mapper接口进行spring注册。第二步:集成服务层,通过spring管理服务接口。使用配置方法在spring配置文件中配置服务接口。实施事务控制。第三步:集成springmvc由于springmvc是一个spring模块,所以不需要集成。主要配置有:1)。Mybatis配置文件sqlMapConfig.xml配置别名自动扫描(实体类)2)。Mapperscanner(接口,数据库访问接口)3)。数据库连接池配置4).声明式事务配置5).启用注释扫描:6)。配置注释映射器和适配器:7)。查看解析器:8)。配置控制类:DispatcherServlet前端控制器9).配置spring配置文件加载类:ClassLoadListener12。前端控制器从上述文件中加载和处理映射器、适配器和视图解析器等组件。如果在springmvc.xml中没有配置,则使用默认加载的DispatcherSerlvet.properties。13、查看解析器配置前缀和后缀:14.sqlMapConfig.xml,mybatis自带的配置文件。15、配置数据源:16、事务控制(applicationContext-transaction.xml),在applicationContext-transaction.xml中使用spring声明式事务控制方法。17.加载spring配置18.静态资源访问不拦截:19.@RequestMapping的作用1).网址映射2).缩小请求映射3)。限制http请求方法20个,controller方法的返回值返回需要的ModelAndView方法最后定义ModelAndView,分别设置model和view。返回字符串如果控制器方法返回字符串,1)。表示返回逻辑视图名称。真实视图(jsp路径)=前缀+逻辑视图名+后缀2).redirect重定向:返回字符串格式为:"redirect:queryItem.action"3).forward页面转发:返回字符串格式为:"forward:queryItem.action"返回无效。可以在控制器方法参数上定义请求和响应,响应结果可以使用请求或响应来指定:1)。使用request翻页,如下:request.getRequestDispatcher("pagepath").forward(request,response);2)。也可以通过响应页面重定向:response.sendRedirect("url")3)。也可以通过response指定响应结果,例如响应json数据如下:response.setCharacterEncoding("utf-8");response.setContentType("application/json;charset=utf-8");response.getWriter().write("json字符串");21、参数绑定:默认支持的类型直接定义在controller方法参数上。对象,您可以使用这些对象。在参数绑定的过程中,如果遇到以下类型,直接绑定即可。1).HttpServletRequest:通过请求对象获取请求信息2).HttpServletResponse:通过response3)处理响应信息。HttpSession:通过session对象获取session中存储的对象4).Model/ModelMap:model是接口,modelMap是接口实现。功能:将模型数据填入请求域。简单类型通过@RequestParam绑定简单类型的参数。如果不使用@RequestParam,request传入的参数名必须与controller方法的形参名一致,才能绑定成功。如果使用@RequestParam,则不需要限制request中传入的参数名与controller方法的形参名相同。使用required属性指定参数是否必须传入,如果设置为true,如果没有传入参数,会报错。pojo绑定页面中input的名称与controller的pojo参数中的属性名相同,页面中的数据绑定到pojo中。(usename,age;user.username,user.age不是必需的)自定义参数绑定实现日期类型绑定对于controller参数中的pojo对象,如果属性中有日期类型,则需要自定义参数绑定。将请求的日期数据字符串转换为日期类型,转换的日期类型必须与pojo中日期属性的类型一致。22、SpringMVC与Struts2的比较1).Struts2是类级别的拦截,一个类对应一个请求上下文,SpringMVC是方法级别的拦截,一个方法对应一个请求上下文,同时一个方法对应一个url,所以从架构本身上,SpringMVC很容易实现restfulurl2)。由于以上原因,SpringMVC的方法基本上是独立的,独享请求响应数据。通过参数获取请求数据,处理结果通过ModelMap返回给框架。共享变量,而Struts2是乱七八糟的。尽管这些方法是独立的,但所有的Action变量都是共享的。这不会影响程序的运行,但是会给我们编码和阅读程序带来麻烦。每次来一个请求都会创建一个Action,一个Action对象对应一个请求上下文。3).由于Struts2需要对每一个request进行封装,将request、session等servlet生命周期的变量封装成一个Map,供各个Action使用,保证线程安全,所以原则上比较消耗内存。4).SpringMVC集成了Ajax,使用起来非常方便。只用一个注解@ResponseBody就可以实现,然后直接返回响应文本。但是Struts2的拦截器集成了Ajax,在Action处理的时候一般需要安装插件或者自己写代码集成,使用起来比较不方便。5).springmvc是面向方法开发(更接近服务接口开发方式),struts2是面向类开发。6).springmvc可以单实例开发,而struts2只能多实例开发。23、处理乱码1).post乱码在web.xml中添加一个post乱码过滤器:CharacterEncodingFilter2)。get请求中文参数出现乱码的解决方法有两种:修改tomcat配置文件,添加与项目代码一致的代码,如下:b。对参数重新编码:StringuserName=newString(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")ISO8859-1是tomcat默认编码,编码后的内容通过tomcat需要编码为utf-824.集合类型绑定1).ArrayBinding:controller方法参数使用:(Integer[]itemId)页面统一使用:itemIdasname2).listbinding:pojopropertyname:itemsListpage:itemsList[index].propertyname3).mapbinding:pojo属性名:MapitemInfo=newHashMap();页面:名称:25.弹簧验证1)。在项目中,通常会用到更多的前端验证,比如页面中的js验证。对于安全性要求较高的点,建议在服务器端进行验证。2).springmvc使用hibernate的验证框架validation(与hibernate无关)。验证思路:将页面提交请求的参数发送给controller方法,使用validation进行校验。如果验证失败,页面会显示错误信息。26.数据回显1).@ModelAttribute还可以将方法的返回值传递给页面:给方法添加注解@ModelAttribute2)。使用最简单的方法来使用不带@ModelAttribute的模型:model.addAttribute("id",id);3).springmvc默认回显pojo数据。pojo数据传给controller方法后,springmvc自动将pojo数据放入request域,key等于pojo类型(首字母小写)4)。publicStringtestParam(PrintWriterout,@RequestParam("username")Stringusername){//out直接输出27.异常处理springmvc提供了一个全局的异常处理程序(一个系统只有一个异常处理程序),用于统一的异常处理。系统遇到异常,在程序中手动抛出,dao抛给service,service抛给controller,controller抛给前端控制器,前端控制器调用全局异常处理器.28.上传图片1).页面表单提交enctype="multipart/form-data"数据时,需要springmvc解析multipart类型的数据。2).在springmvc.xml中配置多部分类型解析器。3).方法中使用:MultipartFileattach(单个文件上传)或MultipartFile[]attaches(多个文件上传)29.Json处理1).加载json转换的jar包:使用springmvc中的jackson包进行json转换(@requestBody和@responseBody使用下面的包进行json转换)2)。配置json转换器。将messageConverters添加到注解适配器RequestMappingHandlerAdapter中。如果你使用它将被自动添加。3).阿贾克斯4)。控制器(ResponseBody,RequestBody)5)。注意,如果ajax中的contentType没有设置为json类型,则传递的参数为key/value类型。经过上面的设置,json类型就传过去了。30.拦截器:1).定义拦截器并实现HandlerInterceptor接口。接口中提供了三种方法。a.preHandle:在进入Handler方法之前执行,用于身份认证和身份授权,比如身份认证,如果认证通过,说明当前用户还没有登录,这个方法需要被拦截,不再向下执行b.postHandle:进入Handler方法后,在modelAndView之前返回Executed,应用场景从modelAndView开始:将常用模型数据(如菜单导航)传递给这里的view,或者指定这里的viewc.afterCompletion:ExecuteHandler完成该方法的执行,应用场景:统一异常处理,统一日志处理2).拦截器配置:对于HandlerMapping配置(不推荐):springmvc拦截器拦截HandlerMapping的设置。如果在HandlerMapping中配置了拦截,那么被HandlerMapping成功映射的handler最终会使用拦截设备。(一般不推荐)b.类似全局拦截器:springmvc配置类似的全局拦截器,springmvc框架在每个HandlerMapping中注入配置类似的全局拦截器31.如何开启注解:如果使用,以上内容可以省略,使用mvc:annotation-driven代替annotationmapper和annotationadapter配置
|