Web开发

注册

 

发新话题 回复该主题

万字长文华为大牛体系化讲解Spring [复制链接]

1#

Hello,今天给各位童鞋们分享的是SpringMVC,赶紧拿出小本子记下来吧

SpringMVC简单概述:

Model1:早期JavaWeb的开发中,统一把显示层、控制层、数据层的操作全部交给JSP或者JavaBean来进行处理

JSP和JavaBean之间严重耦合,Java代码和HTML代码也耦合在了一起要求开发者不仅要掌握Java,还要有高超的前端水平前端和后端相互依赖,前端需要等待后端完成,后端也依赖前端完成,才能进行有效的测试代码难以复用Model2时代:学过Servlet并做过相关Demo的朋友应该了解“JavaBean(Model)+JSP(View,)+Servlet(Controller)”这种开发模式,这就是早期的JavaWebMVC开发模式。Model:系统涉及的数据,也就是dao和bean。View:展示模型中的数据,只是用来展示。Controller:处理用户请求都发送给,返回数据给JSP并展示给用户。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WLYBiv8k-7)(./Java工程.assets/model2.png)]

Model2模式下还存在很多问题,Model2的抽象和封装程度还远远不够,使用Model2进行开发时不可避免地会重复造轮子,这就大大降低了程序的可维护性和复用性。于是很多JavaWeb开发相关的MVC框架应运而生比如Struts2,但是Struts2比较笨重。随着Spring轻量级开发框架的流行,Spring生态圈出现了SpringMVC框架,SpringMVC是当前最优秀的MVC框架。相比于Struts2,SpringMVC使用更加简单和方便,开发效率更高,并且SpringMVC运行速度更快。

MVC是一种设计模式,SpringMVC是一款很优秀的MVC框架。SpringMVC可以帮助我们进行更简洁的Web层的开发,并且它天生与Spring框架集成。SpringMVC下我们一般把后端项目分为Service层(处理业务)、Dao层(数据库操作)、Entity层(实体类)、Controller层(控制层,返回数据给前台页面)。

流程说明(重要):

客户端(浏览器)发送请求,直接请求到DispatcherServlet。DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。解析到对应的Handler(也就是我们平常说的Controller控制器)后,开始由HandlerAdapter适配器处理。HandlerAdapter会根据Handler来调用真正的处理器来处理请求,并处理相应的业务逻辑。处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是个逻辑上的View。ViewResolver会根据逻辑View查找实际的View。DispaterServlet把返回的Model传给View(视图渲染)。把View返回给请求者(浏览器)1、什么是SpringMVC?

SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于Spring框架的一个模块。它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful编程风格的请求。2、什么是MVC模式?

MVC的全名是ModelViewController,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。V即View视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面,或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操纵的方式。M即model模型是指模型表示业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。C即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。3、SpringMVC的执行流程?

用户点击某个请求路径,发起一个request请求,此请求会被前端控制器处理。前端控制器请求处理器映射器去查找Handler。可以依据注解或者XML配置去查找。处理器映射器根据配置找到相应的Handler(可能包含若干个Interceptor拦截器),返回给前端控制器。前端控制器请求处理器适配器去执行相应的Handler处理器(常称为Controller)。处理器适配器执行Handler处理器。Handler处理器执行完毕之后会返回给处理器适配器一个ModelAndView对象(SpringMVC底层对象,包括Model数据模型和View视图信息)。处理器适配器接收到Handler处理器返回的ModelAndView后,将其返回给前端控制器。前端控制器接收到ModelAndView后,会请求视图解析器(ViewResolver)对视图进行解析。视图解析器根据View信息匹配到相应的视图结果,反馈给前端控制器。前端控制器收到View具体视图后,进行视图渲染,将Model中的模型数据填充到View视图中的request域,生成最终的视图(View)。前端控制器向用户返回请求结果。4、SpringMVC有哪些优点?

SpringMVC本身是与Spring框架结合而成的,它同时拥有Spring的优点(例如依赖注入DI和切面编程AOP等)。SpringMVC提供强大的约定大于配置的契约式编程支持,即提供一种软件设计方式,减少软件开发人员做决定的次数,开发人员仅需规定应用中不符合约定的部分。支持灵活的URL到页面控制器的映射。可以方便地与其他视图技术(JSP、FreeMarker等)进行整合。由于SpringMVC的模型数据往往是放置在Map数据结构中的,因此其可以很方便地被其他框架引用。拥有十分简洁的异常处理机制。可以十分灵活地实现数据验证、格式化和数据绑定机制,可以使用任意对象进行数据绑定操作。支持RestFul风格。5、SpringMVC的主要组件?

