技术开发 频道

基于SPRING框架的MVC应用开发

摘要:这是一个从零点开始,一步一步开发基于Spring框架的有着MVC设计结构的web应用的详细说明。
本文英文版出处:http://www.springframework.org/docs/MVC-step-by-step/Spring-MVC-step-by-step.html

1. 基本应用和环境搭建
必要条件:
? Java SDK(我用的版本是1.4.2)
? Ant(我用的版本是1.6.2)
? Apache Tomcat(我用的版本是5.0.28)

第一步:开发环境目录结构

我们需要一个可以存放所有源代码和其他文件的地方,所以我首先创建一个“springapp”的目录。你可以把这个目录放在你的根目录下,或者其他的地方。我在“projects”目录下创建了这个“springapp”的目录,所以我的目录结构是:“/Users/<useraccount>/projects/springapp”。在这个目录下,我又创建了一个“src”的目录来存放所有Java的源文件。然后我创建了一个“war”的目录,用来存放所有会打到WAR包里的文件。WAR包是用来部署我们的应用的,除去Java之外的所有源文件,比如JSP文件和配置文件等,全属于这个目录。
注意,以下所有例子中的<useraccount>,都应被实际的用户名来置换。

第二步:index.jsp

我首先在war目录下建一个“index.jsp”的JSP页面。这是我们这个应用的入口点。
springapp/war/index.jsp <html> <head><title>Example :: Spring Application</title></head> <body> <h1>Example - Spring Application</h1> <p>This is my test.</p> </body> </html>
在“war”目录下,我建立了一个“WEB-INFO”的目录,在其中我创建了一个“web.xml”文件,这样我的Web应用就完整了。

springapp/war/WEB-INF/web.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'> <web-app> </web-app>
第三步:将这个应用部署到Tomcat上去

下一步,我写了个Ant的编译脚本,自始至终我们这个文档里都要用到这个脚本来完成编译和部署应用的任务。一个单独的编译脚本涵盖了应用服务器端一些特别的任务,还有一些在Tomcat下控制应用的任务。
springapp/build.xml <?xml version="1.0"?> <project name="springapp" basedir="." default="usage"> <property file="build.properties"/> <property name="src.dir" value="src"/> <property name="web.dir" value="war"/> <property name="build.dir" value="${web.dir}/WEB-INF/classes"/> <property name="name" value="springapp"/> <path id="master-classpath"> <fileset dir="${web.dir}/WEB-INF/lib"> <include name="*.jar"/> </fileset> <!-- 我们需要servlet API classes: --> <!-- 如果是Tomcat 4.1的话,用 servlet.jar --> <!-- 如果是Tomcat 5.0的话,用 servlet-api.jar --> <!-- 如果是其他应用服务器的话,参照其相应文档 --> <fileset dir="${appserver.home}/common/lib"> <include name="servlet*.jar"/> </fileset> <pathelement path="${build.dir}"/> </path> <target name="usage"> <echo message=""/> <echo message="${name} build file"/> <echo message="-----------------------------------"/> <echo message=""/> <echo message="Available targets are:"/> <echo message=""/> <echo message="build --> Build the application"/> <echo message="deploy --> Deploy application as directory"/> <echo message="deploywar --> Deploy application as a WAR file"/> <echo message="install --> Install application in Tomcat"/> <echo message="reload --> Reload application in Tomcat"/> <echo message="start --> Start Tomcat application"/> <echo message="stop --> Stop Tomcat application"/> <echo message="list --> List Tomcat applications"/> <echo message=""/> </target> <target name="build" description="Compile main source tree java files"> <mkdir dir="${build.dir}"/> <javac destdir="${build.dir}" target="1.3" debug="true" deprecation="false" optimize="false" failonerror="true"> <src path="${src.dir}"/> <classpath refid="master-classpath"/> </javac> </target> <target name="deploy" depends="build" description="Deploy application"> <copy todir="${deploy.path}/${name}" preservelastmodified="true"> <fileset dir="${web.dir}"> <include name="**/*.*"/> </fileset> </copy> </target> <target name="deploywar" depends="build" description="Deploy application as a WAR file"> <war destfile="${name}.war" webxml="${web.dir}/WEB-INF/web.xml"> <fileset dir="${web.dir}"> <include name="**/*.*"/> </fileset> </war> <copy todir="${deploy.path}" preservelastmodified="true"> <fileset dir="."> <include name="*.war"/> </fileset> </copy> </target> <!-- ============================================================== --> <!-- Tomcat的任务 – 如果你装的不是Tomcat,不要使用以下任务 --> <!-- ============================================================== --> <taskdef name="install" classname="org.apache.catalina.ant.InstallTask"> <classpath> <path location="${appserver.home}/server/lib/catalina-ant.jar"/> </classpath> </taskdef> <taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask"> <classpath> <path location="${appserver.home}/server/lib/catalina-ant.jar"/> </classpath> </taskdef> <taskdef name="list" classname="org.apache.catalina.ant.ListTask"> <classpath> <path location="${appserver.home}/server/lib/catalina-ant.jar"/> </classpath> </taskdef> <taskdef name="start" classname="org.apache.catalina.ant.StartTask"> <classpath> <path location="${appserver.home}/server/lib/catalina-ant.jar"/> </classpath> </taskdef> <taskdef name="stop" classname="org.apache.catalina.ant.StopTask"> <classpath> <path location="${appserver.home}/server/lib/catalina-ant.jar"/> </classpath> </taskdef> <target name="install" description="Install application in Tomcat"> <install url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}" path="/${name}" war="${name}"/> </target> <target name="reload" description="Reload application in Tomcat"> <reload url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}" path="/${name}"/> </target> <target name="start" description="Start Tomcat application"> <start url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}" path="/${name}"/> </target> <target name="stop" description="Stop Tomcat application"> <stop url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}" path="/${name}"/> </target> <target name="list" description="List Tomcat applications"> <list url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}"/> </target> <!-- End Tomcat tasks --> </project>
这个脚本现在包含了所有可以使我们开发任务更简单的目标。对这个脚本,我这里不会过多赘述,因为绝大部分任务都是Ant和Tomcat里最基本的内容。你所需要做的就是将上面这个编译脚本拷贝到你开发环境的根目录下。我们还需要一个“build.properties”的文件,你需要做一些处理来适应你自己的服务器端的环境。这个文件要放在与“build.xml”文件相同的目录下。
springapp/build.properties # Ant的属性文件,用来编译应用 springapp appserver.home=${user.home}/jakarta-tomcat-5.0.28 deploy.path=${appserver.home}/webapps tomcat.manager.url=http://localhost:8080/manager tomcat.manager.username=admin tomcat.manager.password=tomcat
如果你对Tomcat所安装的系统没有所有权(读写和执行的权利),Tomcat的所有者必须将对“webapps”目录的所有权利授予你,或者他必须在“webapps”目录下创建一个新的“springapp”的目录,然后授予你在这个目录下部署应用的权限。在Linux/Unix上,“chmod a+rwx springapp”的命令将授予所有人对该目录的所有权限。

