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