Spring MVC 详细教程


22 Spring MVC 核心组件 11 Spring MVC 入门简介 33 Spring MVC Demo 实例 MVC设计思想 MVC即Model-View-Controller,把一个应用的输入、 处理、输出流程按照Model、View、 Controller的方式进行分离,这样一个应用 被分成三个层——模型层、视图层、控制层。 MVC设计思想 MVC是一种复合模式,结合了观察者模式、 策略模式、组合模式、适配器模式。 模型使用观察者模式,以便观察者更 新,同时保持两者之间的解耦。控制器是视 图的策略,视图使用组合模式实现用户界面。 适配器模式用来将模型适配成符合现有视图 和控制器的需要的模型。 这些模式合作把MVC模式的三层解耦。 MVC设计思想 视图(View)代表用户交互界面,对于Web应 用来说,可以是HTML,也可能是jsp、XML和 Applet等。一个应用可能有很多不同的视图, MVC设计模式对于视图的处理仅限于视图上数据 的采集和处理,以及用户的请求,而不包括在视 图上的业务流程的处理。业务流程的处理交予模 型(Model)处理。 比如一个订单的视图只接受来自模型的数据 并显示给用户,以及将用户界面的输入数据和请 求传递给控制和模型。 MVC设计思想 模型(Model):是业务的处理以及业务规则的制定。 模型接受视图请求的数据,并返回最终的处理结果。业 务模型的设计是MVC最主要的核心。MVC设计模式告诉我 们,把应用的模型按一定的规则抽取出来,抽取的层次 很重要,抽象与具体不能隔得太远,也不能太近。MVC 并没有提供模型的设计方法,而只是组织管理这些模 型,以便于模型的重构和提高重用性。 业务模型还有一个很重要的模型那就是数据模型。 数据模型主要指实体对象的数据保存(持续化)。比如 将一张订单保存到数据库,从数据库获取订单。我们可 以将这个模型单独列出,所有有关数据库的操作只限制 在该模型中。 MVC设计思想 控制(Controller)可以理解为从用户接收请求, 将 模型与视图匹配在一起,共同完成用户的请求。划分控 制层的作用也很明显,它清楚地告诉你,它就是一个分 发器,选择什么样的模型,选择什么样的视图,可以完 成什么样的用户请求。控制层并不做任何的数据处理。 例如,用户点击一个连接,控制层接受请求后, 并 不处理业务信息,它只把用户的信息传递给模型,告诉 模型做什么,选择符合要求的视图返回给用户。因此, 一个模型可能对应多个视图,一个视图可能对应多个模 型。 Jsp model 1架构 Model 1的基础是JSP文件,它由一些相互独立的JSP文 件和其他一些Java Class组成。这些JSP从HTTP Request中 获得所需要的数据,处理业务逻辑,然后将结果通过 Response返前端浏览器。Model 1的应该说是唯一的好处是 “简单”,可以大大加快系统的开发进度。它把表现层和业务 逻辑层柔和在一起,不利于以后的维护工作以及开发角色的 分配,所以这种模式只能适合于小的系统开发。 Jsp model 2架构 Model 2采用面向对象技术实现MVC模式 从而扩展 JSP/Servlet的模式。 Model2是MVC在Web上的应用。 一个Model 2规范实现的Web框架 一个Model 2规范实现的Web框架 视图层采用JSP实现;控制层采用Servlet实现, 整个框架采用同一个Servlet,以实现请求的中转; 模型层采用Java实现,主要决定用来做什么;在模型 层后添加了一个DAO,目的是将决定做什么和具体怎 么做分开。 整个Web框架大致的流程是:首先客户端发送请 求,提交JSP页面给中转器(Servlet);中转器根据 客户的请求,选择相应的模型层,即Logic,Logic进 行相应的逻辑处理;如果需要使用数据库,则通过 DAO进行相应的数据库操作。 Spring MVC 架构 Spring MVC是结构最清晰的MVC Model 2实现。它的Action也 不叫Action,而是称做Controller;Controller接收request, response 参数,然后返回ModelAndView(其中的Model不是Object类型, 而是Map类型)。但在其它的Web Framework中,Action返回值一 般都只是一个View Name;Model则需要通过其它的途径(如 request.attribute,Context参数,或Action本身的属性数据)传递上 去。 Spring Web MVC请求处理流程 Spring MVC 特点 清晰的角色划分:控制器(controller)、验证器( validator)、 命令对象(command object)、表单对象 (form object)、模型对象(model object)、 Servlet 分发器(DispatcherServlet)、 处理器映射(handler mapping)、视图解析器(view resolver)等。 每一个角 色都可以由一个专门的对象来实现。 强大而直接的配置方式:将框架类和应用程序类都能作 为JavaBean配置,支持跨多个context的引用,例如,在 web控制器中对业务对象和验证器(validator)的引用。 可适配、非侵入:可以根据不同的应用场景,选择合适 的控制器子类 (simple型、command型、form型、wizard 型、multi-action型或者自定义),而不是从单一控制器 (比如Action/ActionForm)继承。 Spring MVC 特点 可重用的业务代码:可以使用现有的业务对象作为命令 或表单对象,而不需要去扩展某个特定框架的基类。 可定制的绑定(binding) 和验证(validation):比 如将类型不匹配作为应用级的验证错误, 这可以保存错误 的值。再比如本地化的日期和数字绑定等等。在其他某些 框架中,你只能使用字符串表单对象, 需要手动解析它并 转换到业务对象。 可定制的handler mapping和view resolution:Spring 提供从最简单的URL映射, 到复杂的、专用的定制策略。 与某些web MVC框架强制开发人员使用单一特定技术相比, Spring显得更加灵活。 灵活的model转换:在Springweb框架中,使用基于Map的 键/值对来达到轻易地与各种视图技术的集成。 Spring MVC 特点 可定制的本地化和主题(theme)解析:支持在JSP中可 选择地使用Spring标签库、支持JSTL、支持Velocity(不 需要额外的中间层)等等。 简单而强大的JSP标签库(Spring Tag Library):支持 包括诸如数据绑定和主题(theme) 之类的许多功能。 JSP表单标签库:在Spring2.0中引入的表单标签库,使 得在JSP中编写 表单更加容易。 Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session。 11 Spring MVC 入门简介 22 Spring MVC 核心组件 33 Spring MVC Demo 实例 Spring MVC 重要组件 1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系 统的其他模块负责负责对请求进行真正的处理工作。 2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的 Controller. 3.DispatcherServlet将请求提交到目标Controller 4.Controller进行业务逻辑处理后,会返回一个ModelAndView 5.Dispathcher查询一个或多个ViewResolver视图解析器,找到 ModelAndView对象指定的视图对象 6.视图对象负责渲染返回给客户端 Spring MVC 架构类图 DispatcherServlet DispatcherServlet z 应用了“Front Controller”模式 – 是所有 Spring MVC 请求的中枢。 z 继承了HttpServlet,是一个Servlet,由 WebApplicationContext 加载 z 如果不作其它配置,会加载默认组件 在web.xml配DispatcherServlet web.xml … dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation WEB-INF/mvc.xml 1 … HandlerMapping HandlerMapping z 将web请求映射到正确的处理器(handler) 上 , 通常是一个 Controller z 不需用自定义处理器映射 –已经内置了很多 处理器映射策略 z 在处理器映射中通过配置拦截器(包括处理器 执行前、执行后、或者执行前后运行拦截器) 将使其功能更强大 BeanNameUrlHandlerMapping z 把一个 URL 映射到一个和它名字相同的已注册的 bean– 比如 /simple 将映射到一个名为“/simple”的 bean。 z 可以给bean多个名字 (别名) 通过空格来分隔 z 必须有一个name属性 –“/”在xml中不能定义id属性 z 在bean名字中可以使用通配符 (/simple*) z 是默认的 HandlerMapping,如果在上下文中没有找到 处理器映射,DispatcherServlet会为你创建一个 BeanNameUrlHandlerMapping,但不鼓励. BeanNameUrlHandlerMapping dispatcher-servlet.xml SimpleUrlHandlerMapping z 最常用的处理器映射,将请求的URLs 影射到 handlers z 由一系列的分别代表URLs 和bean 的名字的 name/value 对来定义影射。 z Bean的名字可以用通配符 (/simple*) SimpleUrlHandlerMapping dispatcher-servlet.xml … /simple.htm=simpleController /test*=testController … ControllerClassNameHandlerMapping z 支持惯例优先原则 z 在它的应用上下文中找出所有不同的处理器 (handler)(或Controller)bean, 并去掉名称中 的Controller,来定义它的处理器映射。Removed "Controller" from class name {全部转为小写 {前面加 “/” 后面附 "*“ z 例子: {WelcomeController映射到“/welcome*”请 求URL z 极大的减少了映射的配置 ControllerClassNameHandlerMapping dispatcher-servlet.xml … … Controllers Controller 接口 z 负责处理请求 z 内部参数继承 HttpServlet {handleRequest(HttpServletReques t, HttpServletResponse) z 返回一个 ModelAndView对象 z 所有实现都是线程安全的 z 基本不用自己实现接口 – 已经提供了很多实 用的实现类 ModelAndView 对象 z 封装了用来渲染页面的 model和view z Model 用 java.util.Map实现的 z 添加对象,可以不需用名字: {addObject(String, Object) – 用 显式名字添加 {addObject(Object) – 用默认名添 加(惯例优先) z View 用 String 或 View 对象表示 z 类似 Struts的 Action Controller 实现 z 通常在我们的应用中要求Controllers: {自动作默认处理 (不用编码) {简单web处理 {在web 层和service 层之间作相应 的处理 z参数处理 z视图跳转 z输入验证 AbstractController z 提供了简单的操作 z 用来处理一个简单的请求 protected ModelAndView handleRequestInternal( HttpServletRequest request, HttpServletResponse response) { String text = service.getText(); return new ModelAndView( "simple", "text", text); } ThrowawayController z 中文叫做一次性控制器,也就像一次性筷子那 样用完即丢 z 并不在Spring的Controller继承架构中,而是 一个独立的接口定义 z 当映射的不是一个model 对象时很有用 z Bean的作用域必须是prototype ,他们本身不 是线程安全的 ThrowawayController dispatcher-servlet.xml … … 配置作为一个 prototype bean ThrowawayController public class ExampleThrowawayController implements ThrowawayController { private String message; public void setMessage(String message) { this.message = message; } public ModelAndView execute() throws Exception { String hashCodeMessage = "[" + hashCode() + "] - " + message; return new ModelAndView("throwaway", "message", hashCodeMessage); } } Command Controllers z 提供了一种和数据对象交互的方式,并动态地将来自 HttpServletRequest的参数绑定到指定的数据对象上。 z 功能和Struts中的ActionForm有点像,不过在Spring 中,不需要实现任何接口来实现数据绑定 z Command 可以是任何 POJO – 通常是一个 domain对 象 z 提供的功能: {绑定用户类型 {自动验证 {自动创建command对象 Command Controllers z AbstractCommandController – 提供绑定和验 证 z SimpleFormController – 除了提供绑定和验 证, 还提供了工作流中的表单处理 {对表单form处理很有用 z AbstractWizardFormController – 适合涉及 多个页面的表单form处理 其他 Controllers z ServletWrappingController and ServletForwardingController –为了Struts专 门设计的,在spring拦截器里封装了Struts servlet,作用相当于代理Struts的 ActionServlet z ParameterizableViewController – 简单的返回 一个指定的视图名称,不涉及客户端视图技术 (从而避免了在Java代码中的硬编码) z UrlFilenameViewController –会检查URL,获取 文件请求的文件名,并把它作为视图名加以使用。 如: http://www.springframework.org/index.html对 应的视图文件名是index Interceptors Interceptors z 在请求前后添加其它功能 z 包括拦截器方法 – preHandle and postHandle z 包括回调方法 – afterCompletetion z 可以通过 HandlerMapping 和一系列 Controller关联上 Interceptor 实现 z 实现 HandlerInterceptor 或 WebRequestInterceptor z Spring 提供的几个实现 {OvenXxxInViewInteceptor – 用于 ORM 架构JDO, JPA and Hibernate {UserRoleAuthorizationIntercepto r – 用于各种角色授权验证 z 其他有用的扩展: 自定义安全, caching, … Interceptor 例子 {下面的例子提供了一个拦截器,它 拦截所有请求,如果当前时间不是 在上午9点到下午6点,它将用户重 定向到某个页面。 {所有的请求都将被 TimeBasedAccessInterceptor截 获, 如果当前时间不在上班时间, 用户会被重定向到一个静态html页 面,提供诸如只有上班时间才能访 问网站之类的告示。 Interceptor 例子 /*.form=editAccountFormController /*.view=editAccountFormController Interceptor 例子 package samples; public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter { private int openingTime; private int closingTime; public void setOpeningTime(int openingTime) { this.openingTime = openingTime; } public void setClosingTime(int closingTime) { this.closingTime = closingTime; } public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Calendar cal = Calendar.getInstance(); int hour = cal.get(HOUR_OF_DAY); if (openingTime <= hour < closingTime) { return true; } else { response.sendRedirect("http://host.com/outsideOfficeHours.html"); return false; } } } ViewResolver ViewResolver z 从一个逻辑视图名映射到一个视图对象 z 可以排序, 所以能链在一起 z 对JSP用户, 通常实现 InternalResourceViewResolver: 其他 ViewResolver 实现 z VelocityViewResolver – 针对Velocity templates设计的 z FreeMarkerViewResolver – 针对 FreeMarker templates设计的 z ResourceBundleViewResolver {映射关系在一个 properties 文件 {支持国际化 z XmlViewResolver – 映射关系在XML文件 视图 View 视图 View z 支持的几种视图模板技术: {InternalResourceView (JSP) {JstlView (JSP + JSTL) {VelocityView (Velocity) {FreeMarkerView (FreeMarker) {TilesView (Tiles) {TilesJstlView (Tiles + JSTL) View z 还支持渲染下列视图 {Excel files {PDF files {XSLT results {Jasper Reports Spring MVC form处理 z SimpleFormController提供了表单处理通用工 作流程 {提供了用户自定义标签,用来展示和处 理常用的表单 {默认, GET 用于form展示 ,POST 用于 form处理 z 通过一些Controller类实现表单展示处理 z 能处理完整的工作流 – 这是亮点 注册 Command 类 z SimpleFormControllers 关联一个 Command class {因为是紧耦合, 配置这个Controller class是可以的 public class PlayerFormController extends SimpleFormController { public PlayerFormController() { setCommandClass(Player.class); setCommandName("player"); } 展示一个 form z 在工作流中展示 form涉及的三个方法 {formBackingObject – 在form里返回一 个 command 对象 {initBinder – 注册用户自定义属性 {referenceData – 导入要在页面实现的 数据 处理 form表单 z 处理form表单的两个主要方法: {onBindAndValidate() – 允许用户邦定和验 证 {doSubmitAction() – 处理完表单后,回调动 作。 典型的实现是持久化对象到数据库。 Spring MVC 其它特性 z 其它Spring MVC 功能这里不再介绍了,但很 优秀 {处理多请求 {支持自定义主体 {支持国际化 {方便 ServletContextListener 初始化 Log4J {Spring MVC标签
还剩56页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 5 人已下载

下载pdf

pdf贡献者

leonwang

贡献于2012-05-29

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf