Dean_tdy

 

Struts+Spring+Ibatis

目 录

•             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项目中开发步骤(用户登录的例子)

用户登录:用户在http://localhost:8080/SMOA/login.action

输入账号名(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

更多资料,请登录:http://blog.sina.com.cn/brightmart

 

 

 

附录: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是大大加强了,对数据的操作功能很强

posted on 2012-03-20 14:05  Dean_tdy  阅读(631)  评论(1)    收藏  举报

导航