java 常用框架 MVC 框架模式 和 SpringMVC 框架模式,分布式等 详解

1. 框架与设计模式

框架、设计模式这两个概念很容易被人混淆,但其实这两者之间还是存在差别的。框架通常是代码重用,而设计模式是设计重用。 
设计模式是对反复出现的问题的解决方案的描述,是一种思想用于处理细节的,比框架更加抽象。框架是已经用代码实现的,可以执行也可以复用。设计模式是比框架更小的元素,一个框架往往会包含一个或者多个设计模式。框架总是针对某一特定领域的,而设计模式则可以适用于各个应用。

常见的框架模式: 
MVC, ORM等。

常见的框架: 
C++语言的MFC、qt、 gtk,Java语言的SSH,Python语言的django等。

常见的设计模式: 
代理模式,抽象工厂模式等23种设计模式。

2. MVC框架模式

MVC是三个单词的首字母缩写,它们是Model(模型)、View(视图)和Controller(控制)。

所谓MVC模型就是将数据、逻辑处理、用户界面分离的一种方法。

  • M(Model, 模型):用于数据处理、逻辑处理。
  • V(View,视图):用于显示用户界面。
  • C(Controller,控制器):根据客户端的请求控制逻辑走向和画面。

而在Java中,MVC这三个部分则分别对应于 JavaBeans、JSP和Servlet。

  • M = JavaBeans:用于传递数据,拥有与数据相关的逻辑处理。
  • V = JSP:从Model接收数据并生成HTML
  • C = Servlet:接收HTTP请求并控制Model和View

MVC 更详细的简介 https://blog.csdn.net/qq_21225505/article/details/81666986

常见的 MVC 框架有Struts1/2,Spring MVC等,实际上都是在最底层的Servlet规范中发展而来的。而不同MVC框架其M(对应JAVA的POJO类)和V(如JSP,HTML等)一般是相同的,最主要的区别在C,它是HTTP处理请求、响应的关键。

3. SpringMVC框架

3.1 SpringMVC简介

springMVC 即 spring web MVC。

springMVC框架是基于Java的实现了MVC框架模式的请求驱动类型的轻量级框架。前端控制器是DispatcherServlet接口实现类,映射处理器是HandlerMapping接口实现类,视图解析器是ViewResolver接口实现类,页面控制器是Controller接口实现类。SpringMVC的工作流程图如下:

 Spring中的 DispatcherServlet 包为 org.springframework.web.servlet.DispatcherServlet,继承自 HttpServlet 。

 

(1)客户端请求提交到前端控制器DispatcherServlet;    ----即 web.xml 文件 。<web-app>.....</web-app> 中 servlet部分。

<web-app xmlns=.......>
 <servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
 <display-name>appdemo-server</display-name> 
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
</web-app>

此时根据servlet listener 监听器配置context-param 来自定义该文件的名称和位置。applicationContext.xml

applicationContext.xml

  • 这个文件将用于创建bean定义,重新定义在全局范围内具有相同名称的任何已定义的 bean。

  •  标签将用于激活 Spring MVC 注释扫描功能,该功能允许使用注释,如 @Controller 和 @RequestMapping 等等。

  • InternalResourceViewResolver 将使用定义的规则来解决视图名称。按照上述定义的规则,一个名称为 hello 的逻辑视图将发送给位于 /WEB-INF/jsp/hello.jsp 中实现的视图。

(2)前端控制器DispatcherServlet查找一个或者多个映射处理器HandlerMapping,从而确定调用哪个页面控制器Controller对请求进行处理; 
(3)DispatcherServlet将请求提交给Controller; 
(4)Controller根据业务逻辑对请求进行处理,并返回ModelAndView; 
(5)DispatcherServlet查找一个或者多个ViewResolver,得到ModelAndView指定的视图view,并将model中的数据传入视图view中进行渲染; 
(6)DispatcherServlet将渲染后的视图返回响应;

由上述过程可见,DispatcherServlet是Spring MVC的核心,它负责协调SpringMVC的各个组成部分对所有的Http请求进行处理,其主要工作如下: 
(1)截获符合特定格式的Http请求; 
(2)初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久层的WebApplicationContext关联起来; 
(3)初始化Spring MVC的各个组件,并装配到DispatcherServlet中;

SPring Web MVC 运行的具体过程 ,参考https://blog.csdn.net/qq_18975791/article/details/81069016

3.2 SpringMVC框架中的接口

DispatcherServlet接口:Spring提供的前端控制器,所有的请求都是由它来进行分发。在DispatcherServlet将请求分发到对应的Controller之前,需要借助Spring提供的HandlerMapping才能定位到相应的Controller.

HandlerMapping接口:完成客户请求到Controller的映射。

Controller接口:需要为并发用户处理请求,在实现Controller接口时,必须保证线程安全且可重用。 
在Controller完成用户请求的处理,返回ModelAndView对象给DispatcherServlet,ModelAndView对象中包含了模型Model和视图View。 
从宏观角度进行考虑,DispatcherServlet是整个Web应用的控制器;从微观角度进行考虑,Controller是单个Http请求处理过程的控制器。

ViewResolver接口:根据ModelAndView对象在web应用查找view视图,并将model中是数据传入到view视图中进行渲染。

3.3 SpringMVC框架优势

(1)角色清晰,分工明确,进行更简介的web开发; 
(2)和其他Spring框架无缝集成; 
(3)强大的JSP标签库; 
(4)HandlerMapping, ViewResolver等能够简单地进行定制;

3.4 SpringMVC常用注解