现在,我来执行Ant,确保一切都没有问题。你需要将当前目录设为“springapp”目录。

[<useraccount> @localhost springapp]$ ant Buildfile: build.xml usage: [echo] springapp build file [echo] ----------------------------------- [echo] Available targets are: [echo] build --> Build the application [echo] deploy --> Deploy application as directory [echo] deploywar --> Deploy application as a WAR file [echo] install --> Install application in Tomcat [echo] reload --> Reload application in Tomcat [echo] start --> Start Tomcat application [echo] stop --> Stop Tomcat application [echo] list --> List Tomcat applications BUILD SUCCESSFUL Total time: 2 seconds
最后要做的是实际去将部署完成。再一次执行Ant,同时指明“deploy”或“deploywar”作为目标任务。

[<useraccount>@localhost springapp]$ ant deploy Buildfile: build.xml build: [mkdir] Created dir: /Users/< useraccount >/projects/springapp/war/WEB-INF/classes deploy: [copy] Copying 2 files to /Users/<useraccount>/jakarta-tomcat-5.0.28/webapps/springapp BUILD SUCCESSFUL Total time: 2 seconds
第四步:测试应用

让我们将Tomcat启动,确保我们可以找到应用。可以使用在编译文件里使用“list”的任务来查找Tomcat上已经部署了我们的应用。
[<useraccount>@localhost springapp]$ ant list Buildfile: build.xml list: [list] OK - Listed applications for virtual host localhost [list] /admin:running:0:/Users/<useraccount>/jakarta-tomcat-5.0.28/server/webapps/admin [list] /webdav:running:0:/Users/<useraccount>/jakarta-tomcat-5.0.28/webapps/webdav [list] /servlets-examples:running:0:/Users/<useraccount>/jakarta-tomcat-5.0.28/webapps/servlets-examples [list] /springapp:running:0:/Users/<useraccount> /jakarta-tomcat-5.0.28/webapps/springapp [list] /jsp-examples:running:0:/Users/<useraccount>/jakarta-tomcat-5.0.28/webapps/jsp-examples [list] /balancer:running:0:balancer [list] /tomcat-docs:running:0:/Users/<useraccount>/jakarta-tomcat-5.0.28/webapps/tomcat-docs [list] /:running:0:/Users/<useraccount>/jakarta-tomcat-5.0.28/webapps/ROOT [list] /manager:running:0:/Users/<useraccount>/jakarta-tomcat-5.0.28/server/webapps/manager BUILD SUCCESSFUL Total time: 1 second
如果没有列出来的话,使用“install”的任务来将应用部署到Tomcat上去。
[<useraccount>@localhost springapp]$ ant install Buildfile: build.xml install: [install] OK - Installed application at context path /springapp BUILD SUCCESSFUL Total time: 2 seconds
现在让我们打开一个浏览器,访问这个网址:http://localhost:8080/spring/index.jsp.
第五步:下载Spring的框架文件

