本篇使用Sping框架构建一个Java Web项目案例,从实践上对Spring框架有个初步认知。通过本篇的学习,可以掌握以下内容:
1、了解Spring框架能帮我们做什么?
2、如何获取Spring框架?
3、应用Spring框架构建Java Web项目
4、建立Spring配置文件
5、配置web.xml加载Spring配置文件
一、Spring框架能帮我们做什么?
现在大部分Web项目都用框架开发,用的最多,最受欢迎的就是Spring框架,现在的主流集成框架SSM(SSM框架集)、SSH(SSH框架集)都离不开Spring框架。Spring框架的优势体现在以下几个方面:
(1)使用轻量级的Spring IOC 容器替换复杂的EJB容器,简化开发企业级应用程序的复杂度。
(2)Spring框架使用IOC容器和配置文件管理Bean的生命周期和配置,利用DI(依赖注入技术)为Bean注入依赖对象。这样做的好处是可以在配置文件中配置Bean所需要的资源,完成自身的业务逻辑,而无需修改代码,提高了Bean的可扩展性和复用性。
(3)Spring通过反转控制技术,将一个对象依赖的其它对象由IOC容器传递进去,而不是这个对象自己创建或者查找依赖对象。例如,汽车对象依赖于发动机对象,使用Spring框架之前,程序员需要在汽车对象内部创建发动机对象。使用Spring框架之后,发动机对象写入配置文件,由IOC容器创建并传递给汽车对象。Spring的反转控制技术让对象之间的强耦合变为松耦合。
(4)Spring的AOP机制,允许把与业务无关,但需要业务重复调用的公共模块封装起来,并在合适的时间,由AOP将封装的公共模块切入到业务流程中。例如,在编写银行存取款业务流程中,可以把用户验证、记录用户操作的日志模块从流程中提取出来,单独处理。然后,利用Spring的AOP机制将用户验证、记录用户操作的日志模块横向切入到银行存取款业务流程中。AOP机制可以减少系统重复代码,降低模块之间的耦合度,提高代码的可维护性和复用性。
(5)Spring封装了JavaEE提供的JDBC、JavaMail、远程调用等API接口,让程序调用这些接口变得非常容易。
二、如何获取Spring框架?
Spring框架依赖于Apache Commons Logging(Apace开发的日志接口库)。因此,在部署Spring框架之前,需要先下载Apache Commons Logging库。可以从commons.apache.org/logging/ 下载 Apache Commons Logging的最新版本。windows操作系统选择zip格式的压缩包,Linux系统选择tar.gz格式的压缩包。在widows系统下,解压下载的压缩包到任意目录,解压后的文件目录如下图所示。

图1 Apache Commons Logging文件目录
可以从repo.spring.io/release/org/springframework/spring下载最新版的Spring框架文件,选择zip格式的压缩包下载。在widows系统下,解压下载的压缩包到任意目录,解压后的文件目录如下图所示。

图2 Spring框架文件目录
Spring框架的所有Jar包文件都在图中的libs目录下,后面需要将该libs目录下的所有Jar包文件复制到Java Web项目中。
至此,Spring框架已经准备好了。
三、 应用Spring框架构建Java Web项目
让我们使用Spring框架开始实际的编程,启动eclipse,建立Java Web项目,项目名称为SpringProgram。项目添加Spring框架需要下面几个步骤:
第一步:复制日志接口库jar包到项目lib目录
进入先前下载并解压缩的日志接口库目录,复制jar包文件到项目WEB-INFO目录下的lib目录。
第二步:复制Spring框架jar包文件到项目的lib目录
进入先前下载并解压缩的Spring框架文件目录,进入libs目录,复制所有的jar包文件到项目WEB-INFO目录下lib目录。复制完成,lib目录如下图所示。

