目 录
• MVC图
• Struts,Spring,Ibatis在项目中各自的作用
• SMOA工程结构图(含说明)
• Struts2+Spring+Ibatis搭建循序
• 服务层和DAO层的通用化:概念与设计
• SSI项目中开发步骤(用户登录的例子)
• 问题解答与交流
一、MVC结构下,如何协同工作?

二、Struts,Spring,Ibatis在项目中各自的作用
• Struts2(核心)
作为web层框架应该大体实现以下功能:
1.获取表单内容,并组织生成参数对象。
如:form表单à对象数据
2.根据请求的参数转发请求给适当的控制器。
如:Login.Action-àLoginAction
3.在控制器中调用业务接口
如: LoginAction调用LoginService接口
4.将业务接口返回的结果包装起来发送给指定的视图,并由视图完成处理结果的展现。
如:出来成功,转到index.jsp页面。
5.做一些简单的校验或是国际化工作(额外功能)
• Spring(new)
spring你可以把它看成管理所有对象创建的东西
所以用了spring后对象都不是new出来的
而是通过spring调用出来的,不过提前你的注入实体
• Ibatis和Hibernate(数据库操作)
Hibernate和iBateis都是做数据持久化的框架,就等于是一个O/R Mapping解决方案.
有了这框架,只要配置下映射文件,就不需要手写sql语句了.
Hibernate是全自动化的,可以说O/R做的相当全面了.
iBateis和Hibernate相比,iBatis最大的特点就是小巧,上手很快。如果你不需要太多复杂的功能,iBatis是能满足你的要求又足够灵活的最简单的解决方案。
三、工程结构图

