使用Spring MVC3构建Web应用详细教程

本文将指导大家如何使用Spring MVC3去构建一个Web应用。在Spring MVC中,所有的用户请求都会被派发到控制器模块,控制器然后再根据业务逻辑去调用数据访问层获得数据,最后通过JSP视图返回。

  在动手之前,我们先准备好我们的环境,需要的是JDK 1.5以上以及Eclipse IDE(或者Myeclipse),当然还要下载最新版本的Spring 3,本文还要下载最新版本的ant,以便我们学习如何通过ant去构建应用。

  Spring MVC3构建Web应用第一步

  首先在Eclipse中利用新建菜单,建立一个Dynamic Web Project(动态Web工程),命名为SampleSpringMVC,接下来,我们要建立一个ant.xml的文件,这个文件会方便我们把做好的程序打包成war文件,这个可以有如下几步去实现:

  1、点文件—新建—文件,如下图:


  2、输入ant.xml作为文件名,并点完成。如下图:


  3、打开ant.xml文件,编辑内容如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0"?>  
  2. <!-- Copyright : adobocode.com , 2010 -->  
  3. <project name="SampleSpringMVC" basedir="." default="build">  
  4. <property file="ant.properties" />  
  5. <property name="src.dir" value="src" />  
  6. <property name="war.dir" value="WebContent" />  
  7. <property name="build.dir" value="${war.dir}/WEB-INF/classes" />  
  8. <property name="deploy.path" value="${tomcat.home}/webapps" />  
  9. <property name="name" value="SampleSpringMVC" />  
  10. <path id="master-classpath">  
  11. <fileset dir="${war.dir}/WEB-INF/lib">  
  12. <include name="*.jar" />  
  13. </fileset>  
  14. <fileset dir="${tomcat.home}/lib">  
  15. <include name="servlet*.jar" />  
  16. </fileset>  
  17. <pathelement path="${build.dir}" />  
  18. </path>  
  19. <target name="build" description="Compile main source tree java files">  
  20. <echo>Building...</echo>  
  21. <mkdir dir="${build.dir}" />  
  22. <javac destdir="${build.dir}" failonerror="true">  
  23. <src path="${src.dir}" />  
  24. <classpath refid="master-classpath" />  
  25. </javac>  
  26. </target>  
  27. <target name="war-archiving">  
  28. <echo>Archiving...</echo>  
  29. <war destfile="${name}.war" webxml="${war.dir}/WEB-INF/web.xml">  
  30. <fileset dir="${war.dir}">  
  31. <include name="**/*.*" />  
  32. </fileset>  
  33. </war>  
  34. </target>  
  35. <target name="deploy" depends="build">  
  36. <echo>Deploying...</echo>  
  37. <copy todir="${deploy.path}">  
  38. <fileset dir=".">  
  39. <include name="*.war" />  
  40. </fileset>  
  41. </copy>  
  42. </target>  
  43. </project>  


  Spring MVC3构建Web应用第二步

  建立一个ant.properties文件,该文件会存放一些值的属性,并且这些值也会是ant.xml中用到的。请按如下步骤实现:

  1)点文件—新建-文件

  2) 将文件命名为ant.properties,并点完成,如下图:


  3)打开ant.properties,修改tomcat.home的目录为你安装tomcat的实际目录。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. tomcat.home=D:/Program Files/apache-tomcat-6.0.37  
  2. tomcat.lib=${tomcat.home}/lib  


  下载下面列表的.jar文件,并放到SampleSpringMVC/war/WEB-INF/lib下。

