由于工作的几个项目都是基于S2SM(strut2+spring+mybatis)或者是S2SI 的框架;所以趁着双休日休息,自己在这两天也尝试着搭了一个简易的SSI框架。废话不多讲,我们直接进入正题:
准备工作: (1)开发工具+数据库 (myEclipse 8.5 +tomcat 6.0+mysql 5.5);
(2)框架所需的jar包(这里就不一一列出jar包名了)
第一步,在准备工作完成之后,接下来就是创建web项目工程,创建完工程后,可以通过myEclipse 导入默认的spring 3.0 jar 包(【注】:通过默认导入的myEclipse自带的jar ,并且可以生产默认的applicationContext.xml文件。我们这里只要这个文件,将applicationContext.xml放在项目/WebRoot/WEB-INF文件夹下);当然同样可以通过导入默认的struts2的jar包 得到strut.xml。然后删除掉自带的jar包 ,引入我们自己的jar包(包括ibatis 和数据库连接的jar包)。
第二步,前面工作完成之后,我们要创建项目与数据库的连接(数据源配置),这里我们配置在applicationContext.xml ,包括ibatis 的sqlMapClient, 以及事物管理配置;详细见代码:
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 设置 MYSQL 数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/zengmeizhan?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="782306"/>
</bean>
<!-- 事物注解(数据库连接管理) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
<property name="globalRollbackOnParticipationFailure" value="false"/>
</bean>
<!-- 事务注解支持 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!--spring配置 ibatis -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocations" >
<value>classpath*:sqlMapConfig.xml</value>
</property>
<!-- 引入数据源 -->
<property name="dataSource" ref="dataSource"/>
<property name="useTransactionAwareDataSource">
<value>
false
</value>
</property>
</bean>
</beans>
以及在sqlMapconfig.xml 的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBatis.com//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings cacheModelsEnabled = "false"
enhancementEnabled = "false"
lazyLoadingEnabled = "false"
useStatementNamespaces = "true"
maxRequests = "128"
maxSessions = "64"
maxTransactions= "16"
/>
</sqlMapConfig>
【注】:cacheModelsEnabled :全局性地启用或禁用 SqlMapClient 的所有缓存cacheModelsEnabled model。调试程序时使用。
enhancementEnabled :全局性地启用或禁用运行时字节码增强,以优化访问Java Bean属性的性能,同时优化延迟加载的性能。
lazyLoadingEnabled :全局性地启用或禁用SqlMapClient的所有延迟加载。lazyLoadingEnabled 调试程序时使用。
useStatementNamespaces:如果启用本属性,必须使用全限定名来引用 mapped useStatementNamespaces statement。
Mapped statement 的全限定名由 sql-map 的名称和 mapped-statement 的名称合成。
maxRequests :同时执行 SQL 语句的最大线程数。
maxSessions :同一时间内活动的最大 session 数。
maxTransactions:同时进入 SqlMapClient.startTransaction()的最大线程maxTransactions 数。
第二步,要配置web.xml 文件,
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 配置Spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<!-- struts fiter -->
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,struts.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
第四步、接下来要创建我们所需要的包(基于mvc框架),已经创建一个实体Userbean(这里bean的代码就不贴出来了) ,以及对应映射的sqlMapper.xml文件。【注】由于之前在
sqlMapconfig.xml中指定useStatementNamespaces =true,所以在我们创建sqlMapper.xml 要给这个指定一个对应的namespace,而且要把配好的sqlMap.xml 引入到sqlMapconfig.xml中。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBatis.com//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="user">
<!-- 通过typeAlias使得我们在下面使用Contact实体类的时候不需要写包名 -->
<typeAlias alias ="alias_user" type ="com.zengMeizan.charge.domain.UserEntity"/>
<resultMap class="alias_user" id="userResultMapper">
<result property="id" column="ID" jdbcType="VARCHAR"/>
<result property="userName" column="USER_NAME" jdbcType="VARCHAR"/>
<result property="userCode" column="USER_CODE" jdbcType="VARCHAR"/>
<result property="password" column="PASSWORD" jdbcType="VARCHAR"/>
<result property="active" column="ACTIVE" jdbcType="VARCHAR"/>
<result property="createTime" column="CREATE_TIME" jdbcType="TIMESTAMP"/>
<result property="modifyTime" column="MODIFY_TIME" jdbcType="TIMESTAMP"/>
<result property="createUser" column="CREATE_USER_CODE" jdbcType="VARCHAR"/>
<result property="modifyUser" column="MODIFY_USER_CODE" jdbcType="VARCHAR"/>
</resultMap>
<!--insert sql -->
<insert id="insertOneUser" parameterClass="alias_user">
insert into user(ID,
USER_NAME,
USER_CODE,
PASSWORD,
ACTIVE,
CREATE_TIME,
MODIFY_TIME,
CREATE_USER_CODE,
MODIFY_USER_CODE
)values(
#id#,
#userName#,
#userCode#,
#password#,
#active#,
#createTime#,
#modifyTime#,
#createUser#,
#modifyUser#
);
</insert>
</sqlMap>
sqlMapconfig.xml中:
<!-- 引入mapper 文件 -->
<sqlMap resource="/com/zengMeizan/charge/domain/sqlMap/UserMapper.xml"/>
第五步、创建持久化数据层Dao接口,以及它的实现类;创建业务层Service接口,以及他的实现类。dao接口的实现类要还要继承SqlMapClientDaoSupport的抽象类;而且实现类中记得指定命名空间。由于通过spring来集成管理框架,所以要在applicationContext.xml 注入service中对dao层的依赖(action中也是由于注入对service层的依赖)
UserDaoImpl类
/**
* userDao的实现类
* @author leo
*
*/
public class UserDao extends SqlMapClientDaoSupport implements IUserDao {
public static final String NAMESPACE ="user.";
/**
* 新增数据
*/
@Override
public int addUser(UserEntity userEntity) {
Date now =new Date();
userEntity.setId(UUIDUtils.getUUID());
userEntity.setActive("Y");
userEntity.setCreateTime(now);
userEntity.setModifyTime(now);
UserEntity result= (UserEntity) this.getSqlMapClientTemplate().insert(NAMESPACE+"insertOneUser", userEntity);
return result !=null?1:0;
}
}
userServiceImpl类:
/**
*
* @author leo
*
*/
public class UserService implements IUserService {
/**
* userdao
*/
private IUserDao userDao;
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
/**
* 新增用户
*/
@Transactional
@Override
public int addUser(UserEntity userEntity) {
if(null ==userEntity ||StringUtils.isBlank(userEntity.getUserCode())){
throw new UserException("参数为空");
}
userEntity.setActive("Y");
userEntity.setCreateUser("USER");
userEntity.setCreateTime(new Date());
return userDao.addUser(userEntity);
}
}
applicationContext.xml中
<!-- spring 注入依赖 -->
<!-- dao -->
<bean id="userDao" class="com.zengMeizan.charge.dao.impl.UserDao">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
<!-- service -->
<bean id="userService" class="com.zengMeizan.charge.service.impl.UserService">
<property name="userDao" ref="userDao"/>
</bean>
<!-- action -->
<bean id="userAction" class="com.zengMeizan.charge.action.UserAction">
<property name="userService" ref="userService"/>
</bean>
第六步、创建UserAction,并且配置strut2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<include file="struts-user.xml"/>
<include file="struts-main.xml"/>
<!-- struts2 的开发模式 -->
<constant name="struts-devModel" value="true"/>
<!-- 用到json 必须继承josn-default -->
<package name="charge-default" extends="json-default">
<!-- 定义一个全局的结果集 -->
<global-results>
<result>/WEB-INF/jsp/fail.jsp</result>
</global-results>
</package>
</struts>
struts-user.xml中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 用户登录,增加,删除修改用户的struts -->
<package name="charge_login" namespace="/login" extends="charge-default">
<action name="user_addUser" class="userAction" method="addUser">
<result name="success">/WEB-INF/jsp/success.jsp</result>
</action>
</package>
</struts>
userAction类中
/**
*
* @author leo
*
*/
public class UserAction extends BaseAction {
/**
*
*/
private static final long serialVersionUID = -5421622271053463421L;
/**
* service
*/
private IUserService userService;
/**
* vo 前后台交互的尸体
*/
private UserEntityVo vo;
public UserEntityVo getVo() {
return vo;
}
public void setVo(UserEntityVo vo) {
this.vo = vo;
}
public void setUserService(IUserService userService) {
this.userService = userService;
}
/**
* 新增用户
* @return
*/
public String addUser(){
try {
//获取user
UserEntity userEntity = vo.getUserEntity();
userService.addUser(userEntity);
return "success";
} catch (UserException e) {
return "error";
}
}
}
最后,在webRoot 下的index.jsp 中创建一个form 模拟新增user,启动tomcat, 新增一个实体测试一下,若在数据库中查询到该记录说明框架搭建成功。