前言:
一、总共有10节,也就是10篇博客来讲述Spring的MVC,几乎涵盖了所有Spring MVC中的内容。
二、我创建的例子是一个球场预订系统,例子我已经测试调试通过,是一个Maven的project,包含一个Parent project:wsheng-spring-base和一个子Module:wsheng-spring-mvc.
三、在Eclipse中直接import maven的project即可,会同时引入上诉两个project的。
四、如果你没有耐心,可以不必往下学习,因为网上有很多例子,但是都是讲的Spring MVC很少的面,而且你可以快速的上手,但如果你想真正了解Spring MVC中的很多细节,就可以慢慢的去看博客(从第一节到第十节),如果有什么问题,欢迎信息告诉我。
五、学习的方法是你可以先将源码导入到eclipse中,然后根据博客上的内容,对照源码,慢慢消化,这是个漫长的过程,但是会帮助你了解很多Spring MVC的细节。
===================================================================================
Spring MVC是Spring框架最重要的模块之一,它构建于强大的Spring IOC容器之上,然后可大量使用容器的特性简化其配置。
模式-视图-控制器(MVC)是UI设计模式中常见的设计模式。这种模式主要用于区分应用程序中的模式、视图和控制器三种角色。MVC模式的核心思想是分离业务逻辑和UI,MVC3层各自扮演自己的角色,独立修改,互不影响。其中模式层负责封装视图层展示用的数据,视图层只负责显示数据,不包含任何的业务逻辑,控制器负责接收用户请求并调用后端的服务进行业务逻辑的处理。
Spring MVC3层模式中,模式层通常包含服务层处理的或者是持久化层存储的领域对象组成。视图层可以是JSP,PDF,Flex,Excel等。
一、有例子才是王道-Spring MVC开发简单的web应用(球场预定系统)
参照附件源码:
1. 解决方法:
在Spring2.5之前,要实现控制器层,只能写一个类继承AbstractController或者实现相关的接口。Spring2.5-Spring3.x之间,既可以继承AbstractController类也可以实现相关的接口,也可以使用强大的注解@Controller功能,Spring3.0之后,只能使用注解@Controller功能。
2. 相关的领域对象(Model层)
1). 预订实体类
package com.wsheng.spring.domain;
import java.util.Date;
public class Reservation {
private String courtName;
private Date date;
private int hour;
private Player player;
private SportType sportType;
public Reservation() {}
public Reservation(String courtName, Date date, int hour, Player player, SportType sportType) {
this.courtName = courtName;
this.date = date;
this.hour = hour;
this.player = player;
this.sportType = sportType;
}
public String getCourtName() {
return courtName;
}
public Date getDate() {
return date;
}
public int getHour() {
return hour;
}
public Player getPlayer() {
return player;
}
public SportType getSportType() {
return sportType;
}
public void setCourtName(String courtName) {
this.courtName = courtName;
}
public void setDate(Date date) {
this.date = date;
}
public void setHour(int hour) {
this.hour = hour;
}
public void setPlayer(Player player) {
this.player = player;
}
public void setSportType(SportType sportType) {
this.sportType = sportType;
}
}
2)运动项目实体类
package com.wsheng.spring.domain;
/**
*
* @author Wang Sheng(Josh)
*
*/
public class SportType {
private int id;
private String name;
public SportType() {}
public SportType(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
3)球员实体类
package com.wsheng.spring.domain;
/**
* Player(球员)
* @author Wang Sheng(Josh)
*
*/
public class Player {
private String name;
private String phone;
public Player() {}
public Player(String name, String phone) {
this.name = name;
this.phone = phone;
}
public String getName() {
return name;
}
public String getPhone() {
return phone;
}
public void setName(String name) {
this.name = name;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
3. 设置Spring MVC应用
1)基于Spring的Web应用同样必须符合J2EE目录规范:如在WEB-INF目录下必须有一个web.mxl的部署描述符,这个WEB应用的类文件和JAR文件应该分别放在WEB-INF/classes和WEB-INF/lib目录中。
2)添加Spring的常规依赖,Spring web依赖和SpringMVC依赖
Spring的常规依赖可以参看源码附件中的pom.xml,Spring web和Spring MVC依赖为:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
3)将重要的Spring配置文件放在WEB-INF/目录下:court-service.xml, court-servlet.xml。(具体参看附件源码)
注意:用户可以通过URL直接访问WEB-INF目录之外的文件,所以/css,/images等内容常常放在那个地方。而/jsp目录则根据实际的需要可以选择放在WEB-INF/之内或者之外。
4)在web.xml中添加Spring MVC的前端控制器。
该前端控制器是一个DispatcherServelt实例,在大型应用中,使用多个DispatcherServelt实例会更加方便,因为这可以轻松实现将DispatcherServlet实例委派给特定的URL,是代码管理更加容易,因为这样对于开发中涉及同一个应用逻辑的团队成员来说不会互相影响。
<!-- Spring MVC Servlet -->
<servlet>
<servlet-name>court</servlet-name> <!-- will load court-servlet.xml default -->
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
5)可以为不同层声明不同的配置文件
可以将所有的Spring的bean的信息定义在上面注释中提到的court-servelt.xml中,也可以为不同的层定义不同的xml,如court-persistence.xml和court-service.xml.
为了让Spring加载court-servlet.mxl以为的配置文件,必须在web.xml中定义servlet监听器ContextLoaderListener。默认情况下,它只加载配置文件WEB-INF/applicationContext.xml,但是可以在上下文参数contextConfigLocation中指定自己想要添加的文件。如果是多个文件,可以使用逗号分隔。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/court-service.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
注意:
ContextLoaderListener加载自己的bean配置文件(如applictionContext.xml,court-service.xml)到跟应用上下文中,而每个DispatcherServlet将其配置文件加载到自己的应用上下文(court-servlet.xml),并且引用根应用上下文为其上级。所以,每个DispatcherServlet实例加载的上下文可以访问甚至覆盖根引用上下文中生命的Bean(反之不行)。但是DispatcherServlet加载的上下文无法互相访问。