springmvc集成表现层.docx
《springmvc集成表现层.docx》由会员分享,可在线阅读,更多相关《springmvc集成表现层.docx(37页珍藏版)》请在冰豆网上搜索。
springmvc集成表现层
主题:
springmvc集成表现层
内容部分:
Spring之所以出色的一个原因就是将表现层从MVC的框架中分离出来。
例如,通过配置就可以让Velocity或者XSLT来代替已经存在的JSP页面。
本章介绍和Spring集成的一些主流表现层技术,并简要描述如何集成新的表现层。
这里假设你已经熟悉第12.5节“视图与视图解析”,那里介绍了将表现层集成到MVC框架中的基本知识。
和JSP&JSTL一起使用Spring
Spring为JSP和JSTL提供了一组方案(顺便说一下,它们都是最流行的表现层技术之一)。
使用JSP或JSTL需要使用定义在WebApplicationContext里的标准的视图解析器。
此外,你当然也需要写一些JSP页面来显示页面。
这里描述一些Spring为方便JSP开发而提供的额外功能。
视图解析器
就象和Spring集成的其他表现层技术一样,对于JSP页面你需要一个视图解析器来解析。
最常用的JSP视图解析器是InternalResourceViewResolver和ResourceBundleViewResolver。
它们被定义在WebApplicationContext里:
#TheResourceBundleViewResolver:
views
#Andasamplepropertiesfileisuses(views.propertiesinWEB-INF/classes):
welcome.class=org.springframework.web.servlet.view.JstlView
welcome.url=/WEB-INF/jsp/welcome.jsp
productList.class=org.springframework.web.servlet.view.JstlView
productList.url=/WEB-INF/jsp/productlist.jsp
你可以看到ResourceBundleViewResolver需要一个属性文件来把视图名称映射到1)类和2)URL。
通过ResolverBundleViewResolver,你可以用一个解析器来解析两种类型的视图。
org.springframework.web.servlet.view.JstlView
/WEB-INF/jsp/
.jsp
InternalResourceBundleViewResolver可以配置成使用JSP页面。
作为好的实现方式,强烈推荐你将JSP文件放在WEB-INF下的一个目录中,这样客户端就不会直接访问到它们。
普通JSP页面和JSTL
当你使用Java标准标签库(JavaStandardTagLibrary)时,你必须使用一个特殊的类,JstlView,因为JSTL在使用象I18N这样的功能前需要一些准备工作。
其他有助于开发的标签
正如前面几章所提到的,Spring可以将请求参数绑定到命令对象上。
为了更容易地开发含有数据绑定的JSP页面,Spring定义了一些专门的标签。
所有的Spring标签都有HTML转义功能来决定是否使用字符转义。
标签库描述符(TLD)和库本身都包含在spring.jar里。
Tiles象其他表现层技术一样,可以集成在使用Spring的Web应用中。
下面大致描述一下过程。
所需的库文件
为了使用Tiles,你必须将需要的库文件包含在你的项目中。
下面列出了这些库文件。
strutsversion1.1
commons-beanutils
commons-digester
commons-logging
commons-lang
这些文件以从Spring中获得。
如何集成Tiles
为了使用Tiles,你必须用定义文件(definitionfile)来配置它(有关于定义(definition)和其他Tiles概念,请参考http:
//jakarta.apache.org/struts)。
在Spring中,这些都可以使用TilesConfigurer在完成。
下面是ApplicationContext配置的片段。
org.apache.struts.tiles.xmlDefinition.I18nFactorySet
/WEB-INF/defs/general.xml
/WEB-INF/defs/widgets.xml
/WEB-INF/defs/administrator.xml
/WEB-INF/defs/customer.xml
/WEB-INF/defs/templates.xml
你可以看到,有五个文件包含定义,它们都存放在WEB-INF/defs目录中。
当初始化WebApplicationContext时,这些文件被读取,并且初始化由factoryClass属性指定的定义工厂(definitonsfactory)。
在这之后,你的SpringWeb应用就可以使用在定义文件中的tilesincludes内容。
为了使用这些,你必须得和其他表现层技术一样有一个ViewResolver。
有两种可以选择,InternalResourceViewResolver和ResourceBundleViewResolver。
InternalResourceViewResolver
InternalResourceViewResolver用viewClass属性指定的类实例化每个它解析的视图。
ResourceBundleViewResolver
必须提供给ResourceBundleViewResolver一个包含viewnames和viewclassess属性的属性文件。
views
...
welcomeView.class=org.springframework.web.servlet.view.tiles.TilesView
welcomeView.url=welcome(thisisthenameofadefinition)
vetsView.class=org.springframework.web.servlet.view.tiles.TilesView
vetsView.url=vetsView(again,thisisthenameofadefinition)
findOwnersForm.class=org.springframework.web.servlet.view.JstlView
findOwnersForm.url=/WEB-INF/jsp/findOwners.jsp
...
你可以发现,当使用ResourceBundleViewResolver,你可以使用不同的表现层技术。
Velocity是Jakarta项目开发的表现层技术。
有关与Velocity的详细资料可以在http:
//jakarta.apache.org/velocity找到。
这一部分介绍如何集成Velocity到Spring中。
所需的库文件
在使用Velocity之前,你需要在你的Web应用中包含两个库文件,velocity-1.x.x.jar和commons-collections.jar。
一般它们放在WEB-INF/lib目录下,以保证J2EE服务器能够找到,同时把它们加到你的classpath中。
当然假设你也已经把spring.jar放在你的WEB-INF/lib目录下!
最新的Velocity和commnonscollections的稳定版本由Spring框架提供,可以从/lib/velocity和/lib/jakarta-commons目录下获取。
分发器(DispatcherServlet)上下文
你的SpringDispatcherServlet配置文件(一般是WEB-INF/[servletname]-servlet.xml)应该包含一个视图解析器的bean定义。
我们也可以再加一个bean来配置Velocity环境。
我指定DispatcherServlet的名字为‘frontcontroller’,所以配置文件的名字反映了DispatcherServlet的名字
下面的示例代码显示了不同的配置文件
--===========================================================-->
--Viewresolver.Requiredbywebframework.-->
--===========================================================-->
--
ViewresolverscanbeconfiguredwithResourceBundlesorXMLfiles.Ifyouneed
differentviewresolvingbasedonLocale,youhavetousetheresourcebundleresolver,
otherwiseitmakesnodifference.IsimplyprefertokeeptheSpringconfigsand
contextsinXML.SeeSpringdocumentationformoreinfo.
-->
true
/WEB-INF/frontcontroller-views.xml
--===========================================================-->
--Velocityconfigurer.-->
--===========================================================-->
--
ThenextbeansetsuptheVelocityenvironmentforusbasedonapropertiesfile,the
locationofwhichissuppliedhereandsetonthebeaninthenormalway.Myexampleshows
thatthebeanwillexpecttofindourvelocity.propertiesfileintherootofthe
WEB-INFfolder.Infact,sincethisisthedefaultlocation,it'snotnecessaryforme
tosupplyithere.Anotherpossibilitywouldbetospecifyallofthevelocity
propertieshereinapropertysetcalled"velocityProperties"anddispensewiththe
actualvelocity.propertiesfilealtogether.
-->
id="velocityConfig"
class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"
singleton="true">
/WEB-INF/velocity.properties
Velocity.properties
这个属性文件用来配置Velocity,属性的值会传递给Velocity运行时。
其中只有一些属性是必须的,其余大部分属性是可选的-详细可以查看Velocity的文档。
这里,我仅仅演示在Spring的MVC框架下运行Velocity所必需的内容。
模版位置
大部分属性值和Velocity模版的位置有关。
Velocity模版可以通过classpath或文件系统载入,两种方式都有各自的优缺点。
从classpath载入具有很好的移植性,可以在所有的目标服务器上工作,但你会发现在这种方式中,模版文件会把你的java包结构弄乱(除非你为模版建立独立树结构)。
从classpath载入的另一个重要缺点是在开发过程中,在源文件目录中的任何改动常常会引起WEB-INF/classes下资源文件的刷新,这将导致开发服务器重启你的应用(代码的即时部署)。
这可能是令人无法忍受的。
一旦完成大部分的开发工作,你可以把模版文件存在在jar中,并把它放在WEB-INF/lib目录下中。
velocity.properties示例
这个例子将Velocity模版存放在文件系统的WEB-INF下,客户浏览器是无法直接访问到它们的,这样也不会因为你开发过程中修改它们而引起Web应用重启。
它的缺点是目标服务器可能不能正确解析指向这些文件的路径,尤其是当目标服务器没有把WAR模块展开在文件系统中。
Tomcat4.1.x/5.x,WebSphere4.x和WebSphere5.x支持通过文件系统载入模版。
但是你在其他类型的服务器上可能会有所不同。
#
#velocity.properties-exampleconfiguration
#
#uncommentthenexttwolinestoloadtemplatesfromthe
#classpath(i.e.WEB-INF/classes)
#resource.loader=class
#class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
#commentthenexttwolinestostoploadingtemplatesfromthe
#filesystem
resource.loader=file
file.resource.loader.class=org.apache.velocity.runtime.resource.loader.FileResourceLoader
#additionalconfigforfilesystemloaderonly..tellVelocitywheretheroot
#directoryisfortemplateloading.Youcandefinemultiplerootdirectories
#ifyouwish,Ijustusetheonehere.Seethetextbelowforanoteabout
#the${webapp.root}
file.resource.loader.path=${webapp.root}/WEB-INF/velocity
#cachingshouldbe'true'inproductionsystems,'false'isadevelopment
#settingonly.Changeto'class.resource.loader.cache=false'forclasspath
#loading
file.resource.loader.cache=false
#overridedefaultloggingtodirectvelocitymessages
#toourapplicationlogforexample.Assumesyouhave
#definedalog4j.propertiesfile
runtime.log.logsystem.log4j.category=com.mycompany.myapplication
Web应用的根目录标记
上面在配置文件资源载入时,使用一个标记${webapp.root}来代表Web应用在文件系统中的根目录。
这个标记在作为属性提供给Velocity之前,会被Spring的代码解释成和操作系统有关的实际路径。
这种文件资源的载入方式在一些服务器中是不可移植的。
如果你认为可移植性很重要,可以给VelocityConfigurer定义不同的“appRootMarker”,来修改根目录标记本身的名字。
Spring的文档对此有详细表述。
另一种可选的属性规范
作为选择,你可以用下面的内嵌属性来代替Velocity配置bean中的“configLocation”属性,从而直接指定Velocity属性。
file
org.apache.velocity.runtime.resource.loader.
FileResourceLoader
${webapp.root}/WEB-INF/velocity
false
缺省配置(文件资源载入)
注意从Spring1.0-m4起,你可以不使用属性文件或内嵌属性来定义模版文件的载入,你可以把下面的属性放在Velocity配置bean中。
/WEB-INF/velocity/
视图配置
配置的最后一步是定义一些视图,这些视图和Velocity模版一起被显示。
视图被定义在Spring上下文文件中。
正如前面提到的,这个例子使用XML文件定义视图bean,但是也可以使用属性文件(ResourceBundle)来定义。
视图定义文件的名字被定义在
WEB-INF/frontcontroller-servlet.xml文件的ViewResolver的bean中。
--
Viewscanbehierarchical,here'sanexampleofaparentviewthat
simplydefinestheclasstouseandsetsadefaulttemplatewhich
willnormallybeoverriddeninchilddefinitions.
-->
mainTemplate.vm
--
-Themainviewforthehomepage.Sincewedon'tsetatemplatename,thevalue
fromtheparentisused.
-->
MyVelocityHomePage
--
-Anotherview-thisonedefinesadifferentvelocitytemplate.
-->
se