读书人

Spring MVC设计形式入门

发布时间: 2012-09-07 10:38:15 作者: rapoo

Spring MVC设计模式入门

作为一个 J2EE 的开发者,我们基本上是开发基于 WEB 的应用系统。事实上,工作流,状态管理以及验证都是需要解决的重要功能。而 HTTP 协议的无状态性决定了这些功能都不容易实现。 Spring 的 WEB 框架就是来帮助我们解决这些问题的。使用 Spring ,我们可以让 WEB 框架自动将传递进来的请求参数填充到模型对象中,同时提供验证和错误处理。还可以管理用户在 WEB 表单中创建的对象的状态。在了解 SpringMVC 之前,我们先来复习下 MVC.

MVC 从逻辑上把应用分为模型组件,视图组件和控制器组件。其中控制器组件又可以细分为:前端控制器组件和后端控制器组件。

我们来看一下 MVC 的基本工作流程:
首先是客户端(通常是浏览器)发出一个请求。第一个接受这个请求的组件一般是一个前端控制器。它将不同的请求交给不同的后端控制器来处理,而在后端控制器里面又可以调用相应的模型对象来处理具体的业务逻辑,最后再返回一个特定的视图响应给客户端。

怎么理解 MVC 呢? 我们举一个现实的例子,前段时间地震太可怕了,全国人民都在上下一心抗震救灾。我们敬爱的总理给武警司令下命令让他完成抗震救灾的艰巨任务,于是武警司 令就根据各地情况派遣不同类型的特种兵到不同的地区去,然后特种兵使用大大小小的工具完成了任务,最后上交给司令一份统计图表,司令再上交给总理。我们 就来分析一下,这符不符合 MVC 的设计模式。这里呢,总理就是客户端,武警司令就是前端控制器,特种兵就是后端控制器,特种兵所使用的工具就是模型,最后上交的统计图表就是视图。

现在大家应该可以理解 MVC 的设计思想了。拿我们比较熟悉的 struts 框架来说,前端控制器就是 ActionServlet, 后端控制器就是 Action. 请求的 URL 和后端控制器的映射关系在 struts-config.xml 上的 <action-mappings> 里面配置,模型对象就是我们平常写的 DAO/DTO ,返回的视图类型一般就是 jsp 了。
????? 那么,在 spring MVC 中又是怎样的呢 ? ,我们先按上面对号入座地说一下。第一个接受这个请求的前端控制器叫 DispatcherServlet ,后端控制器叫 Controller 。负责处理请求 URL 和后端控制器映射的叫 HandMapping ,它有多种类型,比较灵活,也是在一个 xml 文件上进行配置。负责业务逻辑处理的模型对象一般也是我们平常写的 DAO/DTO 组件。只是它最后的返回更灵活, Controller 返回一个 ModelAndView 对象给 DispatcherServlet , ModelAndView 可以携带一个视图对象,也可以携带一个视图对象的逻辑名。如果携带的是一个视图对象的逻辑名,那 DispatcherServlet 需要一个 ViewResolver 来查找用于渲染回应的视图对象。最后, DispatcherServlet 将请求分派给 ModelAndView 对象指定的视图对象。视图对象负责渲染返回给客户的回应。

?????? 我们学习知识,一样要注意运用类比迁移的方法。有人说,我学会了 struts ,但学不会 springMVC 。这是说不过去的。因为二者的思想完全一致。所以,我们只需要学习它们不一样的地方就可以啦。好,我们现在先跑一个最简单的例子,让大家对构建 SpringMVC 的基本步骤有个直观的认识。大家要边跑边跟 struts 做比较。

(1) 建立动态 web 工程,导入 spring 的 jar 包。

(2) 配置 DispatcherServlet

DispatcherServlet 是 SpringMVC 的核心,将下面 Servlet 的注册信息登记在 web.xml 中。一定要记住: Servlet 跟伴侣一样,要结婚,先得注册登记!

< servlet >   < servlet-name > test </ servlet-name >   < servlet-class > org.springframework.web.servlet.DispatcherServlet </ servlet-class >  < load-on-startup > 1 </ load-on-startup >   </ servlet >   < servlet-mapping >   < servlet-name > test </ servlet-name >   < url-pattern > *.do </ url-pattern >   </ servlet-mapping > 

?(3)编写Controller,做核心配置文件,并配置url和Controller的映射

