2.1MVC思想概述
2.1.1传统的Model1和Model2model1:整个web应用几乎全部都是用JSP页面组成。JSP页面接收和处理客户端请求,对请求做出响应,用 少量的javaBean来处理数据库连接、数据库访问等操作。jsp身兼View和Controller两种角色,将控 制逻辑和表现逻辑混杂在一起,导致代码的重用性特别低。增加了应用廓镇和维护的难度。
model2:基于MVC架构的设计模式。在Model2架构中,Servlet作为前端控制器,负责接收客户端发送的请 求。在Servlet中只包含控制逻辑和简单的前端处理。然后调用后端JavaBean来完成实际逻辑梳 理,最后转发到JSP页面来显示。如图:
从下图可以看出:Model2下jsp不再承担控制器的责任,它妗妗是表现层的角色,仅仅用于将结果 呈现给用户,JSP页面的请求与Servlet(控制器)交互,而Servlet负责与后台的JavaBean通信,在 Model2模式下,模型(Model)由JavaBean充当,视图(View)由JSP页面充当 而控制器由 (controller)由Servlet充当
Mvc思想是将应用分成三个基本部分:Model(模型)、View(视图)和Controller(控制器)。
MVC有如下特点:1、多个视图可以对应一个模型,可以减少代码的复制以及代码的维护量。这样一旦模型 发生 改变也易于维护
2、模型返回的数据与显示逻辑分离。模型数据可以应用任何显示技术。
3、应用被分为三层,降低了各层之间的耦合,提供了应用的可扩展性。
4、控制层的概念也很有效,由于它吧不同的模型和各种不同的视图组合在一起,完成不同的 请求,因此控制层可以说包含了用户请求权限的概念
5、MVC更符合软件工程化管理的精神。不同的层各司其职,每一层的组件具有相同的特征。
2.2 Struts2和Spring MVC
2.2.1 Spring MVC的优势
springMVC框架提供了一个DispatcherServlet作用前端控制器开分派请求,同时提供灵活的配置处理程序映射、视图解析、语言环境和主题解析,并支持文件上传。SpringMvc还包含多种视图技术,例如Java Server Pages(JSP),Velocity、Tiles、iText和POI等。
SpringMVC的特点:
1、强大的灵活性、非侵入性和可配置性
2、提供了一个前端控制器DispatcherServlet,开发者无须额外开发控制器对象
3、分工明确,包括控制器,验证器,命令对象,模型对象,处理程序映射视图解析器。等等
4、自动绑定用户输入,并正确转换数据类型。自动解析字符串,并将其设置为模型的int和float类型的属性
5、使用一个名称/值得Map对象实现更加灵活的模型数据传输。
6、内置常见的校验器,可以校验用户输入,如果校验不通过,则重定向回输入表单。输入校验是可选的,并且支持编程方式及生命方式。
7、支持国际化,支持根据用户区域显示躲过语言,并且国际化的配置非常简单。
8、支持多种视图技术,最常见的优JSP技术以及其他技术,包括Velocity和Freemarker。
9、提供了一个简单而强大的JSP标签库,支持数据绑定功能,使得编写jsp页面更加容易。
SpringMVC的原理
1、用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
组件说明:
DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。
HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。
ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。
springMVC的几个组件
前端控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。
处理器映射器(HandlerMapping):根据URL去查找处理器
处理器(Handler):(需要程序员去写代码处理逻辑的)
处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)
视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面
2.3.2 SpringMvc的DispatcherServlet
在虚度的MVC框架中,都包含一个用于调度控制的Servlet,SpringMvc也提供了一个名为org.springframework.web.servlet.DispatcherServlet的Servlet充当前端控制器,所有的请求驱动都围绕这个DispatcherServlet来分派请求。
DispatcherServlet是一个Servlet(它集成自HttpServlet基类),因此使用时需要把它配置在web应用的部署描述符web.xml文档中
以上是标准的JavaEE Servlet配置,配置了一个DispatcherServlet,该Servlet在Web应用程序启动时立即加载,DispatcherServlet加载时会需要一个SpringMvc的配置文件,默认情况下,应用汇去应用程序文件夹的WEB-INF下查找对应的【servlet-name】-servlet.xml文件,例如本例的《servlet-name》是springMVC ,默认查找的就是/WEB-INF/springmvc-servlet.xml
也可以把springMvc的配置文件放到应用程序文件夹中的任何地方,用servlet元素的init-param子元素进行描述,本例的param-name元素的值contextConfigLocation表示参数名称,param-value表示元素的值/WEB-INF/springmvc-config.xml表示SpringMVC的配置文件路径和名称。
DispatcherServlet会查找WEB-INF/springmvc-config.xml文件,作为spring MVC的配置文件,解析该文件内容并根据文件配置信息创建一个WebApplicationContext容器对象,也成为上下文环境。WebApplicationContext继承自ApplicationContext容器,它的初始化方式和BeanFactory、ApplicationContext有所区别,因为WebApplicationContext需要ServletContext实例,也就是说,它必须在拥有哦web容器的前提下才能完成启动spring Web应用上下文的工作。有了WebApplicationContext容器,开发者就可以很自然的使用spring的IOC、AOP等其他功能了。
2.3.3 基于Controller接口的控制器
DispatcherServlet在spring当中充当一个前端控制器的角色,它的核心贡呢是分发请求。请求会被分发给对应处理的java类,SpringMVC中成为Handler,在spring2.5以前,开发一个Handler的唯一方法就是实现org.springframework.web.servlet.mvc.Controller接口。Controller必须实现一个方法,该方法的签名如下:
Controller接口的实现可以通过handleRequest方法传递的参数访问对应请求的HttpServletRequest和HttpServletResponse对象处理完业务请求之后,必须返回一个包含模型对象的视图路径的ModelAndView对象。
示例:基于注解的控制器
spring2.5版本新增了可基于注解的控制器
HelloController是一个基于注解的控制器,org.springframework.stereotype.Controller注释类型用于指示spring类的实例是一个控制器。org.springframework.web.bind.annotation.RequestMapping注释类型来映射一个请求的方法。
修改springmvc的配置文件如果开发者希望使用自定义类型的组件,则只需要在Spring配置文件中配置自定义的Bean组件即可,SpringMVC如果发现上下文中的所有用户自定义的组件,就不会使用默认组件。
2.5 SpringMVC执行的流程
2.5.1 springmvc应用的开发步骤
①、在web.xml文件中定义前端控制器DispatcherServlet来拦截用户请求。
②、如果需要一POST方式提交请求,则定义包含表单数据的JSP页面,如果仅仅只是以GET方式发送请求,则无 需经过这一步
③、定义处理用户请求的Handle类,可以实现Controller接口,或者使用@Controller注解。
④、配置Handle。Java领域的绝大部分MVC框架都非常喜欢使用xml文件来进行配置管理,这在以前是一种思维 定式。
⑤、编写哦视图资源。
2.5.2 SpringMVC执行的流程