首页 > 代码库 > struts-2.3.16.3+hibernate-3.2.5+spring-2.5全注解配置

struts-2.3.16.3+hibernate-3.2.5+spring-2.5全注解配置

1、新建项目  结构如下:

 

2、导入相关的jar

3、整合步骤先整合 Spring2.5+Hibernate3.3 成功后在整合 Struts2 这样就不容易报错,而且 报错误后也便于找出问题。
applicationContext.xml
spring配置文件模版可以到 spring自带的一些例子中进行拷贝。

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" 4     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" 5     xmlns:jee="http://www.springframework.org/schema/jee" 6     xsi:schemaLocation=" 7             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 8             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 9             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd10             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd11             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">12 13     <!-- 加载数据库属性配置文件 -->14     <context:property-placeholder location="classpath:db.properties" />15     <!-- 扫描包的范围 -->16     <context:component-scan base-package="demo.loading.*" />17 18     <!-- 数据库连接池c3p0配置 -->19     <!-- destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用 -->20     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"21         destroy-method="close">22         <property name="driverClass" value="http://www.mamicode.com/${driverClassName}"></property>23         <property name="jdbcUrl" value="http://www.mamicode.com/${url}"></property>24         <property name="user" value="http://www.mamicode.com/${username}"></property>25         <property name="password" value="http://www.mamicode.com/${password}"></property>26 27         <!-- 连接池中的最大连接数 -->28         <property name="maxPoolSize" value="http://www.mamicode.com/${maxPoolSize}" />29 30         <!-- 连接池中的最小连接数 -->31         <property name="minPoolSize" value="http://www.mamicode.com/${minPoolSize}" />32 33         <!-- 初始化连接池中的 连接数,取值 在 minPoolSize 和 maxPoolSize 之间,default:3 -->34         <property name="initialPoolSize" value="http://www.mamicode.com/${initialPoolSize}" />35 36         <!-- 最大空闲时间,60s内该连接没有被使用则被丢弃,若为0 永不丢弃.default:0 -->37         <property name="maxIdleTime" value="http://www.mamicode.com/${maxIdleTime}" />38 39         <!-- 当连接数不够时,每次同时创建多少个连接 -->40         <property name="acquireIncrement" value="http://www.mamicode.com/${acquireIncrement}" />41 42         <!-- 每60s检查连接池中的所有空间连接,如果没有被使用,就被放弃, default:0 -->43         <property name="idleConnectionTestPeriod" value="http://www.mamicode.com/${idleConnectionTestPeriod}" />44     </bean>45 46     <!-- 将Hibernate中的事物交给Spring进行接管 -->47     <bean id="sessionFactory"48         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">49         <!-- 指定sessiongFactory中的数据源 -->50         <property name="dataSource" ref="dataSource"></property>51         <!-- 指定hibernate的属性 -->52         <property name="hibernateProperties">53             <props>54                 <!-- hibernate使用的 方言 -->55                 <prop key="hibernate.dialect">${hibernate.dialect}</prop>56                 <!-- 根据实体的映射文件生成表结构 -->57                 <prop key="hibernate.hbm2ddl.auto">update</prop>58                 <!-- 是否打印出sql语句 -->59                 <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>60                 <!-- 格式化sql -->61                 <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>62             </props>63         </property>64         <!-- 配置自动扫描实体类 -->65         <property name="packagesToScan">66             <list>67                 <value>demo.loading.*</value>68             </list>69         </property>70     </bean>71 72     <!-- 配置使用基于Hibernate的事务管理器 -->73     <bean id="txManager"74         class="org.springframework.orm.hibernate3.HibernateTransactionManager">75         <!-- spring需要通过sessionFactory来开启事务 -->76         <property name="sessionFactory" ref="sessionFactory"></property>77     </bean>78 79     <!--Spring中的事物配置声明.1 基于xml 配置方式 2.基于注解来声明那些类 -->80     <tx:annotation-driven proxy-target-class="true" transaction-manager="txManager" />81 </beans>

 

db.properties 数据库相关配置的信息

 