如果你还有下载Spring的框架文件,现在做正是时候。我现在使用的是Spring框架的1.2发布版本,它包含了dependencies.zip文件。它可以从www.springframework.org/download.html下载。我在自己的根目录下解压了这个文件。之后我们将用到这个下载中的几个文件。

到此,我们完成了建立环境的所有必要步骤。现在让我们开始开发自己的Spring的MVC应用。

第六步:在WEB-INF的目录下来更改web.xml

进入“springapp/war/WEB-INF”的路径。更改我们之前建立的最简化的“web.xml”文件。我们需要让它符合我们的要求。我们将定义一个“DispatcherServlet”,这个servlet将在所输入信息的基础上来控制所有需求的流向。这个web.xml将有一个标准的servlet匹配行用来匹配我们将要使用的url模式。我决定将任何以“.htm”为扩展名的url传送到“springapp”的“DispatcherServlet”。
springapp/war/WEB-INF/web.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'> <web-app> <servlet> <servlet-name>springapp</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springapp</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file> index.jsp </welcome-file> </welcome-file-list> </web-app>
下一步,在“springapp/war/WEB-INF”路径下建立一个“springapp-servlet.xml”的文件。(你可以从Spring发布的“sample/skeletons/webapp-minimal”路径下拷贝一个范例性文件) “DispatcherServlet”所使用的那些定义就是在这里输入的。这个文件的命名是由web.xml文件中servlet-name的元素名加上“-servlet”而得来的。这个命名规则是Spring框架里的标准。现在,我们可以加入一行bean的定义,“springappController”,将类名定义为“SpringappController”。如此就定义了我们的应用所使用的控制器。我们还需要加入一个url匹配,这样“DispatcherServlet”就晓得对不同的url来激活相应的控制器。
springapp/war/WEB-INF/springapp-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <!-- - Application context definition for "springapp" DispatcherServlet. --> <beans> <bean id="springappController" class="SpringappController"/> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/hello.htm">springappController</prop> </props> </property> </bean> </beans>
第七步:将jars拷贝到WEB-INF/lib中

首先在“war/WEB-INF”目录中新建一个“lib”的目录。接着,从Spring发布的文件中,拷贝spring.jar(具体路径是spring-framework-1.2/dist/spring.jar)到新建的“web/WEB-INF/lib”目录下。然后拷贝commons-logging.jar文件(spring-framework-1.2/lib/Jakarta-commons/commons-logging.jar)到“web/WEB-INF/lib”目录下。我们还需要一个log4j.jar。将log4j-1.2.9.jar(spring-framework-1.2/lib/log4j/log4j-1.2.9.jar)拷贝到“web/WEB-INF/lib”目录下。这些jar文件都将分配给应用服务器,同时在编译时会用到。 第八步: 创建自己的控制器

创建你自己的控制器。我把自己的控制器起名为SpringappController.java,并把它安装在springapp/src的目录下。
Springapp/src/SpringappController.java import org.springframework.web.servlet.mvc.Controller; import org.springframework.web.servlet.ModelAndView; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class SpringappController implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { return new ModelAndView(""); } }
这是你能用到的最基本的控制器(controller)了。我们以后会在这方面做更多的论述,我们也会继承一些现有的抽象类的实施。控制器处理访问需求,同时返回一个ModelAndView的对象。我们还没有定义任何Views,所有现在来讲我们什么也做不了。

第九步:创建应用

运行build.xml中的创建任务。但愿我们的代码编译正常。
[<useraccount>@localhost springapp]$ ant build Buildfile: build.xml build: [javac] Compiling 1 source file to /Users/<useraccount>/projects/springapp/war/WEB-INF/classes BUILD SUCCESSFUL Total time: 2 seconds
第十步:拷贝并更新log4j.properties

Spring框架使用log4j来做日志,所以我们必须建立一个log4j的配置文件。拷贝Petclinic应用范例的log4j.properties文件(spring-framework-1.2/samples/petclinic/war/WEB-INF/log4j.properties)到war/WEB-INF/classes的路径下(这个路径在前面的步骤中以建成)。现在更改log4j.rootCategory这个属性,改变将要写入日志文件的文件名称和地址。我的决定是,同其他Tomcat的日志文件一样,全部写到同一个目录下。
springapp/war/WEB-INF/classes/log4j.properties # For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml! # For all other servers: Comment out the Log4J listener in web.xml to activate Log4J. log4j.rootLogger=INFO, stdout, logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n log4j.appender.logfile=org.apache.log4j.RollingFileAppender log4j.appender.logfile.File=/Users/<useraccount>/jakarta-tomcat-5.0.28/logs/springapp.log log4j.appender.logfile.MaxFileSize=512KB # Keep three backup files. log4j.appender.logfile.MaxBackupIndex=3 # Pattern to output: date priority [category] - message log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
本文未完待续 敬请期待!
0
相关文章