图3 项目lib目录下的jar包文件
第三步:建立实体Teacher类
Teacher类为实体Bean类,有属性值name,该类由IOC容器统一管理,包括类的创建和属性值的注入。类代码如下:
package com.milihua.springprogram.entity;
public class Teacher {
private String name;
public void hello() {
System.out.println("teacher name is:" + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第四步:建立Spring配置文件
在src目录下新建config目录,用于存储配置文件。在新建的config目录下建立dispatcher.xml文件。Spring配置文件是XML格式的文件,该文件非常重要,是Spring框架的核心,Spring实现的所有功能都依赖于该配置文件。本文仅实现Bean类的配置。配置文件代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<bean id="teacher" class="com.milihua.springprogram.entity.Teacher">
<property name="name" value="zhang"></property>
</bean>
</beans>
配置文件定义了Teacher类,当外部从IOC容器获取该类时,IOC容器将创建Teacher类实例,并把属性值“zhang”注入到创建的Teacher类实例中。
第五步:建立Spring监听器
建立Spring监听类,实现ServletContextListener接口,在实现的contextInitialized接口方法中,创建IOC容器,然后将IOC容器放在ServletContext的一个属性中。代码如下:
package com.milihua.springprogram.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringServletContextListener implements ServletContextListener {
/**
* Default constructor.
*/
public SpringServletContextListener() {
// TODO Auto-generated constructor stub
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent arg0) {
// 1、获取spring配置文件的名称和位置
ServletContext servletContext = arg0.getServletContext();
String config = servletContext.getInitParameter("configLocation");
System.out.println("配置文件:" + config);
// 2、创建IOC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
// 3、将IOC容器放在ServletContext的一个属性中
servletContext.setAttribute("ApplicationContext", ctx);
}
}
第六步:建立TeacherInfoServlet类
TeacherInfoServlet类继承于HttpServlet类,用于处理JSP页面发送的请求,该类从application域对象中得到IOC容器的引用,从IOC容器中得到需要的Teacher类。代码如下:
package com.milihua.springprogram.servlet;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.ApplicationContext;
import com.milihua.springprogram.entity.Teacher;
public class TeacherInfoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 从application域对象中得到IOC容器的引用
ServletContext servletContext = getServletContext();
ApplicationContext ctx = (ApplicationContext) servletContext.getAttribute("ApplicationContext");
// 从IOC容器中得到需要的bean
Teacher teacher = ctx.getBean(Teacher.class);
teacher.hello();
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.getWriter().append("老师名称:").append(teacher.getName()).append("\nServed at: ")
.append(request.getContextPath());
}
}
第七步:修改web.xml配置文件
在项目中打开web.xml配置文件,添加下面的语句:
<!-- 配置spring配置文件的名称和位置 -->
<context-param>
<param-name>configLocation</param-name>
<param-value>classpath:/config/dispatcher.xml</param-value>
</context-param>
<!-- 启动IOC容器的ServletContextListener -->
<listener>
<listener-class>com.milihua.springprogram.listener.SpringServletContextListener</listener-class>
</listener>
<!-- 配置服务器运行路径 -->
<servlet>
<servlet-name>teacherInfoServlet</servlet-name>
<servlet-class>com.milihua.springprogram.servlet.TeacherInfoServlet</servlet-class>
<init-param>
<param-name>configLocation</param-name>
<param-value>classpath:\config\dispatcher.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>teacherInfoServlet</servlet-name>
<url-pattern>/TeacherInfoServlet</url-pattern>
</servlet-mapping>
Web.xml 配置文件内容说明如下:
<context-param>
<param-name>configLocation</param-name>
<param-value>classpath:/config/dispatcher.xml</param-value>
</context-param>
用于加载Spring配置文件,<param-name>标签之间的值为配置文件的名称,<param-value>标签之间的值为配置文件的存储路径。
<listener> <listener-class>com.milihua.springprogram.listener.SpringServletContextListener</listener-class> </listener>
添加监听类SpringServletContext。
四、验证项目
在WebContent目录下,新建index.jsp文件,在<body>标签之间输入下面的内容:
<a href="TeacherInfoServlet">输出老师信息</a>
启动服务器,运行index.jsp,若没有什么问题,index.jsp将被正常打开。如果服务器报错,可能是配置或代码出了问题,请对照本文内容仔细检查。
五、课程小结
Spring框架提供了IOC(轻量级容器)、DI(依赖注入)、控制反转以及AOP技术,这些技术可以减轻企业级项目开发的复杂度,特别是控制反转机制将依赖对象的强耦合弱化为松耦合,提高了代码的复用性、维护性和可扩展性。
Java Web项目添加Spring框架要注意以下几点:(1)Spring框架依赖于Apache Commons Logging;(2)Spring框架和Apache Commons Logging的所有Jar包文件都要复制到Java Web项目的lib目录;(3)建立Spring配置文件,并在web.xml配置文件中加入读取Spring配置文件的命令。