demo.loading.entity 新建实体User

 1 package demo.loading.entity; 2  3 import java.util.Date; 4  5 import javax.persistence.Column; 6 import javax.persistence.Entity; 7 import javax.persistence.GeneratedValue; 8 import javax.persistence.GenerationType; 9 import javax.persistence.Id;10 import javax.persistence.Table;11 import javax.persistence.Temporal;12 import javax.persistence.TemporalType;13 14 @Entity        //注释指名这是一个实体Bean15 @Table(name = "user")        //为实体Bean指定对应数据库表16 public class User {17     private Integer id;18     private String username;19     private String password;20     private String address;21     private String phoneNumber;22     private Date createTime;23     private Date updateTime;24 25     @Id        //注解声明了该实体Bean的标识属性26     @GeneratedValue(strategy = GenerationType.AUTO)        //注解可以定义该标识符的生成策略。自动增长27     @Column(name = "ID", length = 20)        //28     public Integer getId() {29         return id;30     }31 32     public void setId(Integer id) {33         this.id = id;34     }35 36     public String getUsername() {37         return username;38     }39 40     public void setUsername(String username) {41         this.username = username;42     }43 44     public String getPassword() {45         return password;46     }47 48     public void setPassword(String password) {49         this.password = password;50     }51 52     public String getAddress() {53         return address;54     }55 56     public void setAddress(String address) {57         this.address = address;58     }59 60     public String getPhoneNumber() {61         return phoneNumber;62     }63 64     public void setPhoneNumber(String phoneNumber) {65         this.phoneNumber = phoneNumber;66     }67 68     @Temporal(TemporalType.TIMESTAMP)69     public Date getCreateTime() {70         return createTime;71     }72 73     public void setCreateTime(Date createTime) {74         this.createTime = createTime;75     }76 77     @Temporal(TemporalType.TIMESTAMP)78     public Date getUpdateTime() {79         return updateTime;80     }81 82     public void setUpdateTime(Date updateTime) {83         this.updateTime = updateTime;84     }85 86 }

demo.loading.common.db   新建公用的接口IBaseDao

  1 package demo.loading.common.db;  2   3 import java.io.Serializable;  4 import java.util.List;  5   6 /**  7  * DAO 基类接口  8  * @param <T> T pojo类型  9  * @param <ID> ID类型 10  */ 11 public interface IBaseDao<T, ID extends Serializable> { 12     /** 13      * 获得持久化对象的类型 14      * @return 15      */ 16     public abstract Class<T> getPersistentClass(); 17  18     /** 19      * 保存 20      * @param entity 实体类 21      */ 22     public abstract void save(T entity); 23  24     /** 25      * 删除 26      * @param entity 实体类 27      */ 28     public abstract void delete(T entity); 29  30     /** 31      * 与findByProperty相似,当properyName == value 时把相应的记录删除 32      */ 33     public abstract void deleteByProperty(String propertyName, Object value); 34  35     /** 36      * 更新 37      * @param entity 38      */ 39     public abstract void update(T entity); 40  41     /** 42      * 保存或者更新 43      * @param entity 44      */ 45     public abstract void saveOrUpdate(T entity); 46  47     /** 48      * 查询所有 49      */ 50     public abstract List<T> findAll(); 51  52     /** 53      * 查找所有,并分页 54      * @param page 要返回的页数 55      * @param pageSize 没有记录数 56      * @return 57      */ 58     public abstract List<T> findAll(int page, int pageSize); 59  60     /** 61      * 根据id查找 62      * @param id 63      * @return 64      */ 65     public abstract T findById(ID id); 66  67     public abstract List<T> findByExample(T entity); 68  69     /** 70      * 通过属性查找 71      * @param propertyName 属性名称 72      * @param value 属性的值 73      * @return 74      */ 75     public abstract List<T> findByProperty(String propertyName, Object value); 76  77     /** 78      * 通过多个属性查找 79      * @param propertyNames 属性名称数组 80      * @param values  属性值数组 81      * @return 82      */ 83     public abstract List<T> findByPropertys(String[] propertyNames, Object[] values); 84  85     /** 86      * 通过多个属性查找,并分页, 属性名称数组和属性值数组的序列要对应 87      * @param propertyNames 属性名称数组 88      * @param values 属性值数组 89      * @param page 页码 90      * @param pageSize 每页内容条数 91      * @return 92      */ 93     public List<T> findByPropertys(String[] propertyNames, Object[] values, int page, int pageSize); 94  95     /** 96      * 通过属性查找,并分页, 属性名称数组和属性值数组的序列要对应 97      * @param propertyNames 属性名称 98      * @param values 属性值 99      * @param page 页码100      * @param pageSize 每页内容条数101      * @return102      */103     public List<T> findByProperty(String propertyName, Object value, int page, int pageSize);104 105     /**106      * 查找并通过某一属性排序107      * @param property 排序依据的顺序108      * @param isSequence 是否顺序排序109      */110     public List<T> findAndOrderByProperty(int firstResult, int fetchSize, String propertyName, boolean isSequence);111 112     /**113      * 查找并通过某一属性排序114      * @param property  排序依据的顺序115      * @param isSequence 是否顺序排序116      */117     public List<T> findAllAndOrderByProperty(String propertyName, boolean isSequence);118 119     /**120      * 统计所有记录的总数121      * @return 总数122      */123     public int totalPage();124 125     /**126      * 统计数据库中当propertyName=value时的记录总数127      * @param propertyName128      * @param value129      * @return130      */131     public int totalPageByProperty(String propertyName, Object value);132 133     /**134      * 统计数据库中当多个propertyName=value时的记录总数135      * @param propertyNames136      * @param values137      * @return138      */139     public int totalPageByPropertys(String[] propertyNames, Object[] values);140 141 }