package com.wepull.test; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class HelloController implements Controller{     public ModelAndView handleRequest(HttpServletRequest request,               HttpServletResponse response) throws Exception {              request.setAttribute( "hello" , "welcome to spring!" );              return new ModelAndView( " welcome " );              } } 

?我们知道Struts有个XML格式的核心配置文件,springMVC当然也有,在WEB-INF下新建一XML文件:test-servlet.xml.注意,这里的test取决于servlet的名字.当DispatcherServlet载入后,它将试图从这个文件中载入应用上下文。

<? xml version = "1.0" encoding = "UTF-8" ?> <! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" > < beans >     <!-- 缺省映射处理器,不需要明确声明,但声明后就非常清楚使用的是哪个映射处理器   -->   < bean id = "beanNameUrlMapping"    class = "org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" >    </ bean >     <!-- 这里的 name 属性有两个职责,既定义 Bean 的名字,也定义需要这个控制器处理的 URL 样式 -->     < bean name = "/hello.do"        class = "com.wepull.test.HelloController" >     </ bean > </ beans > 

?上面可能有人奇怪,为什么不用id属性,而设置name属性。这里是因为URL中含有XML id属性非法字符——特别是斜杠(/);

(4)配置一个视图解析器将控制器与JSP结合起来。

将解析器的配置片段加到上面的test-servlet.xml中。

< bean id = "viewResolver"     class = "org.springframework.web.servlet.view.InternalResourceViewResolver" >      < property name = "prefix" value = "/WEB-INF/jsp/" />        < property name = "suffix" value = ".jsp" /> </ bean > 

?InternalResourceViewResolver在ModelAndView返回的视图名前加上prefix属性配置的前缀,再在最后加上suffix属性配置的后缀。由于HelloController返回的ModelAndView中视图名为welcome,所以InternalResourceViewResolver将在/WEB-INF/jsp/welcome.jsp处查找视图。

(5)编写呈现给用户的jsp文件。

/WEB-INF/jsp/welcome.jsp <%@ page contentType = "text/html; charset=UTF-8" %> <%@ page isELIgnored = "false" %> <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %> <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > < html xmlns = "http://www.w3.org/1999/xhtml" >   < head >   < meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" />   < title > Hello World! </ title >   </ head >   < body >   < h2 >    ${hello}   </ h2 >   </ body > </ html > 

?完成后启动服务器,在浏览器地址栏上输入 http://locahost:8080/projectName/hello.do?????? 就可以访问了。
?????? 对照一下,我们发现 SpringMVC 跟 Struts 大同小异。只是有两处映射, SpringMVC 做的相对灵活。哪两处呢?
(1) url 和动作 ( 后端控制器 ) 的映射。
springMVC 里有个映射处理器 (HandlerMapping) 的概念。它实际上是一个处理器映射 Bean, 用来将一个控制器指定到一个 URL 上。 Spring 提供了三种有用的 HandlerMapping 的实现:
—— BeanNameUrlHandlerMapping
?????? 根据控制器的名字将控制器映射到 URL
—— SimpleUrlHandlerMapping
?????? 用上下文配置文件中定义的属性集合将控制器映射到 URL
—— CommonsPathMapHandlerMapping
?????? 使用控制器代码中的元数据将控制器映射到 URL??
(2) 逻辑视图名和视图对象的映射。
springMVC 里还有个视图解析器 (ViewResolver) 的概念。它决定了 ModelAndView 对象的逻辑视图名如何解析成一个用于将结果渲染给用户的视图 Bean..Spring 有四种 ViewResolver 实现:
—— InternalResourceViewResolver
?????? 将逻辑视图名解析成一个用模板文件 ( 如 JSP 和 Velocity 模板 ) 渲染的视图对象
—— BeanNameViewResolver
?????? 将逻辑视图名解析成一个 DispatcherServlet 应用上下文中的视图 Bean
—— ResourceBundleViewResolver
?????? 将逻辑视图名解析成一个 ResourceBundler 中的视图对象
—— XmlViewResolver
?????? 从一个 XML 文件中解析视图 Bean, 这个文件是从 DispatcherServlet 应用上下文中分离出来的。
?????? 好啦,今天就算是 SpringMVC 的一个入门。建议大家将 Struts 和 SpringMVC 对照着学习,那样效果会更好。与人分享,集思广益。希望大家都能够学习快乐,工作顺心。下次再见。

?

读书人网 >软件开发

热点推荐