添加支持
我先介绍的是MyEclipse9的自带框架支持搭建过程:(完全的步骤 傻瓜式的学习。。~)
首先我们来搭建一个Web项目:
一、Hibernate(数据层)的搭建:
相关描述
Ⅰ.服务器与数据库之间的交互
Ⅱ. Hibernate封装了一系列的JDBC代码,提供相应的方法我们使用,使我们的开发变得简单快捷,效率大大提高
实现流程
二、Struts2(MVC)的搭建:
相关描述
Ⅰ.本质上相当于一个Servlet
Ⅱ.不需要手动获取传递参数 (只需要定义声明属性名和设置get、set的方法)、也不需要手动跳转(只需要struts.xml配置相关的路径)
Ⅲ.对项目的分包(例如:dao、service、entity等等),实现MVC模式的开发
Ⅳ.MVC: Action属于Model,而JSP是View页面的展示,其中过滤器起到了Controller的作用
实现流程
这里注意一点问题:
Struts2与Hibernate在一起搭建,antlr包,有冲突。MyEclipse9中有这样问题。朋友的MyEclipse10中没有这个问题。
我选择把Struts中antlr包去掉。
三、Spring(注入实例)的使用:
相关描述
Ⅰ.每一层的代码之间的耦合改为模块(分离/解耦),代码之间互不影响
Ⅱ.不再关注具体的实现类的实例
Ⅲ.更换不同的技术(模块),不需要改动代码,只需要修改applicationContext.xml的相关配置信息
Ⅳ.主要功能IOC(控制反转)松耦合、AOP (面向切面)内聚性
实现流程
编辑web.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" 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_3_0.xsd"> <display-name></display-name> <!-- 这是一只拦路虎 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 读取applicationContext.xml文件 不写默认Spring需要读取 WebContentWEB-INFapplicationContext.xml --> <context-param> <param-name>contextConfigLocation</param-name> <!-- 改变默认读取路径为src目录下的 applicationContext.xml 在改变的路径下还是没找到,便自动到默认路径查找 --> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 定义Spring监听器 class: spring 3.0 Web Libraries 下可以找到。 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Struts2过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
DB Browser中反转实体类:
数据访问层dao接口
package com.dao; import com.entity.Users; /** * 用户接口 * @author asus * */ public interface UsersDao { /** 登陆验证 */ Users loginCheck(Users user); }
数据访问层dao.impl实现类
1)继承HibernateDaoSupport类实现增删改查
package com.dao.impl; import java.util.List; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.dao.UsersDao; import com.entity.Users; /** * 用户接口实现类 * @author asus *HibernateTemplate、HibernateDaoSupport两种方法实现增删改查 *一种方法: Dao实现类继承HibernateDaoSupport类,该类是抽象类, 该类中有一个HibernateTemplate的属性,通过this.getHibernateTemplate()可获得一个HibernateTemplate类的模板对象。 */ public class UsersDaoImpl extends HibernateDaoSupport implements UsersDao { @Override public Users loginCheck(Users user) { //得到此类提供的模板实现增删改查 HibernateTemplate ht = this.getHibernateTemplate(); //得到一个集合 List<Users> list = ht.find("from Users where name=? and password=? ",user.getName(),user.getPassword()); //使用三元运算符,防止list.get(0)时报空指针。 return (Users) (list.size()>0?list.get(0):null); } }
2)定义HibernateTemplate模板对象属性
package com.dao.impl; import java.util.List; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.dao.UsersDao; import com.entity.Users; /** * 用户接口实现类 * @author asus *HibernateTemplate、HibernateDaoSupport两种方法实现增删改查 *第二种方法: 在dao类中定义一个HibernateTemplate类的对象,用该对象调用HibernateTemplate模板封装好的方法,如下: */ public class UsersDaoImpl implements UsersDao { //定义一个模板对象 HibernateTemplate hibernateTemplate; @Override public Users loginCheck(Users user) { //得到一个集合 List<Users> list = hibernateTemplate.find("from Users where name=? and password=? ",user.getName(),user.getPassword()); //使用三元运算符,防止list.get(0)时报空指针。 return (Users) (list.size()>0?list.get(0):null); } //生成Get'Set方法 public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } }
业务逻辑层接口service
package com.service; import com.entity.Users; /** * 用户业务逻辑层 * @author asus * */ public interface UsersService { /** 登陆验证 */ Users loginCheck(Users user); }
业务逻辑层接口实现类service.impl
package com.service.impl; import com.dao.UsersDao; import com.entity.Users; import com.service.UsersService; /** * 用户业务逻辑层实现类 * @author asus * */ public class UsersServiceImpl implements UsersService { //这里以前是new的,现在不需要了,交给Spring来实例 private UsersDao udd; @Override public Users loginCheck(Users user) { return udd.loginCheck(user); } //生成Get'Set public UsersDao getUdd() { return udd; } public void setUdd(UsersDao udd) { this.udd = udd; } }
控制器类Action
package com.action; import com.entity.Users; import com.opensymphony.xwork2.ActionSupport; import com.service.UsersService; /** * 用户控制器类 * @author asus * */ public class UsersAction extends ActionSupport { //接收页面的值 private Users user; //一样交给Spring实例 private UsersService uss; public String execute(){ return SUCCESS; } /** 判断用户输入的账号密码 */ public String login(){ if(user!=null){ Users checkResult = uss.loginCheck(user); if(checkResult!=null){ return SUCCESS; } } return LOGIN; } //生成Get'Set public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } public UsersService getUss() { return uss; } public void setUss(UsersService uss) { this.uss = uss; } }
登陆页面
<body> <form action="loginUser.action" method="post" > 用户名:<input type="text" name="user.name" /> 密码: <input type="password" name="user.password" /> <input type="submit" value="登录按钮" > </form> </body>
成功页面
<body> 登录成功! </body>
配置applicationContext.xml
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean> <!-- UsersBean配置 --> <!-- 第一种方法:Dao实现类继承HibernateDaoSupport类的配置 --> <bean id="userDaoImpl" class="com.dao.impl.UsersDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 第二种方法:在dao类中定义一个模板对象 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate" > <property name="sessionFactory" ref="sessionFactory" ></property> </bean> <bean id="userDaoImpl" class="com.dao.impl.UsersDaoImpl"> <property name="hibernateTemplate" ref="hibernateTemplate"></property> </bean> --> <bean id="userServiceImpl" class="com.service.impl.UsersServiceImpl"> <property name="udd" ref="userDaoImpl" /> </bean> <bean id="userSturts" class="com.action.UsersAction"> <property name="uss" ref="userServiceImpl" /> </bean> </beans>
配置Struts.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> <package name="struts2" namespace="/" extends="struts-default"> <action name="*User" class="userSturts" method="{1}" > <result name="success">/success.jsp</result> <result name="login">/login.jsp</result> </action> </package> </struts>
end:基本的登陆现在已经做好,现在我们开始做添加事务。
添加事务
数据访问层dao接口
package com.dao; import com.entity.District; /** * 区域接口 * @author asus * */ public interface DistrictDao { /** 添加区域 */ int addReg (District district); }
数据访问层dao.impl实现类
定义HibernateTemplate模板对象属性
package com.dao.impl; import org.springframework.dao.DataAccessException; import org.springframework.orm.hibernate3.HibernateTemplate; import com.dao.DistrictDao; import com.entity.District; /** * 区域接口实现类 * @author asus *HibernateTemplate、HibernateDaoSupport两种方法实现增删改查 *第二种方法: 在dao类中定义一个HibernateTemplate类的对象,用该对象调用HibernateTemplate模板封装好的方法,如下: */ public class DistrictDaoImpl implements DistrictDao { //定义一个模板对象 private HibernateTemplate hibernateTemplate; @Override public int addReg(District district) { try { hibernateTemplate.save(district); return 1; } catch (DataAccessException e) { e.printStackTrace(); } return 0; } //生成Get'Set方法 public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } }
业务逻辑层接口service
package com.service; import com.entity.District; /** * 地区业务逻辑类接口 * @author asus * */ public interface DistrictService { /** * 配置事务的话注意方法的命名规范以什么开头。 * @param district */ int addReg(District district); }
业务逻辑层接口实现类service.impl
package com.service.impl; import com.dao.DistrictDao; import com.entity.District; import com.service.DistrictService; /** * 区域业务逻辑层接口实现类 * * @author asus * */ public class DistrictServiceImpl implements DistrictService { //声明接口由Spring来实例 private DistrictDao ddd; @Override public int addReg(District district) { return ddd.addReg(district); } //声明Get'Set方法 public DistrictDao getDdd() { return ddd; } public void setDdd(DistrictDao ddd) { this.ddd = ddd; } }
控制器类Action
package com.action; import com.entity.District; import com.opensymphony.xwork2.ActionSupport; import com.service.DistrictService; /** * 控制器类 * 作用:添加区域 * @author asus * */ public class DistrictAction extends ActionSupport { //属性 private District district; private DistrictService dss; //处理添加请求 public String add(){ int addReg = dss.addReg(district); if(addReg>0){ return SUCCESS; } return "index"; } //生成Get'Set方法 public DistrictService getDss() { return dss; } public void setDss(DistrictService dss) { this.dss = dss; } public District getDistrict() { return district; } public void setDistrict(District district) { this.district = district; } }
添加页面
<body> <form action="addReg" method="post" > <input type="text" name="district.name" > <input type="submit" value="提交" > </form> </body>
成功页面
<body> 登录成功! </body>
配置applicationContext.xml(这里还是比较重要的,其中夹杂前面Users的Bean)
<?xml version="1.0" encoding="UTF-8"?> <!-- 配置事务第一步:需要导入的命名空间 命名规范: xsi:架构实例 beans:根节点 aop:事务 context:注解 tx:事务管理 xsi:schemaLocation 协议(一个命名规范对应一个协议) 注:若不知道自己使用的框架版本,可以把协议后的版本号去掉,此处已经去掉。 --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean> <!-- 配置事务第二步:配置事务管理器,将SessionFactory注入 --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置事务第三步:事务通知 tx:method: 管理事务的方法 name:方法的名字是已什么开头的 no-rollback-for="true":回滚 read-only="true":只读(默认false,是已非事务的方式来操作你的数据,比如查询) propagation:事务是以哪种方式来操作 REQUIRED:必填 (事务解释:比如一个方法中执行添加两张表的信息,第一个添加,没有事务开启一个事务,第二个添加加入第一个事务中,两个方法都成功则成功,一个失败全部回滚) name="*" :不在以上方法名开头之内的,是以非事务的方式来操作 --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <!-- 配置事务第四步:织入(以面相切面的方式编程) --> <aop:config> <!-- 切面 expression:表达式 * com.service.impl.*.*(..):(星 空格 包名 点星(代表所有此包下所有的类) 点星(代表类下所有的方法) 括号点点(代表方法中不管带有几个参数,只要符合命名规范都纳入事务管理)) --> <aop:pointcut id="serviceMethod" expression="execution(* com.service.impl.*.*(..))" /> <!-- 通知者 由切面和事务通知组成的通知者 --> <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/> </aop:config> <!-- UsersBean配置 --> <!-- 第一种方法:Dao实现类继承HibernateDaoSupport类的配置 --> <bean id="userDaoImpl" class="com.dao.impl.UsersDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 第二种方法:在dao类中定义一个模板对象 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate" > <property name="sessionFactory" ref="sessionFactory" ></property> </bean> <bean id="userDaoImpl" class="com.dao.impl.UsersDaoImpl"> <property name="hibernateTemplate" ref="hibernateTemplate"></property> </bean> --> <bean id="userServiceImpl" class="com.service.impl.UsersServiceImpl"> <property name="udd" ref="userDaoImpl" /> </bean> <bean id="userSturts" class="com.action.UsersAction"> <property name="uss" ref="userServiceImpl" /> </bean> <!-- DistrictBean配置 --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="DistrictDaoImpl" class="com.dao.impl.DistrictDaoImpl"> <property name="hibernateTemplate" ref="hibernateTemplate"></property> </bean> <bean id="DistrictServiceImpl" class="com.service.impl.DistrictServiceImpl"> <property name="ddd" ref="DistrictDaoImpl"></property> </bean> <bean id="DistrictAction" class="com.action.DistrictAction"> <property name="dss" ref="DistrictServiceImpl"></property> </bean> </beans>
优化SessionFacatory,使用Spring创建最原始的JDBC数据源
优化JDBC为C3P0数据源连接池
(注:代码确与上面有重复,我走的是步骤路线虽然代码重复太多,只为更容易理解)
配置applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- 配置事务第一步:需要导入的命名空间 命名规范: xsi:架构实例 beans:根节点 aop:事务 context:注解 tx:事务管理 xsi:schemaLocation 协议(一个命名规范对应一个协议) 注:若不知道自己使用的框架版本,可以把协议后的版本号去掉,此处已经去掉。 --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 倒数第二步:这个sessionFactory使用的还是最原始的,可以优化,真正实际开发不会去用,测试可用。 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean>--> <!-- 最后一步:优化sessionFactory: hibernate.cfg.xml中数据库连接方式可以由Spring来创建与管理 操作步骤:使用Spring创建数据源: 右键Spring——>New DataSource and SessionFactory(有图解) (Spring提供的是最原始的JDBC数据源连接池的写法,当然可以再成优化C3P0,DBCP数据源连接池) --> <!-- dataSource创建的: JDBC数据源写法(将C3P0数据源连接池写法注释掉就可用此数据源,它的HTML注释太多就先注释此..) <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"> </property> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"> </property> <property name="username" value="root"></property> <property name="password" value="admin"></property> </bean> --> <!-- C3P0数据源连接池写法 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property> <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:orcl"></property> <property name="user" value="root" /> <property name="password" value="admin" /> <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> <property name="initialPoolSize" value="1" /> <!--连接池中保留的最小连接数。 --> <property name="minPoolSize" value="1" /> <!--连接池中保留的最大连接数。Default: 15 --> <property name="maxPoolSize" value="300" /> <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> <property name="maxIdleTime" value="60" /> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement" value="5" /> <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod" value="60" /> </bean> <!-- session的创建方式 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle9Dialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hiberenate.format_sql">true</prop> </props> </property> <property name="mappingResources"> <list> <value>com/entity/District.hbm.xml</value> <value>com/entity/House.hbm.xml</value> <value>com/entity/Street.hbm.xml</value> <value>com/entity/Type2.hbm.xml</value> <value>com/entity/Users.hbm.xml</value> </list> </property> </bean> <!-- 配置事务第二步:配置事务管理器,将SessionFactory注入 --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置事务第三步:事务通知 tx:method: 管理事务的方法 name:方法的名字是已什么开头的 no-rollback-for="true":回滚 read-only="true":只读(默认false,是已非事务的方式来操作你的数据,比如查询) propagation:事务是以哪种方式来操作 REQUIRED:必填 (事务解释:比如一个方法中执行添加两张表的信息,第一个添加,没有事务开启一个事务,第二个添加加入第一个事务中,两个方法都成功则成功,一个失败全部回滚) name="*" :不在以上方法名开头之内的,是以非事务的方式来操作 --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <!-- 配置事务第四步:织入(以面相切面的方式编程) --> <aop:config> <!-- 切面 expression:表达式 * com.service.impl.*.*(..):(星 空格 包名 点星(代表所有此包下所有的类) 点星(代表类下所有的方法) 括号点点(代表方法中不管带有几个参数,只要符合命名规范都纳入事务管理)) --> <aop:pointcut id="serviceMethod" expression="execution(* com.service.impl.*.*(..))" /> <!-- 通知者 由切面和事务通知组成的通知者 --> <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/> </aop:config> <!-- UsersBean配置 --> <!-- 第一种方法:Dao实现类继承HibernateDaoSupport类的配置 --> <bean id="userDaoImpl" class="com.dao.impl.UsersDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 第二种方法:在dao类中定义一个模板对象 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate" > <property name="sessionFactory" ref="sessionFactory" ></property> </bean> <bean id="userDaoImpl" class="com.dao.impl.UsersDaoImpl"> <property name="hibernateTemplate" ref="hibernateTemplate"></property> </bean> --> <bean id="userServiceImpl" class="com.service.impl.UsersServiceImpl"> <property name="udd" ref="userDaoImpl" /> </bean> <bean id="userSturts" class="com.action.UsersAction"> <property name="uss" ref="userServiceImpl" /> </bean> <!-- DistrictBean配置 --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="DistrictDaoImpl" class="com.dao.impl.DistrictDaoImpl"> <property name="hibernateTemplate" ref="hibernateTemplate"></property> </bean> <bean id="DistrictServiceImpl" class="com.service.impl.DistrictServiceImpl"> <property name="ddd" ref="DistrictDaoImpl"></property> </bean> <bean id="DistrictAction" class="com.action.DistrictAction"> <property name="dss" ref="DistrictServiceImpl"></property> </bean> </beans>
附Spring创建JDBC数据源图: