SpringMVC框架。用银行示例介绍如何建模和构建简单的应用程序。示例应用程序包含了已经学过的一些技术(例如依赖注入),但是主要演示SpringMVC的特性。 在开始之前,请下载这篇文章的源代码。请参阅参考资料访问Spring框架和Tom
cat5.0,运行示例需要它们。 SpringMVC框架 Spring框架提供了构建Web应用程序的全功能MVC模块。使用Spring可插入的MVC架构,可以选择是使用内置的SpringWeb框架还是Struts这样的Web框架。通过策略接口,Spring框架是高度可配置的,而且包含多种视图技术,例如JavaServerPages(JSP)技术、Velocity、Tiles、iText和POI。SpringMVC框架并不知道使用的视图,所以不会强迫您只使用JSP技术。SpringMVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。 Spring的WebMVC框架是围绕DispatcherServlet设计的,它把请求分派给处理程序,同时带有可配置的处理程序映射、视图解析、本地语言、主题解析以及上载文件支持。默认的处理程序是非常简单的Controller接口,只有一个方法ModelAndViewhandleRequest(request,response)。Spring提供了一个控制器层次结构,可以派生子类。如果应用程序需要处理用户输入表单,那么可以继承AbstractFormController。如果需要把多页输入处理到一个表单,那么可以继承AbstractWizardFormController。 示例应用程序有助于直观地学习这些特性。银行应用程序允许用户检索他们的帐户信息。在构建银行应用程序的过程中,可以学到如何配置SpringMVC框架和实现框架的视图层,视图层包括JSTL标记(用于显示输出的数据)和JavaServerPages技术。 配置SpringMVC 要开始构建示例应用程序,请配置SpringMVC的DispatcherServlet。请在web.xml文件中注册所有配置。清单1显示了如何配置sampleBankingServlet。 清单1.配置SpringMVCDispatcherServlet <servlet> <servlet-name>sampleBankingServlet</servlet-name> <servlet-class> org.springframework.we.servlet.DispatcherServlet <servlet-class> <load-on-startup>1<load-on-startup> <servlet> DispatcherServlet从一个XML文件装入Spring应用程序上下文,XML文件的名称是servlet的名称后面加上-servlet。在这个示例中,DispatcherServlet会从sampleBankingServlet-servlet.xml文件装入应用程序上下文。 配置应用程序的URL 下一步是配置想让sampleBankingServlet处理的URL。同样,还是要在web.xml中注册所有这些信息。 清单2.配置想要处理的URL <servlet-mapping> <servlet-name>sampleBankingServlet<servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> 装入配置文件 下面,装入配置文件。为了做到这点,请为Servlet2.3规范注册ContextLoaderListener或为Servlet2.2及以下的容器注册ContextLoaderServlet。为了保障后向兼容性,请用ContextLoaderServlet。在启动Web应用程序时,ContextLoaderServlet会装入Spring配置文件。清单3注册了ContextLoaderServlet。 清单3.注册ContextLoaderServlet <servlet> <servlet-name>context>servlet-name> <servlet-class> org.springframework.web.context.ContextLoaderServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> contextConfigLocation参数定义了要装入的Spring配置文件,如下面的servlet上下文所示。 <context-param> <param-value>contextConfigLocation</param-value> <param-value>/WEB-INF/sampleBanking-services.xml</param-value> </context-param> sampleBanking-services.xml文件代表示例银行应用程序服务的配置和bean配置。如果想装入多个配置文件,可以在<param-value>标记中用逗号作分隔符。 SpringMVC示例 示例银行应用程序允许用户根据惟一的ID和口令查看帐户信息。虽然SpringMVC提供了其他选项,但是我将采用JSP技术作为视图页面。这个简单的应用程序包含一个视图页用于用户输入(ID和口令),另一页显示用户的帐户信息。 我从LoginBankController开始,它扩展了SpringMVC的SimpleFormController。SimpleFormContoller提供了显示从HTTPGET请求接收到的表单的功能,以及处理从HTTPPOST接收到的相同表单数据的功能。LoginBankController用AuthenticationService和AccountServices服务进行验证,并执行帐户活动。“配置视图属性”一节中的清单5描述了如何把AuthenticationService和AccountServices连接到LoginBankController。清单4显示了LoginBankController的代码。 配置视图属性 下面,我必须注册在接收到HTTPGET请求时显示的页面。我在Spring配置中用formView属性注册这个页面,如清单5所示。sucessView属性代表表单数据提交而且doSubmitAction()方法中的逻辑成功执行之后显示的页面。formView和sucessView属性都代表被定义的视图的逻辑名称,逻辑名称映射到实际的视图页面。 清单5.注册LoginBankController <beanid="loginBankController" class="springexample.controller.LoginBankController"> <propertyname="sessionForm"><value>true</value></property> <propertyname="commandName"><value>loginCommand</value></property> <propertyname="commandClass"> <value>springexample.commands.LoginCommand</value> </property> <propertyname="authenticationService"> <refbean="authenticationService"/> </property> <propertyname="accountServices"> <refbean="accountServices"/> </property> <propertyname="formView"> <value>login</value> </property> <propertyname="successView"> <value>accountdetail</value> </property> </bean> commandClass和commandName标记决定将在视图页面中活动的bean。例如,可以通过login.jsp页面访问loginCommandbean,这个页面是应用程序的登录页面。一旦用户提交了登录页面,应用程序就可以从LoginBankController的onSubmit()方法中的命令对象检索出表单数据。 视图解析器 SpringMVC的视图解析器把每个逻辑名称解析成实际的资源,即包含帐户信息的JSP文件。我用的是Spring的InternalResourceViewResolver,如清单6所示。 因为我在JSP页面中使用了JSTL标记,所以用户的登录名称解析成资源/jsp/login.jsp,而viewClass成为JstlView。 验证和帐户服务 就像前面提到的,LoginBankController内部连接了Spring的AccountServices和AuthenticationService。AuthenticationService类处理银行应用程序的验证。AccountServices类处理典型的银行服务,例如查找交易和电汇。清单7显示了银行应用程序的验证和帐户服务的配置。 清单7.配置验证和帐户服务 <beans> <beanid="accountServices" class="springexample.services.AccountServices"> </bean> <beanid="authenticationService" class="springexample.services.AuthenticationService"> </bean> </beans> 以上服务在sampleBanking-services.xml中注册,然后装入web.xml文件中,就像前面讨论的那样。控制器和服务配置好后,这个简单的应用程序就完成了。现在我们来看看部署和测试它时会发生什么! 部署应用程序 我把示例应用程序部署在Tomcatservlet容器中。Tomcat是JavaServlet和JavaServerPagest技术的官方参考实现中使用的servlet容器。如果以前没这么做过,请下载jakarta-tomcat-5.0.28.exe并运行它把Tomcat安装到自己喜欢的任何位置,例如c:\tomcat5.0。 接下来,下载示例代码并释放到驱动器(例如c:\)上。创建了Spring项目的文件夹之后,打开它并把spring-banking子文件夹拷贝到c:\tomvat5.0\webapps。spring-banking文件夹是一个Web档案,里面包含SpringMVC示例应用程序。lib文件夹包含应用程序需要的Spring框架、与Spring相关的MVC库以及JSTL标记库和jar文件。 要启动Tomcat服务器,请使用以下命令: cdbinC:\Tomcat5.0\bin>catalina.batstart Tomcat应当启动并部署SpringMVC示例应用程序。 测试应用程序 要测试应用程序,请打开Web浏览器,指向
http://localhost:tomcatport/springbanking并用Tomcat服务器实际运行的端口替换tomcatport。应当看到图1所示的登录屏幕。输入用户ID“admin”和口令“password”,并按下登录按钮。其他用户ID或口令会造成来自验证服务的错误。 图1.SpringMVC示例登录屏幕
登录成功之后,会看到图2所示的帐户细节页面。 图2.SpringMVC示例帐户细节页面
结束语 在三部分的Spring系列的第三篇文章中,我介绍了SpringMVC框架的特性。我演示了如何配置和开发SpringMVC应用程序、如何配置SpringMVC控制器和向其中插入依赖项、如何用JavaServerPages技术开发应用程序视图,以及如何把自己的页面与SpringMVC的视图层集成。总结这篇文章时,我演示了如何在Tomcatservlet容器中部署应用程序以及如何在浏览器中测试它。

