使用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文件,编辑内容如下:

<?xml version="1.0"?>
<!-- Copyright : adobocode.com , 2010 -->
<project name="SampleSpringMVC" basedir="." default="build">
<property file="ant.properties" />
<property name="src.dir" value="src" />
<property name="war.dir" value="WebContent" />
<property name="build.dir" value="${war.dir}/WEB-INF/classes" />
<property name="deploy.path" value="${tomcat.home}/webapps" />
<property name="name" value="SampleSpringMVC" />
<path id="master-classpath">
<fileset dir="${war.dir}/WEB-INF/lib">
<include name="*.jar" />
</fileset>
<fileset dir="${tomcat.home}/lib">
<include name="servlet*.jar" />
</fileset>
<pathelement path="${build.dir}" />
</path>
<target name="build" description="Compile main source tree java files">
<echo>Building...</echo>
<mkdir dir="${build.dir}" />
<javac destdir="${build.dir}" failοnerrοr="true">
<src path="${src.dir}" />
<classpath refid="master-classpath" />
</javac>
</target>
<target name="war-archiving">
<echo>Archiving...</echo>
<war destfile="${name}.war" webxml="${war.dir}/WEB-INF/web.xml">
<fileset dir="${war.dir}">
<include name="**/*.*" />
</fileset>
</war>
</target>
<target name="deploy" depends="build">
<echo>Deploying...</echo>
<copy todir="${deploy.path}">
<fileset dir=".">
<include name="*.war" />
</fileset>
</copy>
</target>
</project>


  Spring MVC3构建Web应用第二步

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

  1)点文件—新建-文件

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


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

tomcat.home=D:/Program Files/apache-tomcat-6.0.37
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:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>SampleSpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SampleSpringMVC</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
</web-app>

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

<%@ page language="java" session="false"
contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Adobocode : Sample Spring MVC</title>
</head>
<body>
<h2>Adobocode : Hello World</h2>
<br />
<a href="<c:url value="personDisplay.htm"/>">Person List</a>
</body>
</html>

  Spring MVC3构建Web应用第三步

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

<?xml version="1.0" encoding="UTF-8"?> 

<!-- Copyright : adobocode.com , 2010 -->

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation=" 
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> 
<context:component-scan base-package="paul.sydney.controller"/> 
<context:component-scan base-package="paul.sydney.service"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
<property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property> 
<property name="prefix"><value>/WEB-INF/jsp/</value></property> 
<property name="suffix"><value>.jsp</value></property> 
</bean> 
</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,并写入如下代码:

<!-- Copyright : adobocode.com , 2010 -->

<%@ page language="java" session="false" 
   contentType="text/html; charset=UTF-8"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<jsp:useBean id="personList" scope="request" type="java.util.List" /> 
<html> 
    <head> 
        <title>Adobocode : Sample Spring MVC using JSTL iteration</title> 
    </head>
    <body>
        <h2>Adobocode : Person List</h2> 
        <table border="1"> 
           <tr> 
                <th>Id</th> 
                <th>Name</th> 
                <th>Age</th> 
                <th>Address</th> 
            </tr> 
          <c:forEach var="p" items="${personList}"> 
            <tr> 
                <td> 
                    <c:url var="editUrl" value="personForm.htm"> 
                         <c:param name="personId" value="${p.id}" /> 
                    </c:url> 
                   <a href='<c:out value="${editUrl}"/>'>${p.id}</a> 
                </td> 
               <td>${p.name}</td> 
               <td>${p.age}</td> 
               <td>${p.address}</td> 
            </tr> 
          </c:forEach> 
      </table> 
   </body>
</html>

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

<!-- Copyright : adobocode.com , 2010 -->

<%@ page language="java" session="false"
    contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<title>Adobocode : Sample Spring MVC using Forms</title>
</head>

<body>
  <h2>Adobocode : Person Form</h2>
  <form:form modelAttribute="person">
  <form:hidden path="id" />
  <fieldset>
    <table>
      <tr>
        <td>Name</td>
        <td><form:input path="name" />
        </td>
      </tr>
      <tr>
        <td>Age</td>
        <td><form:input path="age" />
        </td>
      </tr>
      <tr>
        <td>Address</td>
        <td><form:input path="address" />
        </td>
      </tr>
      <tr>
        <td></td>
        <td><input type="submit" id="save" name="_eventId_save"
          value="Save" /> <input type="submit" onClick="history.go(-1);"
          name="_eventId_cancel" value="Cancel" /></td>
      </tr>
    </table>
  </fieldset>
  </form:form>
</body>
</html>

  Spring MVC3构建Web应用第四步

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


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

package paul.sydney.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import paul.sydney.service.DummyService;

@Controller
public class PersonDisplay {
  private final DummyService dummyService;
  
  @Autowired
  public PersonDisplay(DummyService dummyService) {
    this.dummyService = dummyService;
  }

  @RequestMapping("/personDisplay.htm")
  public ModelMap defaultHandler() {
    return new ModelMap("personList", this.dummyService.getDummyList());
  }
}

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

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

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

package paul.sydney.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

import paul.sydney.model.Person;
import paul.sydney.service.DummyService;

@Controller
@RequestMapping("/personForm.htm")
@SessionAttributes("person")
public class PersonForm {
  private final DummyService dummyService;

  @Autowired
  public PersonForm(DummyService dummyService) {
    this.dummyService = dummyService;
  }

  @RequestMapping(method = RequestMethod.GET)
  public String setupForm(@RequestParam("personId") int id, ModelMap model) {
    Person person = this.dummyService.retrievePerson(id);
    model.addAttribute("person", person);
    return "personForm";
  }

  @RequestMapping(method = RequestMethod.POST)
  public String processSubmit(@ModelAttribute("person") Person person,
      BindingResult result, SessionStatus status) {
        this.dummyService.savePerson(person);
        status.setComplete();
        return "redirect:personDisplay.htm";
      }
  } 

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


  Spring MVC3构建Web应用第五步

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

package paul.sydney.model;

public class Person {
	private int id;
	private String name;
	private int age;
	private String address;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("\nname : " + this.name);
		sb.append("\nage : " + this.age);
		sb.append("\naddress : " + this.address);
		return sb.toString();

	}
}

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

package paul.sydney.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Service;

import paul.sydney.model.Person;

@Service
public class DummyService {
	/**
	 * This method supposed to be returning a Collection of Person objects from
	 * a DAO layer For this tutorial, let us just hard-code this List of Person
	 * objects
	 */
	public List<Person> getDummyList() {
		List<Person> list = new ArrayList<Person>();
		Person p1 = new Person();
		p1.setId(12345);
		p1.setName("Paul");
		p1.setAge(27);
		p1.setAddress("Dalaguete, Cebu");

		Person p2 = new Person();
		p2.setId(54321);
		p2.setName("Sydney");
		p2.setAge(25);
		p2.setAddress("Cebu City");

		list.add(p1);
		list.add(p2);
		return list;
	}

	/**
	 * This method supposed to be returning Person object from a DAO layer For
	 * this tutorial, let us just hard-code the Person instance
	 */
	public Person retrievePerson(int id) {
		Person person = new Person();
		person.setId(56789);
		person.setName("Nikki");
		person.setAge(63);
		person.setAddress("Dalaguete, Cebu");
		return person;
	}

	/**
	 * This method supposed to be persisting the passed Person object For this
	 * tutorial, let us include the persisting DAO layer and assume the method
	 * successful saved or updated the Person object
	 */
	public void savePerson(Person person) {
		System.out.println("\n\nSaving" + person);
	}
}

  在这里,只是简单的在一个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、付费专栏及课程。

余额充值