今天难得做些基本功的复习功课,转了半天却发现原来自己知道的并不如自己想象的那么多。好几小时才把Spring+Freemarker的网络应用框架建立起来。Google了一下,没有发现特别全的教程,所以记在这里,权当是自己做的笔记了。
小Lo这里用的IDE是IntelliJ,如果有朋友用其他的IDE,比如NetBeans或者Eclipse,基本常识是一样的。由于小Lo常年在英国生活,可能会出现很多不知道中文的英文词,大家多包涵。
(1)最上层结构:
一个网络应用最普通的结构为如下:
+MyWebProject
----+business-logic
----+webapp
其中,MyWebProject在此作为parent module,而business-logic作为包含逻辑(诸如dao,service之流)的child module,Webapp则作为包含前端view(诸如controller,WEB-INF)的chlid module。每个module应当包含一个Maven用到的pom.xml。
最基本的MyWebProject的pom.xml为如下:
这里modules的部分定义了两个child module。
而同理的,business-logic的pom.xml为:
parent部分指向主module。
而webapp基本pom与以上一致,这里就不列出来了。
(2)引入Spring+Hibernate
既然用Maven,自然的,就在parent module的pom.xml定义就OK了:
由于是在parent module定义的,所有child module会自然继承。
(3)项目结构扫尾:
business-logic以及webapp应该各有两个文件夹,分别为main及test,main放实代码,test放测试代码。而main及test下各分src及resource,src部分放代码,resource放需要的所有资源xml,properties文件等等。IntelliJ下截图如下:
(4)WEB-INF及web.xml设置
在webapp/src/main下建立java及webapp文件夹,java自然是放与view有关的java文件,而webapp则是我们的web facet folder。再在webapp文件夹下新建一文件夹,名为WEB-INF,里面放上作为网络应用重要核心的web.xml。小Lo很辛苦地Google了好几圈,没有发现全的适用于此环境的web.xml,边边角角地凑齐的web.xml如下:
要注意的是,我们要建立的是用Spring的网络应用,因此这里的Servlet class用了Spring自带的DispatcherServlet。该class在Spring 2.0之前貌似都在spring-web的jar下,但是2.0以上的版本都把它移到了spring-webmvc的jar下,因此,要用它的话,还要辛苦地再加一个dependency(加在parent或者是webapp的module下pom皆可):
(5)Freemarker及servlet文件设置:
在webapp的pom.xml里面应该加入一个freemarker的dependency,具体加法不细述了,因为实在简单,和上文spring-webmvc很像。
以上web.xml已经建立起了一个名为test的servlet,因此,为方便用Jetty,在WEB-INF下建立名为test-servlet.xml的Spring facet:
这里freemarkerConfig是可以对freemarker进行一些自定义设置的bean。这里用了templateLoaderPath这个属性,告知Spring所有的freemarker template都可以在WEB-INF/freemarker下找到。
下面的viewResolver是很关键的一个bean,因为它主要告诉Spring如何找到并对待与view直接有关的文件,此处所有*.ftl(即Freemarker文件)皆为view。
下面的SimpleUrlHandlerMapping是告诉Spring什么地址该用什么bean解决,而该bean则在下面定义。此处该测试项目已经有了test.ftl及TestController文件。具体写法就不细述了,因为不属于设置的一部分。
(6)Jetty设置:
Jetty是和Maven联系比较紧密的web server,由于比Tomcat轻便很多,小Lo在写代码的时候惯用Jetty,而Tomcat是作为实际服务器上配置才用的server。具体设置法为在webapp的pom.xml加入以下代码:
这里小Lo用了自定义的端口号,因为默认的8080实在是有太多东西想用了,所以小Lo惯用12345作为Jetty的端口,大家也可以随便用自己喜欢的。
另,如果说大家不用传统的Spring controller写法(就是返回ModelAndView那种的handleRequestMapping),而是用比较新比较合理的Annotation式controller的话,一定要在parent module的pom.xml再加上以下这段:
这是告诉maven用Java1.6进行compile,否则默认的1.3是不认annotation的,请大家一定要注意。
好啦,所有设置到这边大概大功告成了。由于最基础的网络应用并不一定要用到数据库,因此hibernate基本没怎么讲,下次开篇文章专讲hibernate有关设置吧。大家写程序愉快!