前端控制器DispatcherServlet:

其作用是接收用户请求,然后给用户反馈结果。它的作用相当于一个转发器或中央处理器,控制整个流程的执行,对各个组件进行统一调度,以降低组件之间的耦合性,有利于组件之间的拓展。——处理所有的HTTP请求和响应。

处理器映射器HandlerMapping:

其作用是根据请求的URL路径,通过注解或者XML配置,寻找匹配的处理器信息。

处理器适配器HandlerAdapter:

其作用是根据映射器处理器找到的处理器信息,按照特定规则执行相关的处理器(Handler)。

处理器Handler:

其作用是执行相关的请求处理逻辑,并返回相应的数据和视图信息,将其封装至ModelAndView对象中。

视图解析器ViewResolver:

其作用是进行视图的解析操作,通过ModelAndView对象中的View信息将逻辑视图名解析成真正的视图View(如通过一个JSP路径返回一个真正的JSP页面)。

视图View:

View是一个接口,实现类支持不同的View类型(JSP、FreeMarker、Excel等)。

6、SpringMVC和Struts2的区别有哪些?

最大的区别是Struts2相较于SpringMVC更笨重。

SpringMVC的入口是一个Servlet,也就是前端控制器(DispatcherServlet),而Struts2的入口是一个Filter(StrutsPrepareAndExecuteFilter)。SpringMVC是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例)。struts2是基于类开发,请求参数传递到类的成员属性,只能设计为多例。SpringMVC通过参数解析器将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用JSTL。Struts2采用值栈存储请求和响应的数据,通过OGNL存取数据。7、SpringMVC怎么样设定重定向和请求转发?

我们先说说请求转发与重定向的区别:

请求转发与重定向的区别:

请求转发在服务器端完成的;重定向是在客户端完成的。请求转发的速度快;重定向速度慢。请求转发的是同一次请求;重定向是两次不同请求。请求转发不会执行转发后的代码;重定向会执行重定向之后的代码。请求转发地址栏没有变化;重定向地址栏有变化。请求转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成。SpringMVC设定请求转发:

在返回值前面加forward:。

SpringMVC设定重定向:

在返回值前面加redirect:。例如我们在登录的时候,登录失败会重定向到登录页面。

8、当一个方法向AJAX返回特殊对象,譬如Object,List等,需要做什么处理?

在方法上加**

ResponseBody注解**,表示该方法的返回值不管是什么类型,都会返回JSON格式的数据。

把原来Controller类上的

Controller注解替换为**

RestController注解**。

RestController=

Controller+

ResponseBody,表明该Controller类所有的方法都返回JSON格式的数据(没有加

RequestMapping注解的方法除外)。

加入

ResponseBody注解就能返回JSON格式数据的原因是:SpringMVC提供的HttpMessageConverter自动转为JSON,

如果使用了Jackson或者Gson,不需要额外配置就可以自动返回JSON了,因为框架帮我们提供了对应的HttpMessageConverter;

加入Jackson.jar

在配置文件中配置json的映射

在接受Ajax方法里面可以直接返回Object、List等,但方法前面要加上

ResponseBody注解。

如果使用了Alibaba的Fastjson的话,则需要自己手动提供一个相应的HttpMessageConverter的实例。

9、SpringMVC的常用注解:

注解本质是一个继承了Annotation的特殊接口,其具体实现类是JDK动态代理生成的代理类。

我们通过反射获取注解时,返回的也是Java运行时生成的动态代理对象。

通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法,该方法会从memberValues这个Map中查询出对应的值,而memberValues的来源是Java常量池。

1、

Controller

Controller用于标记在一个类上,使用它标记的类就是一个SpringMVCController对象。处理器适配器将会扫描使用了该注解的类的方法,并检测该方法是否使用了

RequestMapping注解。

Controller只是定义了一个控制器类,而使用

RequestMapping注解的方法才是真正处理请求的处理器。

2、

RequsestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。

用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。返回值会通过视图解析器解析为实际的物理视图,对于InternalResourceViewResolver视图解析器,通过prefix+returnValue+suffix这样的方式得到实际的物理视图,然后做转发操作。

写在方法上:

RequestMapping(/req)表示不区分请求类型。

RequestMapping(value=/req,method=RequestMethod.POST)表示这是一个POST请求。

3、

ResponseBody

ResponseBody把Java对象转化为json对象,这种方式用于Ajax异步请求,返回的不是一个页面而是JSON格式的数据。

RequestBody:注解实现接收
分享 转发
TOP
发新话题 回复该主题