1.SpringMVC学习案例标签:springmvcservletstringweb服务hashmap2012-03-2810:142048人阅读评论(0)收藏举报SpringMVC学习指南以下这个学习案例是我最近学习SpringMVC时跟从一本书上的示例,原文中的示例代码有一些小错误,不过我在调试的过程中已经给予了修正,如还有其它错误,还请各位批评指正。对于现有较成熟的Model-View-Control(MVC)框架而言,其解决的主要问题无外乎下面几部分:1.将Web页面中的输入元素封装为一个(请求)数据对象。2.根据请求的不同,调度相应的逻辑处理单元,并将(请求)数据对象作为参数传入。3.逻辑处理单元完成运算后,返回一个结果数据对象。4.将结果数据对象中的数据与预先设计的表现层相融合并展现给用户。各个MVC实现固然存在差异,但其中的关键流程大致如上。结合一个实例,我们来看看这几个关键流程在SpringMVC框架中的处理手法。下面的实例,实现了一个常见的用户登录逻辑,即用户通过用户名和密码登录,系统对用户名和密码进行检测,如果正确,则在页面上显示几条通知信息。如果登录失败,则返回失败界面。(示例中,表示层以JSP2.0实现。)出于简洁考虑,这里的“用户名/密码”检测以及通知信息的生成均在代码中以硬编码实现。首先来看登录界面:对应的index.html:htmlbodyformmethod=POSTaction=login.dopalign=center登录/pbr用户名:inputtype=textname=usernamebr密码:inputtype=passwordname=passwordbrpinputtype=submitvalue=提交name=B1inputtype=resetvalue=重置name=B2/p/form/body/html很简单的一个登录界面,其中包含了一个用以输入用户名密码的form,针对此form的提交将被发送到login.doMVC关键流程的第一步,即收集页面输入参数,并转换为请求数据对象。这个静态页面提供了一个基本的输入界面,下面这些输入的数据将被发送至何处,将如何被转换为请求数据对象?现在来看接下来发发生的事情:当用户输入用户名密码提交之后,此请求被递交给Web服务器处理,上面我们设定form提交目标为login.do,那么Web服务器将如何处理这个请求?显然,标准Http协议中,并没有以.do为后缀的服务资源,这是我们自己定义的一种请求匹配模式。此模式在web.xml中设定:?xmlversion=1.0encoding=ISO-8859-1?web-appxmlns=:xsi=:schemaLocation=://java.sun.com/xml/ns/j2ee/web-app_2_4.xsdversion=2.4servlet⑴servlet-nameDispatcher/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-value/WEB-INF/Config.xml/param-value/init-param/servletservlet-mapping⑵servlet-nameDispatcher/servlet-nameurl-pattern*.do/url-pattern/servlet-mapping/web-app⑴Servlet定义这里我们定义了请求分发Servlet,即:org.springframework.web.servlet.DispatcherServletDispatcherServlet是SpringMVC中负责请_____求调度的核心引擎,所有的请求将由此Servlet根据配置分发至各个逻辑处理单元。其内部同时也维护了一个ApplicationContext实例。我们在init-param节点中配置了名为“contextConfigLocation”的Servlet参数,此参数指定了Spring配置文件的位置“/WEB-INF/Config.xml”。如果忽略此设定,则默认为“/WEB-INF/servletname-servlet.xml”,其中servletname以Servlet名替换(在当前环境下,默认值也就是“/WEB-INF/Dispatcher-servlet.xml)。⑵请求映射我们将所有以.do结尾的请求交给SpringMVC进行处理。当然,也可以设为其他值,如.action、.action等。通过以上设定,Web服务器将把登录界面提交的请求转交给Dispatcher处理,Dispatcher将提取请求(HttpServletRequest)中的输入数据,分发给对应的处理单元,各单元处理完毕后,将输出页面返回给Web服务器,再由Web服务器返回给用户浏览器。Dispatcher根据什么分发这些请求?显然,我们还需要一个配置文件加以设定。这也就是上面提及的Config.xml,此文件包含了所有的“请求/处理单元”关系映射设定,以及返回时表现层的一些属性设置。?xmlversion=1.0encoding=UTF-8?!DOCTYPEbeansPUBLIC-//SPRING//DTDBEAN//EN!--DefinitionofViewResolver--beanid=viewResolver⑴class=org.springframework.web.servlet.view.InternalResourceViewResolverpropertyname=viewClass⑵valueorg.springframework.web.servlet.view.JstlView/value/propertypropertyname=prefix⑶value/WEB-INF/view//value/propertypropertyname=suffix⑷value.jsp/value/property/bean!--RequestMapping--beanid=urlMapping⑸class=org.springframework.web.servlet.handler.SimpleUrlHandlerMappingpropertyname=mappingspropspropkey=/login.doLoginAction/prop/props/property/bean!---ActionDefinition--beanid=LoginAction⑹class=net.xiaxin.action.LoginActionpropertyname=commandClass⑺valuenet.xiaxin.action.LoginInfo/value/propertypropertyname=fail_view⑻valueloginfail/value/propertypropertyname=success_viewvaluemain/value/property/bean/beans⑴Resolver设定Resolver将把输出结果与输出界面相融合,为表现层提供呈现资源。⑵ViewResolver的viewClass参数这里我们使用JSP页面作为输出,因此,设定为:org.springframework.web.servlet.view.JstlView其余可选的viewClass还有:Øorg.springframework.web.servlet.view.freemarker.FreeMarkerView(用于基于FreeMarker模板的表现层实现)Øorg.springframework.web.servlet.view.velocity.VelocityView(用于基于velocity模板的表现层实现)等。⑶⑷ViewResolver的prefix和suffix参数指定了表现层资源的前缀和后缀,运行时,Spring将为指定的表现层资源自动追加前缀和后缀,以形成一个完整的资源路径。另参见⑻⑸“请求/处理单元”关系映射可以看到,这里我们将“/login.do”请求映射到处理单元LoginAction。props节点下可以有多个映射关系存在,目前我们只定义了一个。⑹LoginAction定义这里定义了逻辑处理单元LoginAction的具体实现,这里,LoginAction的实现类为net.xiaxin.action.LoginAction。⑺LoginAction的请求数据对象commandClass参数源于LoginAction的基类BaseCommandController,BaseCommandControlle包含了请求数据封装和验证方法(BaseCommandController.bindAndValidate),它将根据传入的HttpServletRequest构造请求数据对象。这里我们指定commandClass为net.xiaxin.action.LoginInfo,这是一个非常简单的JavaBean,它封装了登录请求所需的数据内容:publicclassLoginInfo{privateStringusername;privateStringpassword;publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username=username;}}Spring会根据LoginAction的commandClass定义自动加载对应的LoginInfo实例。之后,对Http请求中的参数进行遍历,并查找LoginInfo对象中是否存在与之同名的属性,如果找到,则将此参数值复制到LoginInfo对象的同名属性中.请求数据转换完成之后,我们得到了一个封装了所有请求参数的Java对象,并将此对象作为输入参数传递给LoginAction。⑻返回视图定义对于这里的LoginAction而言,有两种返回结果,即登录失败时返回错误界面,登录成功时进入系统主界面。对应我们配置了fail_view、success_view两个自定义参数。参数值将由Resolver进行处理,为其加上前缀后缀,如对于fail_view而言,实际的视图路径为/WEB-INF/view/loginfail.jsp。之后,Resolver会将LoginAction的返回数据与视图相融合,返回最终的显示界面。业务逻辑处理单元:LoginAction.java:publicclassLoginActio