四、结构图说明
• Java文件
com.rlkj.smoa开action,service,dao,po,common,test
• 配置文件
applicationContext-*.xml,
struts-*.xml,
SqlMapConfig.xml
• Jsp文件
resources,ext,main,index.jsp
五、Struts2+Spring+Ibatis搭建循序
1.新立web工程,配置web.xml。
使系统启动时,自动创建Spring容器对象及加载Spring配置文件。 如:
<!--指定Spring容器对象要加载的spring配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/applicationContext-common.xml,
/WEB-INF/classes/applicationContext-action.xml
</param-value>
</context-param>
<!-- 添加listener.在启动工程时,自动创建Spring容器对象 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
2.引入spring包和配置文件,并相应的配置
可以将Spring的配置文件分成两个或多个。以两个为例,
• applicationContext-common.xml可以放数据源(dataSource)、事务管理(通知、切面)等常规配置信息,并嵌套注入相应属性。如:
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:SqlMapConfig.xml</value>
</property>
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
•applicationContext-*.xml可以定义控制组件(Action)、业务组件(Service)、数据访问组件(Dao)等,并注入相应的属性。如:
<bean name="menuItemsAction" class="com.rlkj.smoa.action.MenuItemsAction" scope="prototype">
<property name="menuItemsService" ref="menuItemsService" />
</bean>
3.引入struts包和配置文件,并做相应的配置
sturts-*.xml。如:
<action name="login" class="loginAction" method="login">
<result name="success">/index.jsp</result>
<result name="input">/login.jsp</result>
<result name="fail">/login.jsp</result>
</action>
像在struts2中一样配置action(result)等信息。需要注意,在<action name=“” class=“”/>中,由于对象已经统一交给spring创建,所以class的值应写spring配置文件中相应的对象名。
4.引入ibatis包和配置文件
SqlMapConfig.xml可以指定数据源(也可以由spring指定),需要包含的SQL文件,如:
<sqlMap resource="com/rlkj/smoa/po/xml/MenuItems.xml" />
5.写Action,Service,Dao,Sql并进行相应的配置;在jsp可以通过form表单提交action.
• 服务器加载配置文件循序?
Web.xml à applicationContext-*xml- à sturts-*.xml àSqlMapConfig.xml- à MenuItems.xml等
六、服务层和DAO层的通用化:概念与设计
1 概念
• 1.1 接口(Interface)
类似于一种规范,它是一系列方法的声明,定义了方法的名称、参数类型、返回值类型
• 1.2 抽象类(Abstract Class)
抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
• 1.3 泛型
将参数指定为某种类型,从而达到安全通用的目的。
2 DAO层通用化
//2.1 基础DAO接口. B为实体类,继承了BaseObjec(基础对象);PK代表主键.
public interface BaseDao<B extends BaseObject,Q,extends Object>{
public PK add(B b); //根据对象添加数据,并返回主键 }
//2.2 BaseDaoImp为抽象类. 实现了BaseDao接口中定义的一系列通用方法(增加删除更改查询等).
public abstract class BaseDaoImp<B extends BaseObject, PK> implements BaseDao<B,PK> {
public PK add(B b) {
PK pk = (PK) sqlMapClient.insert(nameSpace + ".add", b); return pk;
}
//2.3 特定DAO接口
// 用户DAO的接口
public interface IUserDao extends BaseDao<User, UserQuery,String> {}
//特定DAO接口的实现
// 2.4 用户DAO实现类
public class UserDao extends BaseDaoImp<User,UserQuery,String>
implements IUserDao {
//提供一个有参和一个无参的构造方法
}
服务层和DAO层的通用化:概念与设计(继续)
3 SERVICE层通用化
//3.1 基础Service接口。
public interface BaseService<T extends BaseDao<B,PK>, B extends BaseObject,PK> {
public PK add(B b);//根据对象添加数据,并返回主键
}
//3.2 Service接口的实现类
public abstract class BaseServiceImp<T extends BaseDao<B, Q,PK>, B extends BaseObject, PK>
implements BaseService<T, B, Q,PK> {
public PK add(B b){// 对象添加数据,并返回主键
T t=gainT();//取得某一个DAO.
PK pk=t.add(b);//调用DAO的add方法。
return pk;
}
//3.3 特定Service接口
//用户Service接口
public interface IUserService extends BaseService<IUserDao, User,String>{}
//3.4 特定Service接口的实现
//用户Service实现
public class UserService extends BaseServiceImp<IUserDao, User, UserQuery,String>
implements IUserService {
private IUserDao userDao;
//userDao的getter和setter方法
}
七、SSI项目中开发步骤(用户登录的例子)
输入账号名(account)和密码(password),到最后成功转到主页(index.jsp)
• 1 JAVA类:
参考:user实体----àUserDao接口和实现类----àUserService接口和现实类----àUserAction类
• 2 配置Spring配置文件
applicationContext-daos.xml下添加:
<bean id="userDao" class="com.rlkj.smoa.dao.impl.UserDao">
<property name="sqlMapClient" ref="sqlMapClient" /></bean>
--àapplicationContext-services.xml下添加:
<bean id="userService" class="com.rlkj.smoa.service.impl.UserService">
<property name="userDao" ref="userDao" /></bean>
--àapplicationContext-actions.xml下添加:
<bean name="loginAction" class="com.rlkj.smoa.action.LoginAction" scope="prototype">
<property name="userService" ref="userService" />
</bean>
• 3 配置Struts配置文件
struts.xml下添加:
<action name="login" class="loginAction" method="login"> <!-- 登录 -->
<result name="success">/index.jsp</result>
<result name="input">/login.jsp</result>
<result name="fail">/login.jsp</result></action>
• 4 配置Ibatis配置文件
在com.rlkj.smoa.po.xml下新建:User.xml
<sqlMap namespace=“User”><!– 对应于DAO中的nameSpace值-->
<typeAlias alias="user" type="com.rlkj.smoa.po.User" />
<select id=“query” parameterClass=“user” resultClass=“user”>
<!--登录或用户管理的查询 -->
<!-- query对应于dao中的query List<B> list = sqlMapClient.queryForList(nameSpace + ".query", q); -- >
<![CDATA[ SELECT * FROM users ]]>
<dynamic prepend=“WHERE”><!– 动态标签 -->
<isNotNull property=“account” prepend=“AND”>
<!—如果不是Null:isNotNull;如果非空:isNotEmpty -->
account = #account:VARCHAR# </isNotNull>
</dynamic>
</select>
其他常用标签:插入数据:<insert></insert>;更新数据:<update></update>;删除数据:<delete></delete>
SqlMapConfig.xml中添加:
<sqlMap resource="com/rlkj/smoa/po/xml/User.xml" />
• 6 配置provider-rlkj.xml
<dao name=“UserDao“ implementation=”com.rlkj.smoa.dao.impl.UserDao” /><!—框架以外的配置内容,由于采用泛型得到DAO,需要根据名称得到DAO对象 à
• 5 写login.jsp页面
写form表单,通过submit标签将数据提交到login.action中,由LoginAction类的login方法进行出来。
八、问题与交流
问题:
• Struts2框架的大概处理流程?
• DAO/Service层通用化得优点和缺点?
• 我们的项目中,Ibatis大致是怎么用的?
• 如果有问题,请告知
• 如果发现有错误,请指出
• E-mail:brightmart@hotmail.com
• QQ:158085159
附录:Struts2框架的大概处理流程
1、加载类(FilterDispatcher)
2、读取配置(struts配置文件中的Action)
3、派发请求(客户端发送请求)
4、调用Action(FilterDispatcher从struts配置文件中读取与之相对应的Action )
5、启用拦截器(WebWork拦截器链自动对请求应用通用功能,如验证)
6、处理业务(回调Action的execute()方法)
7、返回响应(通过execute方法将信息返回到FilterDispatcher)
8、查找响应(FilterDispatcher根据配置查找响应的是什么信息如:SUCCESS、ERROER,将跳转到哪个jsp页面)
9、响应用户(jsp--->客户浏览器端显示)
10、struts2标签库(相比struts1的标签库,struts2是大大加强了,对数据的操作功能很强