本章目标:
� 什么是 Spring及其作用
� 掌握 IOC,AOP概念
� 会使用 Spring开发简单项目
1. 什么是 Spring及其作用
Spring是非常著名的框架,它主要集成两个重要技术:
IOC:反转控制,AOP:面向方面编程。
在 SSH框架中 Spring主要的作用是:管理 Hibernate以及事务
2. Spring容器的作用
学习 Spring之前必须了解关于对象的产生问题。
Spring重要概念:接口的概念――》工厂设计
JAVA回顾:
对于产生一个对象 JAVA中有哪几种常见方式?(主要考虑接口操作)
� 直接用 new的方式创建对象:类 对象名 = new 类();
接口类型 对象名称 = new 接口实现类();
这样方式的缺点:在客户端调用时,必须要知道接口的实现类。
比如水果接口(Fruit)实现类有:苹果(Apple) 橘子(Orange)
举例:创建一个 SpringDemo 的 Web Project,在 src 中创建一个接口(Fruit)和两个实现
类:Apple,Orange,和一个测试类(SpringTest)来说明客户端和接口实现类之间的紧密耦合,具
体代码如下:
packagepackagepackagepackage com.sxjiang;
publicpublicpublicpublic interfaceinterfaceinterfaceinterface Fruit {
//吃水果
publicpublicpublicpublic voidvoidvoidvoid eat();
}
packagepackagepackagepackage com.sxjiang;
publicpublicpublicpublic classclassclassclass Apple implementsimplementsimplementsimplements Fruit {
publicpublicpublicpublic voidvoidvoidvoid eat() {
// TODOTODOTODOTODO Auto-generated method stub
System.out.println("吃苹果........");
}
}
packagepackagepackagepackage com.sxjiang;
publicpublicpublicpublic classclassclassclass Orange implementsimplementsimplementsimplements Fruit {
publicpublicpublicpublic voidvoidvoidvoid eat() {
// TODOTODOTODOTODO Auto-generated method stub
System.out.println("吃橘子........");
}
}
packagepackagepackagepackage com.sxjiang;
第四讲 Spring基础
2
publicpublicpublicpublic classclassclassclass SpingTest {
public static void main(String[] args) {
//产生接口的对象
Fruit f = newnewnewnew Apple();
f.eat();
}
}
从上面的代码中可以看到客户端程序和 Fruit接口的实现类紧密耦合,如果不想吃苹果而要
吃橘子,必须修改客户端程序, Fruit f = newnewnewnew Orange();。。。。我们可以采取下面
工厂设计解决这个问题。
� 使用工厂设计模式,引用工厂类--�可以解决客户端和接口实现类之间的耦合,具
体代码如下:
packagepackagepackagepackage com.sxjiang;
publicpublicpublicpublic classclassclassclass FruitFactory {
publicpublicpublicpublic staticstaticstaticstatic Fruit getFruitInstance(intintintint i)
{
Fruit f=nullnullnullnull;
ifififif(i==1)
{
f= newnewnewnew Apple();
}
ifififif(i==2)
{
f= newnewnewnew Orange();
}
returnreturnreturnreturn f;
}
}
packagepackagepackagepackage com.sxjiang;
publicpublicpublicpublic classclassclassclass SpingTest {
/**
* @param@param@param@param args
*/
publicpublicpublicpublic staticstaticstaticstatic voidvoidvoidvoid main(String[] args) {
// TODOTODOTODOTODO Auto-generated method stub
//产生接口的对象
Fruit f = FruitFactory.getFruitInstance(2);
f.eat();
}
}
通过上面的代码可以看到,在工厂模式下,通过传递参数1或2就可以改变接口实现类
的对象创建,实现了客户端和接口实现类之间的松散耦合,但此模式也存在一个问题:
一个接口就要有一个工厂,如果有100个接口就要有100工厂,工厂管理起来比较
麻烦,我们可以结合反射
机制
综治信访维稳工作机制反恐怖工作机制企业员工晋升机制公司员工晋升机制员工晋升机制图
,控制反转,实现动态工厂来解决这一问题。
� 使用反射机制: Class.forName
结合反射机制,控制反转,实现动态工厂,工厂通过 xml进行配置。但此模式代码量非
常大,因此掌握起来也比较难度。
� 使用对象克隆,Object类中的 clone方法(不考虑)
前三种方法都有缺点,这也正式 Spring框架的提出,使用 Spring可以解决所有问题。
Spring是一个容器,实现动态工厂的容器,是一个开源框架。
举例:修改上面的项目,使用 Spring来创建对象。
1) 在项目中添加 Spring支持包,及创建配置文件 applicationContext.xml
右键项目名称�点击菜单 MyEclipse�Add Spring Capabilites…,将出现 Spring
向导,用于添加 Spring需要的类库和配置文件。
点击“Next”,添加 Spring的配置文件。
添加Spring类库集合
选择Spring版本
选中的类库将会添加到项目的构造路径中,但是相应的JAR文件不会
复制到项目中.这些JAR文件将会在发布程序时复制。添加Spring库
选中的类库JAR文件将会被复制到项目并添加到构造路径中
第四讲 Spring基础
4
2) 编写配置文件 applicationContext.xml
Spring和 Hibernate一样,需要一个统一的配置文件 applicationContext.xml,此文
件为 Spring核心配置文件,此文件可以统一进行 bean的管理,此处的 bean实际
上就是对象的定义
Apple,Orange是接口 Fruit 的实现类,客户端要创建,Apple对象的话只需要找
到此处配置的 id名称即可,如果要创建Orange对象的话,只需要修改此处的 class
为 com.sxjiang.Orange而不用修改客户端代码,从而实现了客户端和接口类之间
的松散耦合。
问题:如何在 Spring中通过一定方法创建 Fruit对象呢?
方法:使用 ApplicationContext接口,通过方法 FileSystemXmlApplicationContextFileSystemXmlApplicationContextFileSystemXmlApplicationContextFileSystemXmlApplicationContext
进行查找。
结论:
Spring代替了工厂,所有的工厂在资源文件 applicationContext.xml中管理。
客户端只要使用固定方法找到这个文件,就可以创建对象了,见如下代码
3) 修改测试类,使用 Spring创建对象。
importimportimportimport
org.springframework.context.support.FileSystemXmlApplicationContext;
publicpublicpublicpublic classclassclassclass SpingTest {
/**
* @param@param@param@param args
*/
publicpublicpublicpublic staticstaticstaticstatic voidvoidvoidvoid main(String[] args) {
ApplicationContext context=nullnullnullnull;
context=newnewnewnew
FileSystemXmlApplicationContext("src/applicationContext.xml");
Fruit ft = (Fruit) context.getBean("fru");
ft.eat();
}
}
说明:对于开发Web Project 来说,可以在 web.xml中配置一个监听器自动加载
applicationContext.xml 方法如下:
实例:将 Struts2和 Spring结合完成一个登录功能的程序
要求:用户在登录页面输入正确的用户名和密码,则跳转到欢迎页面,反之进入失败页面。
步骤:
1) 创建Web Project :struts_spring
2) 添加 Struts2框架
� 将 struts2-core-2.0.11.jar、xwork-2.0.4.jar、commons-logging.jar、
ognl-2.6.11.jar、freemarker-2.3.8.jar共 5个 jar文件复制到项目的
WEB-INF/lib目录下,并导入到项目中(不清楚的同学请查看下 Struts2
入门章节中的内容)
� 修改Web.xml
struts2
org.apache.struts2.dispatcher.FilterDispatcher
struts2
/*
index.jsp
3) 创建 login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
My JSP 'login.jsp' starting page
4) 创建 LoginAction
packagepackagepackagepackage com.sxjiang;
importimportimportimport com.opensymphony.xwork2.ActionSupport;
publicpublicpublicpublic classclassclassclass LoginAction extendsextendsextendsextends ActionSupport {
privateprivateprivateprivate String username;
privateprivateprivateprivate String password;
publicpublicpublicpublic String execute() throwsthrowsthrowsthrows Exception {
returnreturnreturnreturn "success"; }
publicpublicpublicpublic String getUsername() {
returnreturnreturnreturn username; }
publicpublicpublicpublic voidvoidvoidvoid setUsername(String username) {
thisthisthisthis.username = username; }
publicpublicpublicpublic String getPassword() {
returnreturnreturnreturn password; }
publicpublicpublicpublic voidvoidvoidvoid setPassword(String password) {
thisthisthisthis.password = password; }
}
5) 编写 struts.xml文件,配置 Action,此文件项目中没有,可以从别处拷贝过来
进行修改。
/welcome.jsp
/error.jsp
6) 创建 welcome.jsp,error.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
My JSP 'welcome.jsp' starting page
欢迎
光临本站
-------------------error.jsp-----------------------------------------
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
My JSP 'welcome.jsp' starting page
是非法 用户
7) 部署,测试 struts2是否正常运行。
http://localhost:8080/struts_spring/login.jsp
8) 添加 Spring框架(参见上面的讲解)
9) 添加 Spring支持包
10) 修改 web.xml,使得程序支持 Spring
struts2
org.apache.struts2.dispatcher.FilterDispatcher
struts2
/*
org.springframework.web.context.ContextLoaderListe
ner
contextConfigLocation
/WEB-INF/classes/applicationContext.xml
index.jsp
11) 创建 struts.properties文件,使得 Struts2的类的生成交给 Spring来完成
第四讲 Spring基础
8
struts.objectFactory = spring
12) 修改 applicationContext.xml,定义名为 login 的 bean
13) 修改 struts.xml,使得 struts2的类的生成交给 Spring来完成
/welcome.jsp
/error.jsp
总结:到目前已经学习了 Struts2,Hibernate,Spring三种 J2EE框架,现在我们将三
种框架集成,开发一个用户登录的程序,如果登录成功,则进入欢迎页面,否则
进入失败页面。
步骤:
1) 创建数据库表,此处我们已经在 Hibernate 学习中创建过了。
2) 创建Web Project :ssh2
3) 用户自定义包
此处因为需要用到 Struts2,Hibernate,Spring框架的多个包,而且版本不一样的
话可能造成包冲突,不兼容问题,所以,我们将所有用到的包(不冲突)放在一
起,用的时候一起加载就可以了,非常方便。
� 用户自己定义包,方法:
选择 windows� preference� Java� Build Path�User libraries
选择 new
点击 ok
选择 ssh2然后点击 add Jars 将所有用到的包加载进来
第四讲 Spring基础
10
4) 加载 Spring框架,创建 applicationContext.xml
右键项目名称�MyEclipse�Add Spring Capabilites
单击”Next” 创建 applicationContext.xml
选择用户自定义包
5) 加载 Hibernate 框架
右击项目名称,选择MyEclipse�Add Hibernate Capabilites…
第四讲 Spring基础
12
注意:选择 Uer Libraries
在 applicationContext.xml中配置数据库信息,这样的话,就不需要创建
hibernate.cfg.xml文件了。
点击”next” 指定数据库的连接信息。
第四讲 Spring基础
14
此处不用再创建 sessionFactory类了。
6) 修改 web.xml文件,使程序支持 struts2,Spring
struts2
org.apache.struts2.dispatcher.FilterDispatcher
struts2
/*
org.springframework.web.context.ContextLoaderList
ener
contextConfigLocation
/WEB-INF/classes/applicationContext.xml
index.jsp
7) 创建 struts.properties文件
struts.objectFactory = spring
8) 创建 POJO类,及 hbm..xml文件
先创建 com.sxjiang.pojo包用来存放 POJO类。
打开 MyEclipse Database Explorer视图,打开前面创建的 Sql Server数据连接,然
后选择 student表,右键,选择菜单 Hibernate Reverse Engineering…
9) 创建 login.jsp,welcome.jsp,error.jsp
Login.jsp
<%@ page language="java" import="java.util.*"
pageEncoding="gb2312"%>
My JSP 'login.jsp' starting page
选择映射文件,POJO文件所存放的文件夹及包
生成表对应的 POJO类
是否生成三层结构,此处不生成
第四讲 Spring基础
16
Welcome.jsp
<%@ page language="java" import="java.util.*"
pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
My JSP 'welcome.jsp' starting page
欢迎
光临本站
Error.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
My JSP 'welcome.jsp' starting page
是非法 用户
10) 创建 LoginAction
packagepackagepackagepackage com.sxjiang;
importimportimportimport java.util.List;
importimportimportimport org.hibernate.Query;
importimportimportimport org.hibernate.Session;
importimportimportimport org.hibernate.SessionFactory;
importimportimportimport com.opensymphony.xwork2.ActionSupport;
publicpublicpublicpublic classclassclassclass LoginAction extendsextendsextendsextends ActionSupport {
privateprivateprivateprivate String username;
privateprivateprivateprivate String password;
privateprivateprivateprivate SessionFactory sessionFactory;
@Override
publicpublicpublicpublic String execute() throwsthrowsthrowsthrows Exception {
// TODOTODOTODOTODO Auto-generated method stub
Session session = sessionFactory.openSession();
String hql = " from Student s where s.username=? and s.password=?";
Query query = session.createQuery(hql);
query.setParameter(0,username);
query.setParameter(1,password);
List list = query.list();
session.close();
ifififif(list.size()>0)
{returnreturnreturnreturn "success";}
elseelseelseelse
{returnreturnreturnreturn "error";}
}
publicpublicpublicpublic String getUsername() {
returnreturnreturnreturn username;
}
publicpublicpublicpublic voidvoidvoidvoid setUsername(String username) {
thisthisthisthis.username = username;
}
publicpublicpublicpublic String getPassword() {
returnreturnreturnreturn password;
}
publicpublicpublicpublic voidvoidvoidvoid setPassword(String password) {
thisthisthisthis.password = password;
}
publicpublicpublicpublic SessionFactory getSessionFactory() {
returnreturnreturnreturn sessionFactory;
}
publicpublicpublicpublic voidvoidvoidvoid setSessionFactory(SessionFactory sessionFactory) {
thisthisthisthis.sessionFactory = sessionFactory;
}
}
11) 配置 struts.xml
/welcome.jsp
/error.jsp
12) 配置 applicationContext.xml
org.hibernate.dialect.SQLServerDialect
com/sxjiang/pojo/Student.hbm.xml
13) 部署测试