1 commons - logging.jar
2 jstl - api - 1.2 .jar
3 jstl.jar
4 org.springframework.asm - 3.0 . 5 .RELEASE.jar
5 org.springframework.beans - 3.0 . 5 .RELEASE.jar
6 org.springframework.context - 3.0 . 5 .RELEASE.jar
7 org.springframework.core - 3.0 . 5 .RELEASE.jar
8 org.springframework.expression - 3.0 . 5 .RELEASE.jar
9 org.springframework.web - 3.0 . 5 .RELEASE.jar
10 org.springframework.web.servlet - 3.0 . 5 .RELEASE.jar
11 standard.jar

  按如下修改web.xml:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  6. <servlet>  
  7. <servlet-name>SampleSpringMVC</servlet-name>  
  8. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  9. <load-on-startup>1</load-on-startup>  
  10. </servlet>  
  11. <servlet-mapping>  
  12. <servlet-name>SampleSpringMVC</servlet-name>  
  13. <url-pattern>*.htm</url-pattern>  
  14. </servlet-mapping>  
  15. </web-app>  

  创建index.jsp,这个只需要在war/WEB-INF下建立即可,并且将内容设置为如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" session="false"  
  2. contentType="text/html; charset=UTF-8"%>  
  3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  4. <html>  
  5. <head>  
  6. <title>Adobocode : Sample Spring MVC</title>  
  7. </head>  
  8. <body>  
  9. <h2>Adobocode : Hello World</h2>  
  10. <br />  
  11. <a href="<c:url value="personDisplay.htm"/>">Person List</a>  
  12. </body>  
  13. </html>  

  Spring MVC3构建Web应用第三步

  在SampleSpringMVC/war/WEB-INF中建立文件SampleSpringMVC-servlet.xml,并将内容修改如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2.   
  3. <!-- Copyright : adobocode.com , 2010 -->  
  4.   
  5. <beans xmlns="http://www.springframework.org/schema/beans"  
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  7. xmlns:p="http://www.springframework.org/schema/p"  
  8. xmlns:context="http://www.springframework.org/schema/context"  
  9. xsi:schemaLocation="   
  10. http://www.springframework.org/schema/beans  
  11. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  12. http://www.springframework.org/schema/context   
  13. http://www.springframework.org/schema/context/spring-context-3.0.xsd">   
  14.   
  15. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>  
  16. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>   
  17. <context:component-scan base-package="paul.sydney.controller"/>   
  18. <context:component-scan base-package="paul.sydney.service"/>  
  19. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">   
  20. <property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>   
  21. <property name="prefix"><value>/WEB-INF/jsp/</value></property>   
  22. <property name="suffix"><value>.jsp</value></property>   
  23. </bean>   
  24. </beans>  

  这里,我们利用了spring 3 mvc的新特性,自动扫描,通过context:component-scan base-package,设置了paul.syney.controller和paul.sydney.service两个包下的文件只要使用spring 3的标准注释都可以被扫描到。

  在SampleSpringMVC/war/WEB-INF下建立目录jsp;

  在SampleSpringMVC/war/WEB-INF下建立目录classes;

  在SampleSpringMVC/war/WEB-INF/jsp下建立一个新的jsp文件叫personDisplay,并写入如下代码:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!-- Copyright : adobocode.com , 2010 -->  
  2.   
  3. <%@ page language="java" session="false"   
  4.    contentType="text/html; charset=UTF-8"%>   
  5. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>   
  6. <jsp:useBean id="personList" scope="request" type="java.util.List" />   
  7. <html>   
  8.     <head>   
  9.         <title>Adobocode : Sample Spring MVC using JSTL iteration</title>   
  10.     </head>  
  11.     <body>  
  12.         <h2>Adobocode : Person List</h2>   
  13.         <table border="1">   
  14.            <tr>   
  15.                 <th>Id</th>   
  16.                 <th>Name</th>   
  17.                 <th>Age</th>   
  18.                 <th>Address</th>   
  19.             </tr>   
  20.           <c:forEach var="p" items="${personList}">   
  21.             <tr>   
  22.                 <td>   
  23.                     <c:url var="editUrl" value="personForm.htm">   
  24.                          <c:param name="personId" value="${p.id}" />   
  25.                     </c:url>   
  26.                    <a href='<c:out value="${editUrl}"/>'>${p.id}</a>   
  27.                 </td>   
  28.                <td>${p.name}</td>   
  29.                <td>${p.age}</td>   
  30.                <td>${p.address}</td>   
  31.             </tr>   
  32.           </c:forEach>   
  33.       </table>   
  34.    </body>  
  35. </html>  

  在SampleSpringMVC/war/WEB-INF/jsp下建立一个新的jsp文件叫personForm,修改代码如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!-- Copyright : adobocode.com , 2010 -->  
  2.   
  3. <%@ page language="java" session="false"  
  4.     contentType="text/html; charset=UTF-8"%>  
  5. <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>  
  6. <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>  
  7. <html>  
  8. <head>  
  9. <title>Adobocode : Sample Spring MVC using Forms</title>  
  10. </head>  
  11.   
  12. <body>  
  13.   <h2>Adobocode : Person Form</h2>  
  14.   <form:form modelAttribute="person">  
  15.   <form:hidden path="id" />  
  16.   <fieldset>  
  17.     <table>  
  18.       <tr>  
  19.         <td>Name</td>  
  20.         <td><form:input path="name" />  
  21.         </td>  
  22.       </tr>  
  23.       <tr>  
  24.         <td>Age</td>  
  25.         <td><form:input path="age" />  
  26.         </td>  
  27.       </tr>  
  28.       <tr>  
  29.         <td>Address</td>  
  30.         <td><form:input path="address" />  
  31.         </td>  
  32.       </tr>  
  33.       <tr>  
  34.         <td></td>  
  35.         <td><input type="submit" id="save" name="_eventId_save"  
  36.           value="Save" /> <input type="submit" onClick="history.go(-1);"  
  37.           name="_eventId_cancel" value="Cancel" /></td>  
  38.       </tr>  
  39.     </table>  
  40.   </fieldset>  
  41.   </form:form>  
  42. </body>  
  43. </html>  

  Spring MVC3构建Web应用第四步

  现在我们开始设计控制器,鼠标右击src目录,选择新建-包,如下图:


  并将包的名命名为paul.sydney.controller,在这个包中,新建立一个类,命名为PersonDisplay,将代码修改如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package paul.sydney.controller;  
  2.   
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4. import org.springframework.stereotype.Controller;  
  5. import org.springframework.ui.ModelMap;  
  6. import org.springframework.web.bind.annotation.RequestMapping;  
  7.   
  8. import paul.sydney.service.DummyService;  
  9.   
  10. @Controller  
  11. public class PersonDisplay {  
  12.   private final DummyService dummyService;  
  13.     
  14.   @Autowired  
  15.   public PersonDisplay(DummyService dummyService) {  
  16.     this.dummyService = dummyService;  
  17.   }  
  18.   
  19.   @RequestMapping("/personDisplay.htm")  
  20.   public ModelMap defaultHandler() {  
  21.     return new ModelMap("personList"this.dummyService.getDummyList());  
  22.   }  
  23. }  

  这里,使用注解@Controller表示这个是一个控制器,而 @RequestMapping("/personDisplay.htm")则表示对于personDisplay.htm这样的请求,使用defaultHandler这个方法去处理。而在defaultHandler中,又调用了逻辑服务层的

  dummyService.getDummyList()方法获得人员列表,最后把列表存放到一个ModelMap中去(可以先理解为Map的一种数据结构)。

  同样地,在paul.sydney.controller包中,新建一个类PersonForm,并将代码修改如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package paul.sydney.controller;  
  2.   
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4. import org.springframework.stereotype.Controller;  
  5. import org.springframework.ui.ModelMap;  
  6. import org.springframework.validation.BindingResult;  
  7. import org.springframework.web.bind.annotation.ModelAttribute;  
  8. import org.springframework.web.bind.annotation.RequestMapping;  
  9. import org.springframework.web.bind.annotation.RequestMethod;  
  10. import org.springframework.web.bind.annotation.RequestParam;  
  11. import org.springframework.web.bind.annotation.SessionAttributes;  
  12. import org.springframework.web.bind.support.SessionStatus;  
  13.   
  14. import paul.sydney.model.Person;  
  15. import paul.sydney.service.DummyService;  
  16.   
  17. @Controller  
  18. @RequestMapping("/personForm.htm")  
  19. @SessionAttributes("person")  
  20. public class PersonForm {  
  21.   private final DummyService dummyService;  
  22.   
  23.   @Autowired  
  24.   public PersonForm(DummyService dummyService) {  
  25.     this.dummyService = dummyService;  
  26.   }  
  27.   
  28.   @RequestMapping(method = RequestMethod.GET)  
  29.   public String setupForm(@RequestParam("personId"int id, ModelMap model) {  
  30.     Person person = this.dummyService.retrievePerson(id);  
  31.     model.addAttribute("person", person);  
  32.     return "personForm";  
  33.   }  
  34.   
  35.   @RequestMapping(method = RequestMethod.POST)  
  36.   public String processSubmit(@ModelAttribute("person") Person person,  
  37.       BindingResult result, SessionStatus status) {  
  38.         this.dummyService.savePerson(person);  
  39.         status.setComplete();  
  40.         return "redirect:personDisplay.htm";  
  41.       }  
  42.   }   

  这里,首先通过依赖注入,注入了服务层逻辑dummyService,然后在setupForm中,根据传入的参数personId,通过服务层逻辑dummyService找出这个人,然后将其保存到一个Model中去,返回给视图层personForm.jsp显示;而processSubmit是调用服务层逻辑保存用户的资料(通过this.dummyService.savePerson(person)实现),最后使用redirect跳转到personDisplay.htm。


  Spring MVC3构建Web应用第五步

  构建业务实体模型。在src目录中,新建包命名为paul.sydney.model,在这个包下,再新建一个实体类,命名为Person,修改代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package paul.sydney.model;  
  2.   
  3. public class Person {  
  4.     private int id;  
  5.     private String name;  
  6.     private int age;  
  7.     private String address;  
  8.   
  9.     public int getId() {  
  10.         return id;  
  11.     }  
  12.   
  13.     public void setId(int id) {  
  14.         this.id = id;  
  15.     }  
  16.   
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.   
  21.     public void setName(String name) {  
  22.         this.name = name;  
  23.     }  
  24.   
  25.     public int getAge() {  
  26.         return age;  
  27.     }  
  28.   
  29.     public void setAge(int age) {  
  30.         this.age = age;  
  31.     }  
  32.   
  33.     public String getAddress() {  
  34.         return address;  
  35.     }  
  36.   
  37.     public void setAddress(String address) {  
  38.         this.address = address;  
  39.     }  
  40.   
  41.     @Override  
  42.     public String toString() {  
  43.         StringBuilder sb = new StringBuilder();  
  44.         sb.append("\nname : " + this.name);  
  45.         sb.append("\nage : " + this.age);  
  46.         sb.append("\naddress : " + this.address);  
  47.         return sb.toString();  
  48.   
  49.     }  
  50. }  

  构建业务逻辑层。同样在src目录下新建一个包,命名为paul.sydney.service,并且新建一个类DummyService,代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package paul.sydney.service;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.springframework.stereotype.Service;  
  7.   
  8. import paul.sydney.model.Person;  
  9.   
  10. @Service  
  11. public class DummyService {  
  12.     /** 
  13.      * This method supposed to be returning a Collection of Person objects from 
  14.      * a DAO layer For this tutorial, let us just hard-code this List of Person 
  15.      * objects 
  16.      */  
  17.     public List<Person> getDummyList() {  
  18.         List<Person> list = new ArrayList<Person>();  
  19.         Person p1 = new Person();  
  20.         p1.setId(12345);  
  21.         p1.setName("Paul");  
  22.         p1.setAge(27);  
  23.         p1.setAddress("Dalaguete, Cebu");  
  24.   
  25.         Person p2 = new Person();  
  26.         p2.setId(54321);  
  27.         p2.setName("Sydney");  
  28.         p2.setAge(25);  
  29.         p2.setAddress("Cebu City");  
  30.   
  31.         list.add(p1);  
  32.         list.add(p2);  
  33.         return list;  
  34.     }  
  35.   
  36.     /** 
  37.      * This method supposed to be returning Person object from a DAO layer For 
  38.      * this tutorial, let us just hard-code the Person instance 
  39.      */  
  40.     public Person retrievePerson(int id) {  
  41.         Person person = new Person();  
  42.         person.setId(56789);  
  43.         person.setName("Nikki");  
  44.         person.setAge(63);  
  45.         person.setAddress("Dalaguete, Cebu");  
  46.         return person;  
  47.     }  
  48.   
  49.     /** 
  50.      * This method supposed to be persisting the passed Person object For this 
  51.      * tutorial, let us include the persisting DAO layer and assume the method 
  52.      * successful saved or updated the Person object 
  53.      */  
  54.     public void savePerson(Person person) {  
  55.         System.out.println("\n\nSaving" + person);  
  56.     }  
  57. }  

  在这里,只是简单的在一个List中存放了多个person对象而已。

  最后,项目的结构如下图:


  接着,我们右击ant.xml,选择Run As->Ant Build,如下图:



  Spring MVC3构建Web应用第六步

  接着在编辑对话菜单中,记得选择build,war-archiving及deploy,如下图:


  最后点RUN,运行脚本,然后我们就可以在浏览器中运行了,如下图:


  点Person List,可以看到如下的人员列表:


  点其中的一个ID,可以进入如下页面:


  这里可以修改个人信息,并点保存,跳转到人员列表页面,并可以看到所做的更改。

  总结:

  Spring MVC3中大量使用了注解去简化了编程,本文只是做了一个初步入门的导学。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值