屬性singleton="false",指明了Action 的實(shí)例獲取方式為每次重新創(chuàng)建。解決了Struts中令人詬病的線程安全問題(Struts中,由一個(gè)Action實(shí)例處理所有的請(qǐng)求,這就導(dǎo)致了類公用資源在并發(fā)請(qǐng)求中的線程同步問題。)(摘自spring開發(fā)指南)
?
建立數(shù)據(jù)庫在 這里我使用的是mysql4.1.13
?
CREATE TABLE `user` (
? `ID` int(11) NOT NULL auto_increment,
? `USERNAME` varchar(50) NOT NULL default '',
? `PASSWORD` varchar(50) NOT NULL default '',
? PRIMARY KEY? (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
?
添加記錄 insert into user (USERNAME,PASSWORD) values ('test','test')
?
創(chuàng)建Hibernate框架
在配置界面中配置數(shù)據(jù)庫的連接部份,重要的是點(diǎn)擊鏈接將jdbc拷貝到lib目錄中
使用MyEclipse的數(shù)據(jù)Database Explorer工具創(chuàng)建User.hmb.xml、AbstractUser.java、User.java映射文件
創(chuàng)建完成后可以將自動(dòng)生成的hibernate.cfg.xml刪除
?
創(chuàng)建UserDAO.java、UserDAOImp.java
UserDAO.java
public interface UserDAO {
?? public abstract boolean isValidUser(String username, String password);
}
?
UserDAOImp.java
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.test.Hibernate.SessionFactory;
public class UserDAOImp extends HibernateDaoSupport implements UserDAO {
??? private SessionFactory sessionFactory;
??? private static String hql = "from User u where u.username=? ";
??? public boolean isValidUser(String username, String password) {
?????? List userList = this.getHibernateTemplate().find(hql, username);
?????? if (userList.size() > 0) {
?????????? return true;
?????? }
?????? return false;
??? }
}
?
修改LoginAction.java文件,使用userDao的方法來進(jìn)行用戶驗(yàn)證
package com.test.struts.action;
?
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
?
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.DynaValidatorForm;
?
import com.test.UserDAO;
public class LoginAction extends Action {
?private UserDAO userDAO;
?
?public UserDAO getUserDAO() {
??return userDAO;
?}
?
?public void setUserDAO(UserDAO userDAO) {
??this.userDAO = userDAO;
?}
?
?public ActionForward execute(ActionMapping mapping, ActionForm form,
???HttpServletRequest request, HttpServletResponse response) {
??DynaValidatorForm loginForm = (DynaValidatorForm) form;
??// TODO Auto-generated method stub
??String username = (String) loginForm.get("username");
??String password = (String) loginForm.get("password");
??loginForm.set("password", null);
??if (userDAO.isValidUser(username,password)) {
???return mapping.findForward("indexGo");
??} else {
???return mapping.getInputForward();
??}
?}
}
綠色字體為修改部份
?
現(xiàn)在剩下最后的spring配置了
?
<beans>
?<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
??<property name="driverClassName">
???<value>com.mysql.jdbc.Driver</value>
??</property>
??<property name="url">
???<value>jdbc:mysql://localhost/test</value>
??</property>
??<property name="username">
???<value>root</value>
??</property>
??<property name="password">
???<value>root</value>
??</property>
?</bean>
?
?<!-- 配置sessionFactory, 注意這里引入的包的不同? -->
?<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
??<property name="dataSource">
???<ref local="dataSource" />
??</property>
??<property name="mappingResources">
???<list>
????<value>com/test/Hibernate/User.hbm.xml</value>
???</list>
??</property>
??<property name="hibernateProperties">
???<props>
????<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
????<prop key="hibernate.show_sql">true</prop>
???</props>
??</property>
?</bean>
?
?<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
??<property name="sessionFactory">
???<ref local="sessionFactory" />
??</property>
?</bean>
?
?<bean id="userDAO" class="com.test.UserDAOImp">
??<property name="sessionFactory">
???<ref local="sessionFactory" />
??</property>
?</bean>
?
?<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
??<property name="transactionManager">
???<ref bean="transactionManager" />
??</property>
??<property name="target">
???<ref local="userDAO" />
??</property>
??<property name="transactionAttributes">
???<props>
????<prop key="insert*">PROPAGATION_REQUIRED</prop>
????<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
????<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
???</props>
??</property>
?</bean>
?
?<bean name="/login" class="com.test.struts.action.LoginAction" singleton="false">
??<property name="userDAO">
???<ref bean="userDAOProxy" />
??</property>
?</bean>
</beans>
?
現(xiàn)在可以進(jìn)行測(cè)試了!
?
在編寫代碼有配置內(nèi)容時(shí)一定要注意 hibernate 和 hibernate3 ,這兩個(gè)包的名字就只差一個(gè)字,千萬不要有錯(cuò),否則找錯(cuò)誤可是很難的。