4.3. 添加 Hibernate 功能支持
操作:[Menu] MyEclipse/Project Capabilities/Add Hibernate Capabilities
Hibernate 版本(Hibernate Specification)选择 "Hibernate 3.1" ,开发包(libraries)选择 Hibernate 3.1 Core Libraries、Spring 1.2 ORM/DAO/Hibernate3 Libaries 两项;
注: (如果出java.lang.NoClassDefFoundError: org/hibernate/cfg/HbmBinder$SecondPass异常,则是因为导入的包hibernate3.jar和 hibernate-annotations.jar的冲突,直接删除hibernate-annotations.jar即可) |
JAR Library Installation 选择 "copy checked..." ,"Library Folder" 选择 "/WebRoot/WEB-INF/lib" 。
点击 "下一步(Next)" 设置配置文件,选择 "Spring configuration file (applicationContext.xml)" 。
"下一步(Next)" 设置 Spring-Hibernate,选择 "Existing Spring configuration file" ,"SessionFactory ID" 项输入 "sessionFactory" 。
"下一步(Next)" 创建数据源对象,在 Bean Id 中输入 dataSource,"DataSource" 项选择 "Use JDBC Dirver" ,DB Driver 项选择 "MyWeb" ,其余项会自动填充;
记得选中 "Copy DB driver jar(s) to project and add to buidpath" 项,以便将数据连接的库文件复制到项目,方便以后的布署。
"下一步(Next)" 创建 SessionFactory 类,"Java package" 项设置为 "hibernate" (没有则点击"New"按钮添加),"Class name" 项保持默认即可"HibernateSessionFactory" ,Java Compliance Level选择和创建项目时选择的Java版本。(本例中并没有用到HibernateSessionFactory类,留作今后扩展)
点击 "完成(Finish)"。此时会自动建立hibernate.HibernateSessionFactory.java类
applicationContext.xml文件内会根据先前的配置自动添加dataSource和sessionFactory节点
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans> <bean name="/login" class="struts.action.LoginAction"></bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value> </property> <property name="url"> <value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=MyWeb;</value> <!-- 上面<value>...</alue>要在同一行,我在自动创建后没在同一行,修改一下即可。否则会出异常 --> </property> <property name="username"> <value>sa</value> </property> <property name="password"> <value>123456</value> </property> </bean> <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.SQLServerDialect </prop> </props> </property> </bean></beans> |
此时如果报错: Class ‘org.apache.commons.dbcp.BasicDataSource’ not found,是因为没有导入依赖包commons-dbcp.jar,导入此包即可
注: <value>...</alue>要在同一行,否则可能会出连接数据库失败。 |
4.4. 创建对象关系映射(ORM)的相关文件
操作:[Menu] Window/Open Perspective/MyEclipse Database Explorer
选中 users 表,点击右键,在出现的菜单中选择 "Hibernate Reverse Engnieering" 。
1、在弹出的窗口中保持 "Java package" 项为 "model" ;
2、选中 "Hibernate mapping file (*.hbm.xml) for each databases table" ,并保持 "Update hibernate..." 项选中;
3、选中 "Java Data Object" 项,并保持 "Create abstract class" 选中;
"Base persistent class" 项留空;
4、取消 "Java Data Access Object..." 项和 "Use custom templates" 项。
点击 "下一步(Next)" ,
再点击 "下一步(Next)" ,
在 "Configure reverse engineering details" 页选中 "users" 表,在右边出现的 "Class Name" 项中输入 "model.Users",其它不变。
点击 "完成(Finish)"。
完成此操作,会在 "model" 包下创建三个文件:AbstractUsers.java、Users.java、Users.hbm.xml。
此时sessionFactory部分会添加Users.hbm.xml映射文件的相关信息
<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.SQLServerDialect </prop> </props> </property> <property name="mappingResources"> <list> <value>model/Users.hbm.xml</value></list> </property></bean> |
4.5. 创建 IUsersDAO.java 接口和 UsersDAO.java 类
IUsesDAO.java 内容如下:
package dao; import model.Users; public interface IUsersDAO { public abstract boolean isValidUser(Users user); } |
UsersDAO.java 内容如下:
package dao; import java.util.List; import model.Users; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public class UsersDAO extends HibernateDaoSupport implements IUsersDAO { public boolean isValidUser(Users user) { // TODO 自动生成方法存根 List list= this.getHibernateTemplate().findByExample(user); if(list.size()>0) return true; return false; } } |
注意: 此处的HibernateDaoSupport 的路径可能有多个(可能导入了许多其它的包),注意此处的父类 为org.springframework.orm.hibernate3.support.HibernateDaoSupport 而不是org.springframework.orm.hibernate.support.HibernateDaoSupport |
4.6. 修改 LoginAction.java 文件
在LoginAction.java类中定义属性public IUsersDAO usersDao;并定义了一个setUsersDao(IUsersDAO usersDao)方法,可以让我们注入IUsersDAO的实例,在Action中使用 IUsersDAO对象来验证用户信息:(IUsersDAO必须为接口类型)
package struts.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import model.Users; import org.apache.struts.action.Action; import org.apache.struts.action.ActionError; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import dao.IUsersDAO; import struts.form.LoginForm;
public class LoginAction extends Action { public IUsersDAO usersDao;
public void setUsersDao(IUsersDAO usersDao){ this.usersDao= usersDao; }
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub String username= loginForm.getUsername(); String password= loginForm.getPassword(); ActionErrors errors= new ActionErrors(); Users user= new Users(); user.setUsername(username); user.setPassword(password); if(!usersDao.isValidUser(user)){ errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.nameOrPassword.required")); //如果登录失败,则判定用户名或密码错误 saveErrors(request, errors); return mapping.findForward("fail"); } return mapping.findForward("success"); } } |
4.7. 修改Spring配制文件 applicationContext.xml
(1)、定义UsersDAO节点,注入HibernateSessionFactory对象sessionFactory(属性及对应setter方法通过继承HibernateDaoSupport而来)
<bean id="usersDAO" class="dao.UsersDAO"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> |
(2)、增加事务功能
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> |
(3)、建立代理
<bean id="usersDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager"/> </property> <property name="target"> <ref local="usersDAO"/> </property> <property name="transactionAttributes"> <props> <prop key="is*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> |
(4)、修改处理用户请求的Controller定义,因为在LoginAction中定义了IUsersDAO usersDao属性,并提供了对应的setter方法,所以需要在配置文件中注入信息,把dao.UsersDAO的代理注入进来
<bean name="/login" class="struts.action.LoginAction"> <property name="usersDao"> <ref bean="usersDAOProxy"/> </property> </bean> |
完整的applicationContext.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value> <sp 发表评论 |
评论