demo.loading.common.db   新建IBaseDao的实现类BaseDao

  1 package demo.loading.common.db;  2   3 import java.io.Serializable;  4 import java.lang.reflect.ParameterizedType;  5 import java.util.List;  6   7 import javax.annotation.Resource;  8   9 import org.hibernate.Query; 10 import org.hibernate.SessionFactory; 11 import org.springframework.beans.factory.annotation.Autowired; 12 import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 13 import org.springframework.stereotype.Repository; 14  15  16 /** 17  * DAO的Hibernate基类 18  * @param <T> pojo的类型 19  * @para <ID> id的类型 20  */ 21 @SuppressWarnings("all") 22 public class BaseDao<T, ID extends Serializable> extends HibernateDaoSupport implements IBaseDao<T, ID> { 23      24     @Resource    //把sessionfactory注入baseDao 25     public void setMySessionFactory(SessionFactory sf) { 26         super.setSessionFactory(sf); 27     } 28  29     private Class<T> persistentClass; 30  31     public BaseDao() { 32         // 获取持久化对象的类型 33         this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 34     } 35  36     /** 37      * 获得持久化对象的类型 38      * @return 39      */ 40     public Class<T> getPersistentClass() { 41         return persistentClass; 42     } 43  44     /** 45      * 保存 46      * @param entity 实体类 47      */ 48     public void save(T entity) { 49         this.getHibernateTemplate().save(entity); 50     } 51  52     /** 53      * 删除 54      * @param entity  实体类 55      */ 56     public void delete(T entity) { 57         this.getHibernateTemplate().delete(entity); 58     } 59  60     /** 61      * 与findByProperty相似,当properyName == value 时把相应的记录删除 62      */ 63     public void deleteByProperty(String propertyName, Object value) { 64         String queryString = "delete from " + getPersistentClass().getName() + " as model where model." + propertyName + "= ?"; 65         Query query = this.getSession().createQuery(queryString); 66         query.setParameter(0, value); 67         query.executeUpdate(); 68     } 69  70     /** 71      * 更新 72      * @param entity 73      */ 74     public void update(T entity) { 75         this.getHibernateTemplate().update(entity); 76     } 77  78     /** 79      * 保存或者更新 80      * @param entity 81      */ 82     public void saveOrUpdate(T entity) { 83         this.getHibernateTemplate().saveOrUpdate(entity); 84     } 85  86     /** 87      * 查询所有 88      *  89      */ 90     public List<T> findAll() { 91         return this.getHibernateTemplate().find("from " + getPersistentClass().getName()); 92     } 93  94     /** 95      * 查找所有,并分页 96      * @param page 要返回的页数 97      * @param pageSize 没有记录数 98      * @return 99      */100 101     public List<T> findAll(int page, int pageSize) {102         String queryString = "from " + getPersistentClass().getName();103         Query query = this.getSession().createQuery(queryString);104         int firstResult = (page - 1) * pageSize;105         query.setFirstResult(firstResult);106         query.setMaxResults(pageSize);107         return query.list();108     }109 110     /**111      * 通过id查找112      * @param id113      * @return114      */115     public T findById(ID id) {116         return (T) this.getHibernateTemplate().get(getPersistentClass(), id);117     }118 119     /**120      * find By Example121      * @param entity122      * @return123      */124     public List<T> findByExample(T entity) {125         return this.getHibernateTemplate().findByExample(entity);126     }127 128     /**129      * 通过属性查找130      * @param propertyName  属性名称131      * @param value  属性的值132      * @return133      */134     public List<T> findByProperty(String propertyName, Object value) {135         String hql = "from " + getPersistentClass().getName() + " as model where model." + propertyName + "= ?";136         return this.getHibernateTemplate().find(hql, value);137 138     }139 140     /**141      * 通过多个属性查找142      * @param propertyNames 属性名称数组143      * @param values 属性值数组144      * @return145      */146     public List<T> findByPropertys(String[] propertyNames, Object[] values) {147         StringBuffer sb = new StringBuffer();148         sb.append("from " + getPersistentClass().getName());149         sb.append(" as model where ");150         for (int i = 0; i < propertyNames.length; i++) {151             if (i != 0)152                 sb.append(" and");153             sb.append(" model.");154             sb.append(propertyNames[i]);155             sb.append("=");156             sb.append("? ");157         }158         String hql = sb.toString();159         return this.getHibernateTemplate().find(hql, values);160     }161 162     /**163      * 通过多个属性查找,并分页, 属性名称数组和属性值数组的序列要对应164      * @param propertyNames 属性名称数组165      * @param values  属性值数组166      * @param page 页码167      * @param pageSize 每页内容条数168      * @return169      */170     public List<T> findByPropertys(String[] propertyNames, Object[] values, int page, int pageSize) {171 172         StringBuffer strBuffer = new StringBuffer();173         strBuffer.append("from " + getPersistentClass().getName());174         strBuffer.append(" as model where ");175         for (int i = 0; i < propertyNames.length; i++) {176             if (i != 0)177                 strBuffer.append(" and");178             strBuffer.append(" model.");179             strBuffer.append(propertyNames[i]);180             strBuffer.append("=");181             strBuffer.append("? ");182         }183         String queryString = strBuffer.toString();184 185         int firstResult = (page - 1) * pageSize;186 187         Query query = this.getSession().createQuery(queryString);188         query.setFirstResult(firstResult);189         query.setMaxResults(pageSize);190         for (int i = 0; i < values.length; i++) {191             query.setParameter(i, values[i]);192         }193 194         return query.list();195     }196 197     /**198      * 通过属性查找,并分页, 属性名称数组和属性值数组的序列要对应199      * @param propertyNames 属性名称200      * @param values 属性值201      * @param page 页码202      * @param pageSize 每页内容条数203      * @return204      */205     public List<T> findByProperty(String propertyName, Object value, int page, int pageSize) {206         return this.findByPropertys(new String[] { propertyName }, new Object[] { value }, page, pageSize);207     }208 209     /**210      * 查找并通过某一属性排序211      * @param property 排序依据的顺序212      * @param isSequence 是否顺序排序213      */214     public List<T> findAndOrderByProperty(int firstResult, int fetchSize, String propertyName, boolean isSequence) {215         String queryString = "from " + getPersistentClass().getName() + " as model order by model." + propertyName;216         if (isSequence == false) {217             queryString = queryString + " DESC";218         }219 220         Query queryObject = getSession().createQuery(queryString);221         queryObject.setFirstResult(firstResult);222         queryObject.setMaxResults(fetchSize);223         return queryObject.list();224 225     }226 227     /**228      * 查找并通过某一属性排序229      * @param property 排序依据的顺序230      * @param isSequence 是否顺序排序231      */232     public List<T> findAllAndOrderByProperty(String propertyName, boolean isSequence) {233         String queryString = "from " + getPersistentClass().getName() + " as model order by model." + propertyName;234         if (isSequence == false) {235             queryString = queryString + " DESC";236         }237 238         Query queryObject = getSession().createQuery(queryString);239         return queryObject.list();240     }241 242     /**243      * 统计所有记录的总数244      * @return 总数245      */246     public int totalPage() {247         String queryString = "select count(*) from " + getPersistentClass().getName();248         Query query = this.getSession().createQuery(queryString);249         List list = query.list();250         Long result = (Long) list.get(0);251         return result.intValue();252     }253 254     /**255      * 统计数据库中当propertyName=value时的记录总数256      * @param propertyName257      * @param value258      * @return259      */260     public int totalPageByProperty(String propertyName, Object value) {261         String[] propertyNames = new String[] { propertyName };262         Object[] values = new Object[] { value };263         return this.totalPageByPropertys(propertyNames, values);264     }265 266     /**267      * 统计数据库中当多个propertyName=value时的记录总数268      * @param propertyNames269      * @param values270      * @return271      */272     public int totalPageByPropertys(String[] propertyNames, Object[] values) {273         StringBuffer strBuffer = new StringBuffer();274         strBuffer.append("select count(*) from " + getPersistentClass().getName());275         strBuffer.append(" as model where ");276         for (int i = 0; i < propertyNames.length; i++) {277             if (i != 0)278                 strBuffer.append(" and");279             strBuffer.append(" model.");280             strBuffer.append(propertyNames[i]);281             strBuffer.append("=");282             strBuffer.append("? ");283         }284 285         String queryString = strBuffer.toString();286         Query query = this.getSession().createQuery(queryString);287         for (int i = 0; i < values.length; i++) {288             query.setParameter(i, values[i]);289         }290 291         List list = query.list();292         Long result = (Long) list.get(0);293         return result.intValue();294     }295 296 }

简单的实现一个注册登录的方法
demo.loading.dao.idao  新建接口IUserDao

 1 package demo.loading.dao.idao; 2  3 import java.util.List; 4  5 import demo.loading.common.db.IBaseDao; 6 import demo.loading.entity.User; 7  8  9 public interface IUserDao extends IBaseDao<User, String> {10 11     public List<User> login(String[] params, Object[] values);12     13 }

demo.loading.dao.imp 新建接口实现类UserDao

 1 package demo.loading.dao.imp; 2  3 import java.util.List; 4  5 import org.springframework.stereotype.Repository; 6  7 import demo.loading.common.db.BaseDao; 8 import demo.loading.dao.idao.IUserDao; 9 import demo.loading.entity.User;10 11 @Repository("iUserDao")12 //@Repository它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。13 //为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,14 //需要在 XML 配置文件中启用Bean 的自动扫描功能15 public class UserDaoImpl extends BaseDao<User, String> implements IUserDao {16 17     public List<User> login(String[] params, Object[] values) {18         List<User> list = super.findByPropertys(params, values);19         return list;20     }21 22 }

demo.loading.test 新建 UserDaoImplTest 测试类

 1 package demo.loading.test; 2  3 import java.util.List; 4  5 import org.junit.Test; 6 import org.springframework.context.ApplicationContext; 7 import org.springframework.context.support.ClassPathXmlApplicationContext; 8  9 import demo.loading.dao.idao.IUserDao;10 import demo.loading.entity.User;11 12 public class UserDaoImplTest {13     private static IUserDao userDao;14     static{15         String config = "applicationContext.xml";16         ApplicationContext ac = new ClassPathXmlApplicationContext(config);17         userDao = (IUserDao) ac.getBean("iUserDao");18     }19 20     @Test21     public void testLogin() {22         String[] params = new String[] { "username", "password" };23         Object[] values = new Object[] { "1009", "000000" };24         List<User> users = userDao.findByPropertys(params, values);25         for(User user : users){26             System.out.println(user.getUsername());27         }28     }29 30 }

demo.loading.service.iservice 新建IUserService接口

1 package demo.loading.service.iservice;2 3 import java.util.List;4 5 import demo.loading.entity.User;6 7 public interface IUserService {8     public List<User> login(String[] params, Object[] values);9 }

demo.loading.service.impl 新建IUserService的实现类

 1 package demo.loading.service.impl; 2  3 import java.util.List; 4  5 import javax.annotation.Resource; 6  7 import org.springframework.stereotype.Repository; 8 import org.springframework.stereotype.Service; 9 import org.springframework.transaction.annotation.Transactional;10 11 import demo.loading.dao.idao.IUserDao;12 import demo.loading.entity.User;13 import demo.loading.service.iservice.IUserService;14 15 @Service    16 //@Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。17 //@Service 通常作用在业务层,但是目前该功能与 @Component 相同。18 @Transactional    19 //配置事务 默认的增删改查 @Transactional(readOnly=true) 查询使用 只读20 @Repository("iUserService")21 public class UserServiceImpl implements IUserService {22 23     @Resource IUserDao userDao;        //注入IUserDao24     25     public List<User> login(String[] params, Object[] values) {26         return userDao.login(params, values);27     }28 }

demo.loading.test 新建UserServiceImplTest测试类

package demo.loading.test;import java.util.List;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import demo.loading.entity.User;import demo.loading.service.iservice.IUserService;public class UserServiceImplTest {    public static  IUserService userService;    static {        String config = "applicationContext.xml";        ApplicationContext ac = new ClassPathXmlApplicationContext(config);        userService = (IUserService) ac.getBean("iUserService");    }    @Test    public void testLogin() {        String[] params = new String[] { "username", "password" };        Object[] values = new Object[] { "1009", "000000" };        List<User> users = userService.login(params, values);        for(User user : users){            System.out.println(user.getUsername());        }    }}

------------------------------------------------------------------------------

hibernate+spring 整合完毕

------------------------------------------------------------------------------

整合struts2

Xml代码

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  5     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 6     <display-name></display-name> 7  8     <welcome-file-list> 9         <welcome-file>login.jsp</welcome-file>10     </welcome-file-list>11 12     <!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 -->13     <context-param>14         <param-name>contextConfigLocation</param-name>15         <!-- 如果有多个文件 使用 "," 分开 -->16         <param-value>classpath:applicationContext.xml</param-value>17     </context-param>18 19     <listener>20         <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>21     </listener>22 23     <!-- 对spring容器进行实例化 -->24     <listener>25         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>26     </listener>27 28      <!--配置Struts2的过滤器 -->29     <filter>30         <filter-name>struts2filter</filter-name>31         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>32     </filter>33 34     <filter-mapping>35         <filter-name>struts2filter</filter-name>36         <url-pattern>/*</url-pattern>37     </filter-mapping>38 39 </web-app>

 

实现一个简单的登录

demo.loading.action 新建LoginAction

 1 package demo.loading.action; 2  3 import java.util.List; 4  5 import javax.annotation.Resource; 6 import javax.servlet.http.HttpServletRequest; 7  8 import org.apache.struts2.interceptor.ServletRequestAware; 9 import org.springframework.stereotype.Controller;10 11 import demo.loading.entity.User;12 import demo.loading.service.iservice.IUserService;13 14 @Controller        //注入action15 public class LoginAction implements ServletRequestAware {16     @Resource IUserService userService;        //注入IUserService17     private HttpServletRequest request;18 19     private User user;20     private List<User> users;21 22     public String login() {23         String username = request.getParameter("username");24         String password = request.getParameter("password");25         String[] params = new String[] { "username", "password" };26         Object[] values = new Object[] { username, password };27         users = userService.login(params, values);28         if (users.isEmpty()) {29             return "fail";30         } else {31             return "success";32         }33     }34 35     public void setServletRequest(HttpServletRequest request) {36         this.request = request;37     }38 39     public User getUser() {40         return user;41     }42 43     public void setUser(User user) {44         this.user = user;45     }46 47     public List<User> getUsers() {48         return users;49     }50 51     public void setUsers(List<User> users) {52         this.users = users;53     }54 55 }

 

struts.xml

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4     "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 <struts> 6     <!-- 把它设置为开发模式,发布时要设置为false --> 7     <constant name="struts.devMode" value="true" /> 8     <!-- 自动动态方法的调用,使用这个设置后可以这样调用:action!method --> 9     <constant name="struts.enable.DynamicMethodInvocation" value="true" />10     <!-- 设置struts的对象工厂,由spring进行创建 (更换Struts2的工厂) -->11     <constant name="struts.objectFactory" value="spring" />12 13     <package name="base-package" extends="struts-default">14         <action name="loginAction" class="loginAction">15             <result name="success">success.jsp</result>16             <result name="fail">fail.jsp</result>17         </action>18     </package>19 </struts>

------------------------------------------------------------------------------

整合完毕

------------------------------------------------------------------------------

login.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6  7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9   <head>10     <base href="http://www.mamicode.com/">11     12     <title>登陆</title>13 14   </head>15   16   <body>17    <form action="loginAction!login.action" method="post">18        用户名:<input type="text" name="username"><br>19        密码:<input type="password" name="password"><br>20        <input type="submit" value="http://www.mamicode.com/提交">21    </form>22   </body>23 </html>

success.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6  7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9   <head>10     <base href="http://www.mamicode.com/">11     12     <title>登录成功</title>13   </head>14   15   <body>16     <span>登录成功</span>17   </body>18 </html>

fail.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6  7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9   <head>10     <base href="http://www.mamicode.com/">11     12     <title>登录失败</title>13 14   </head>15   16   <body>17     登录失败18   </body>19 </html>

 

http://localhost:8080/demo/ 

进入测试页面

 

struts-2.3.16.3+hibernate-3.2.5+spring-2.5全注解配置