【IT168 应用】本文将指导大家如何使用Spring MVC3去构建一个Web应用。在Spring MVC中,所有的用户请求都会被派发到控制器模块,控制器然后再根据业务逻辑去调用数据访问层获得数据,最后通过JSP视图返回。
在动手之前,我们先准备好我们的环境,需要的是JDK 1.5以上以及Eclipse IDE,当然还要下载最新版本的Spring 3,本文还要下载最新版本的ant,以便我们学习如何通过ant去构建应用。
Spring MVC3构建Web应用第一步
首先在Eclipse中利用新建菜单,建立一个Dynamic WebProject(动态Web工程),命名为SampleSpringMVC,接下来,我们要建立一个ant.xml的文件,这个文件会方便我们把做好的程序打包成war文件,这个可以有如下几步去实现:
1、点文件—新建—文件,如下图:
2、输入ant.xml作为文件名,并点完成。如下图:
3、打开ant.xml文件,编辑内容如下:
#div_code img { border: 0px none; }1
2
3
4
5
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Building... 26 27 28 29 30 31 32 33 34 Archiving... 35 36 37 38 39 40 41 42 43 Deploying... 44 45 46 47 48 49 50 51 Spring MVC3构建Web应用第二步
建立一个ant.properties文件,该文件会存放一些值的属性,并且这些值也会是ant.xml中用到的。请按如下步骤实现:
1)点文件—新建-文件
2) 将文件命名为ant.properties,并点完成,如下图:
3)打开ant.properties,修改tomcat.home的目录为你安装tomcat的实际目录。
#div_code img { border: 0px none; }1
tomcat.home=C:/Tools/apache-tomcat-6.0.2
2
tomcat.lib=$...{tomcat.home}/lib
下载下面列表的.jar文件,并放到SampleSpringMVC/war/WEB-INF/lib下。
#div_code img { border: 0px none; }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:
#div_code img { border: 0px none; }1
2
3
4 xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 6 7 SampleSpringMVC 8 9 10 SampleSpringMVC 11 org.springframework.web.servlet.DispatcherServlet 12 1 13 14 15 16 SampleSpringMVC 17 *.htm 18 19 20 21 index.jsp 22 23 24
创建index.jsp,这个只需要在war/WEB-INF下建立即可,并且将内容设置为如下:
#div_code img { border: 0px none; }1
<%@ page language="java" session="false" contentType="text/html; charset=UTF-8"%>
2
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3
4
5
Adobocode : Sample Spring MVC 6
7
8
Adobocode : Hello World 9
10
">Person List
11
12
Spring MVC3构建Web应用第三步
在SampleSpringMVC/war/WEB-INF中建立文件SampleSpringMVC-servlet.xml,并将内容修改如下:
#div_code img { border: 0px none; }1
2
3
4
5
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 11 http://www.springframework.org/schema/beans 12 13 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 14 15 http://www.springframework.org/schema/context 16 17 http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 18 19 20 21 22 23 24 25 26 27 28 org.springframework.web.servlet.view.JstlView 29 /WEB-INF/jsp/ 30 .jsp 31 32 33
这里,我们利用了spring 3 mvc的新特性,自动扫描,通过context:component-scanbase-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,并写入如下代码:
#div_code img { border: 0px none; }1
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
7
8
9
10
Adobocode : Sample Spring MVC using JSTL iteration 11
12
13
Adobocode : Person List 14
15 16 Id 17 Name 18 Age 19 Address 20 21 22 23 24 25 26 27 $...{p.id} 28 29 $...{p.name} 30 $...{p.age} 31 $...{p.address} 32 33 34
35
在SampleSpringMVC/war/WEB-INF/jsp下建立一个新的jsp文件叫personForm,修改代码如下:
#div_code img { border: 0px none; }1
2
3
<%@ page language="java" session="false" contentType="text/html; charset=UTF-8"%>
4
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
5
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
6
7
8
Adobocode : Sample Spring MVC using Forms 9
10
11
12
Adobocode : Person Form 13
14 15 16 37 38 39
40
Spring MVC3构建Web应用第四步
现在我们开始设计控制器,鼠标右击src目录,选择新建-包,如下图:
并将包的名命名为paul.sydney.controller,在这个包中,新建立一个类,命名为PersonDisplay,将代码修改如下:
#div_code img { border: 0px none; }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
import org.springframework.web.bind.annotation.RequestParam;
8
9
import paul.sydney.service.DummyService;
10
11
/** *//**
12
* PersonDisplay class, display controller for the 'personDisplay.jsp'
13
* Copyright : adobocode.com , 2010
14
* @author Paul Sydney Orozco | xtrycatchx@gmail.com
15
*
16
*/
17
@Controller
18
public class PersonDisplay ...{
19
20
private final DummyService dummyService;
21
22
@Autowired
23
public PersonDisplay(DummyService dummyService) ...{
24
this.dummyService = dummyService;
25
}
26
27
@RequestMapping("/personDisplay.htm")
28
public ModelMap defaultHandler() ...{
29
return new ModelMap("personList", this.dummyService.getDummyList());
30
}
31
}
这里,使用注解@Controller表示这个是一个控制器,而@RequestMapping("/personDisplay.htm")则表示对于personDisplay.htm这样的请求,使用defaultHandler这个方法去处理。而在defaultHandler中,又调用了逻辑服务层的
dummyService.getDummyList()方法获得人员列表,最后把列表存放到一个ModelMap中去(可以先理解为Map的一种数据结构)。
同样地,在paul.sydney.controller包中,新建一个类PersonForm,并将代码修改如下:
#div_code img { border: 0px none; }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
@Controller
17
@RequestMapping("/personForm.htm")
18
@SessionAttributes("person")
19
public class PersonForm ...{
20
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, BindingResult result, SessionStatus status) ...{
37
this.dummyService.savePerson(person);
38
status.setComplete();
39
return "redirect:personDisplay.htm";
40
}
41
}
这里,首先通过依赖注入,注入了服务层逻辑dummyService,然后在setupForm中,根据传入的参数personId,通过服务层逻辑dummyService找出这个人,然后将其保存到一个Model中去,返回给视图层personForm.jsp显示;而processSubmit是调用服务层逻辑保存用户的资料(通过this.dummyService.savePerson(person)实现),最后使用redirect跳转到personDisplay.htm。
Spring MVC3构建Web应用第五步
构建业务实体模型。在src目录中,新建包命名为paul.sydney.model,在这个包下,再新建一个实体类,命名为Person,修改代码如下:
#div_code img { border: 0px none; }1
package paul.sydney.model;
2
3
/** *//**
4
* Copyright : adobocode.com , 2010
5
* @author Paul Sydney Orozco | xtrycatchx@gmail.com
6
*/
7
public class Person ...{
8
9
private int id;
10
private String name;
11
private int age;
12
private String address;
13
14
public int getId() ...{
15
return id;
16
}
17
public void setId(int id) ...{
18
this.id = id;
19
}
20
21
public String getName() ...{
22
return name;
23
}
24
public void setName(String name) ...{
25
this.name = name;
26
}
27
public int getAge() ...{
28
return age;
29
}
30
public void setAge(int age) ...{
31
this.age = age;
32
}
33
public String getAddress() ...{
34
return address;
35
}
36
public void setAddress(String address) ...{
37
this.address = address;
38
}
39
40
@Override
41
public String toString()...{
42
StringBuilder sb = new StringBuilder();
43
sb.append("\nname : " + this.name);
44
sb.append("\nage : " + this.age);
45
sb.append("\naddress : " + this.address);
46
return sb.toString();
47
48
}
49
50
}
构建业务逻辑层。同样在src目录下新建一个包,命名为paul.sydney.service,并且新建一个类DummyService,代码如下:
#div_code img { border: 0px none; }1
paul.sydney.service;
2
3
import java.util.ArrayList;
4
5
import paul.sydney.model.Person;
6
7
import java.util.List;
8
9
import org.springframework.stereotype.Service;
10
11
/** *//**
12
* Copyright : adobocode.com , 2010
13
* @author Paul Sydney Orozco | xtrycatchx@gmail.com
14
*/
15
@Service
16
public class DummyService ...{
17
18
/** *//**
19
* This method supposed to be returning a Collection of Person objects from a DAO layer
20
* For this tutorial, let us just hard-code this List of Person objects
21
*/
22
public List
getDummyList() ...{ 23 List list = new ArrayList(); 24 Person p1 = new Person(); 25 p1.setId(12345); 26 p1.setName("Paul"); 27 p1.setAge(27); 28 p1.setAddress("Dalaguete, Cebu"); 29 30 Person p2 = new Person(); 31 p2.setId(54321); 32 p2.setName("Sydney"); 33 p2.setAge(25); 34 p2.setAddress("Cebu City"); 35 36 list.add(p1); 37 list.add(p2); 38 return list; 39 } 40 41 /** *//** 42 * This method supposed to be returning Person object from a DAO layer 43 * For this tutorial, let us just hard-code the Person instance 44 */ 45 public Person retrievePerson(int id) ...{ 46 Person person = new Person(); 47 person.setId(56789); 48 person.setName("Nikki"); 49 person.setAge(63); 50 person.setAddress("Dalaguete, Cebu"); 51 return person; 52 } 53 54 /** *//** 55 * This method supposed to be persisting the passed Person object 56 * For this tutorial, let us include the persisting DAO layer 57 * and assume the method successful saved or updated the Person object 58 */ 59 public void savePerson(Person person) ...{ 60 System.out.println("\n\nSaving" + person); 61 } 62 }
在这里,只是简单的在一个List中存放了多个person对象而已。
最后,项目的结构如下图:
接着,我们右击ant.xml,选择Run As->Ant Build,如下图:
Spring MVC3构建Web应用第六步
接着在编辑对话菜单中,记得选择build,war-archiving及deploy,如下图:
最后点RUN,运行脚本,然后我们就可以在浏览器中运行了,如下图:
点Person List,可以看到如下的人员列表:
点其中的一个ID,可以进入如下页面:
这里可以修改个人信息,并点保存,跳转到人员列表页面,并可以看到所做的更改。
总结:
Spring MVC3中大量使用了注解去简化了编程,本文只是做了一个初步入门的导学。