1、@Controller

在SpringMVC中,控制器Controller负责处理由DispatcherServlet分发的请求,它把用户请求中的数据经过业务处理层处理后封装为一个Model,然后将该Model返回相应的View进行显示。在SpringMVC中提供了一个非常简单的定义Controller的方法,你无需继承特定的类或者实现特定的接口,你只需要用@Controller注解标记一个类是Controoller,然后采用@RequestMapping和@RequestParam等一些注解用于定于URL和Controller方法之间的映射,这样Controller便能够被外界访问。此外,Controller不会直接依赖HttpServletRequest和HttpServletResponse等HttpServlet对象,这些对象可以通过Controller方法参数来获得。 
采用@Controller注册一个bean到spring上下文中时,bean默认的ID名称是类名开头字母小写,也可以自己指定bean的名称:

@Controller
public class TestController {}
 
@Controller("test")
public class TestController {}

@Controller注解在一个类上,表明该类是一个SpringMVC Controller对象。分发处理器将会扫描使用了该注解的类的所有方法,并检测该类中的方法是否使用了@RequestMapping注解。@Controller注解只是定义一个控制器,@RequestMapping注解的方法才是真正处理请求的处理器。单单使用了Controller注解还不能说明该类就是SpringMVC的控制器,因为这个时候Spring还无法获取该类,我们可以通过如下两种方式将@Controller注解的控制器类交给spring进行管理:

//方法一
//在SpringMVC配置文件中定义MyController的bean对象
<bean class="com.host.app.web.controller.MyController"/>
 
//方法二
//在SpringMVC配置文件中告诉Spring去哪里扫描@Controller注解的Controller对象
<context:component-scan base-package="com.host.app.web.controller"/>

 

2、@RequestMapping

@RequestMapping是一个用来处理请求地址映射的注解,可以用于类或者方法上。当该注解用于类上时,表示该类中所有响应请求的方法都是以该地址为父路径。 
@RequestMapping注解包含6个属性,下面我们对这6个属性进行分析:

value:指定请求的实际地址,指定的地址可以是URL Template模式;

method:指定请求的方法类型;

consumes:指定请求提交的内容类型(Content-Type),例如application/json,text/html;

produces:指定返回的内容类型,仅当请求头部中Accept包含指定类型时方法才进行处理;

params:请求中必须包含某些参数时,方法才进行处理;

headers:请求header中必须包含某些指定的header值,方法才进行处理;

3、@Resource和@Autowired

@Resource和@Autowired都是bean注入时使用,但是其实@Resource并不是spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入; 
@Resource和@Autowired的共同点:两者都可以使用在字段或者setter方法上,如果使用在了字段上,那么就不再需要setter方法。

@Resource和@Autowired的不同点:

@Autowired注解是由spring提供的,需要导入org.springframework.beans.factory.annotation.Autowired,只按照byType进行注入。在默认情况下,它要求依赖的对象必须存在,如果允许null,可以通过属性required设置为false进行设置。如果我们需要辅助通过byName进行装配bean,我们可以结合@Qualifier注解一起使用。

@Resource注解默认是按照byName进行装配bean,由J2EE提供,需要导入javax.annotion.Resource。@Resource注解包含两个重要的属性: name和type,Spring将@Resource注解中的name属性解析为bean的名字,将type属性解析为bean的类型。 
当@Resource注解的name属性时,Spring将按照byName方式进行bean注入,找不到将会抛出异常; 
当使用type属性时,将按照byType方式进行bean注入,找不到或者找到多个将会抛出异常; 
如果同时使用了这两个属性,那么将会从Spring上下文中查找指定类型指定名字bean进行装配,找不到将会抛出异常; 
如果两个属性都没有使用,那么将会按照默认方式byName进行bean注入。

4、@ModelAttribute 
@ModelAttribute注解有两种用法:一种是用在拥有返回值的方法上,方法的返回值将会作为Model中指定属性的值;另一种是用在请求处理方法参数上,方法参数将会从Model的属性列表中获取指定属性的值。通过@ModelAttribute(“xxxx”)可以指定属性的名称。在Controller的请求处理方法调用之前,@ModelAttribute注解的方法都会被首先执行。

5、@SessionAttributes 
@SessionAttibutes注解只能用在类上,不能使用在方法上。该注解将Model属性列表中指定的一些属性保存到Session对象中。

6、@PathVariable 
该注解用于将请求URL的模板变量提取出来,应用到请求处理方法参数中。

@RequestMapping(value="/users/{user}/roles/{role}")
public void getUserAndRole(@PathVariable("user") String user,@PathVariable("role")String role){
    System.out.println(user+" : "+role);
}

 

7、@RequestParam 
@RequestParam主要用于SpringMVC后台请求处理方法中获取参数,类似与request.getParameter(“name”), 该注解包含三个属性:required, defaultValue, value,其中required表示请求中是否必须包含该参数,defaultValue表示请求中没有包含该参数时的默认值,value表示传入的参数的名称。

8、@ResponseBody 
该注解用于将Controller请求处理方法返回的对象,通过适当的HttpMessageConverter转换为指定的格式,保存到Response对象的body区。

9、@Component 
相当于通用的注解。

10、@Repository 
用于注解DAO层。

原文链接:https://blog.csdn.net/qq_36827957/article/details/78515403

 

其他框架 Maven、mybatis 等框架 ,见博文https://www.cnblogs.com/byqh/p/5595384.html

posted @ 2019-03-29 10:57  浅笑安然Shunia  阅读(1671)  评论(0编辑  收藏  举报