天天看点

搭建基于注解方式的SSH项目框架 1. 项目目录以及数据表结构 2. 准备jar包 3. 配置struts2 4. 配置Spring+Hibernate 6. 编写实体类、DAO类、Service类以及Action 7. 测试页面

转自:http://blog.csdn.net/ererfei/article/details/46800415

1. 项目目录以及数据表结构

搭建基于注解方式的SSH项目框架 1. 项目目录以及数据表结构 2. 准备jar包 3. 配置struts2 4. 配置Spring+Hibernate 6. 编写实体类、DAO类、Service类以及Action 7. 测试页面
搭建基于注解方式的SSH项目框架 1. 项目目录以及数据表结构 2. 准备jar包 3. 配置struts2 4. 配置Spring+Hibernate 6. 编写实体类、DAO类、Service类以及Action 7. 测试页面

2. 准备jar包

下面是我开发项目准备的jar包,可能有一些是项目依赖的,例如其中的druid-1.0.13.jar、ftplet-api-1.0.6.jar ftpserver-core-1.0.6.jar、junit-4.1.1.jar、slf4j-api-1.7.12这几个包就是根据需要添加的,分别是阿里巴巴开源数据库连接池、两个ftp文件服务器、单元测试以及slf4j用于log跟踪记录数据库操作信息,其他的都是SSH中的jar包,到百度共享下载下图中的所有包。

(jar包下载 链接: http://pan.baidu.com/s/1pJ42207 提取密码: c5yh)

搭建基于注解方式的SSH项目框架 1. 项目目录以及数据表结构 2. 准备jar包 3. 配置struts2 4. 配置Spring+Hibernate 6. 编写实体类、DAO类、Service类以及Action 7. 测试页面

3. 配置struts2

配置代码如下(所有的配置属性都可以在struts2-core-×××.jar包中org.apache.struts2下的default.properties中找到)

【struts.xml】

[html]  view plain  copy

  1. <?xml version="1.0"encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.    "-//Apache Software Foundation//DTD StrutsConfiguration 2.3//EN"  
  4.    "http://struts.apache.org/dtds/struts-2.3.dtd">  
  5. <struts>  
  6.    <constant name="struts.enable.DynamicMethodInvocation"value="false" />  
  7.    <constant name="struts.devMode" value="true" />  
  8.    <!-- 指定由spring负责action对象的创建 -->  
  9.    <constant name="struts.objectFactory" value="spring" />  
  10.    <!-- 国际化设置,请求参数为utf-8编码 -->  
  11.    <constant name="struts.i18n.encoding" value="utf-8" />  
  12.    <!-- 指定被struts2处理的请求后缀类型,如果有多个,用逗号隔开 -->  
  13.    <constant name="struts.action.extension" value="action" />  
  14.    <!-- 指定上传文件的大小上限 -->  
  15.    <constant name="struts.multipart.maxSize" value="209715200" />  
  16.    <!-- 当配置文件改动后是否重新加载,生产环境下需要设置为false -->  
  17.    <constant name="struts.configuration.xml.reload" value="false" />  
  18.    <!-- 是否使用struts2的开发模式,生产环境下需要设置为false -->  
  19.    <constant name="struts.devMode" value="false" />  
  20.    <!-- 浏览器是否缓存静态内容,生产环境下需要设置为true -->  
  21.    <constant name="struts.serve.static.browserCache" value="true" />  
  22.    <!-- <includefile="example.xml"/> -->  
  23. </struts>  

4. 配置Spring+Hibernate

4.1  编写Spring配置文件applicationContext.xml

【applicationContext.xml】

[html]  view plain  copy

  1. <?xml version="1.0"encoding="UTF-8"?>  
  2. <beans  
  3.    xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xmlns:tx="http://www.springframework.org/schema/tx"  
  7.     xmlns:context="http://www.springframework.org/schema/context"  
  8.     xmlns:task="http://www.springframework.org/schema/task"  
  9.     xsi:schemaLocation="  
  10.     http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd  
  11.     http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.1.xsd  
  12.     http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.1.xsd  
  13.    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd  
  14.     http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-4.1.xsd">  
  15.    <!-- 扫描base-package下的文件,并注册bean,同时激活已注册的bean,就是扫描那些用@Service,@component,@Repositiry标识的那些类 -->  
  16.    <context:component-scan base-package="com.mlq.love" />  
  17. </beans>  

4.2编写Hibernate配置文件applicationContext-hibernate.xml

首先编写配置文件dbconfig.properties,这样提取出来配置信息可以比较直观的查看和维护

【dbconfig.properties】

[plain]  view plain  copy

  1. url=jdbc\:mysql\://localhost\:3306/test  
  2. driverClassName=com.mysql.jdbc.Driver  
  3. username=root  
  4. password=centerm  
  5. initialSize=10  
  6. minIdle=5  
  7. maxActive=50  
  8. maxWait=60000  
  9. timeBetweenEvictionRunsMillis=60000  
  10. minEvictableIdleTimeMillis=300000  
  11. poolPreparedStatements=true  
  12. maxPoolPreparedStatementPerConnectionSize=100  
  13. validationQuery=SELECT'x'  
  14. testWhileIdle=true  
  15. testOnBorrow=false  
  16. testOnReturn=false  
  17. maxOpenPreparedStatements=20  
  18. removeAbandoned=false  
  19. removeAbandonedTimeout=1800  
  20. logAbandoned=true  

【applicationContext-hibernate.xml】

[html]  view plain  copy

  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:aop="http://www.springframework.org/schema/aop"  
  4.    xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"  
  5.    xmlns:task="http://www.springframework.org/schema/task"  
  6.    xsi:schemaLocation="  
  7.     http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd  
  8.     http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.1.xsd  
  9.     http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.1.xsd  
  10.    http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.1.xsd  
  11.     http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-4.1.xsd">  
  12.    <bean id="propertyConfigurer"    
  13.         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">    
  14.         <property name="locations">    
  15.             <list>    
  16.                 <value>/WEB-INF/classes/dbconfig.properties</value>    
  17.             </list>    
  18.         </property>    
  19.    </bean>    
  20.    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">  
  21.       <property name="url" value="${url}"/>  
  22.       <!--可以省略这个driveerClassName的指定,因为Druid提供了N个数据库的支持-->  
  23.       <property name="driverClassName" value="${driverClassName}" />  
  24.       <property name="username" value="${username}"/>  
  25.       <property name="password" value="${password}"/>  
  26.       <!-- 配置初始化大小、最小、最大 -->  
  27.       <property name="initialSize" value="${initialSize}" />  
  28.       <property name="minIdle" value="${minIdle}"/>  
  29.       <property name="maxActive" value="${maxActive}"/>  
  30.       <!-- 配置获取连接等待超时的时间 -->  
  31.       <property name="maxWait" value="${maxWait}"/>  
  32.       <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->  
  33.       <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />  
  34.       <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->  
  35.       <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />  
  36.       <!-- 打开PSCache(PreparedStatementCache),并且指定每个连接上PSCache的大小 -->  
  37.       <property name="poolPreparedStatements" value="${poolPreparedStatements}" />  
  38.       <property name="maxPoolPreparedStatementPerConnectionSize"value="${maxPoolPreparedStatementPerConnectionSize}"/>  
  39.       <property name="validationQuery" value="${validationQuery}" />  
  40.       <property name="testWhileIdle" value="${testWhileIdle}" />  
  41.       <property name="testOnBorrow" value="${testOnBorrow}" />  
  42.       <property name="testOnReturn" value="${testOnReturn}" />  
  43.    </bean>  
  44.    <bean id="sessionFactory"  
  45.       class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
  46.       <!-- entity包扫描范围 -->  
  47.       <property name="packagesToScan">  
  48.          <list>  
  49.             <value>com.mlq.love.entity</value>  
  50.          </list>  
  51.       </property>  
  52.       <property name="dataSource" ref="dataSource" />  
  53.       <property name="hibernateProperties">  
  54.          <props>  
  55.             <prop key="hibernate.hbm2ddl.auto">update</prop>  
  56.             <prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>  
  57.             <prop key="hibernate.show_sql">true</prop>  
  58.             <prop key="hibernate.format_sql">true</prop>  
  59.             <prop key="current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>  
  60.             <prop key="cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>  
  61.          </props>  
  62.       </property>  
  63.    </bean>  
  64.    <!-- 事务配置 -->  
  65.    <bean id="transactionManager"  
  66.       class="org.springframework.orm.hibernate4.HibernateTransactionManager">  
  67.       <property name="sessionFactory" ref="sessionFactory" />  
  68.    </bean>  
  69.    <!-- 开启注解配置事务 -->  
  70.    <tx:annotation-driven transaction-manager="transactionManager" />  
  71. </beans>  

5. 修改web.xml文件

主要是增加Struts2和Spring的配置信息

【web.xml】

[html]  view plain  copy

  1. <?xml version="1.0"encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">  
  3.    <display-name>SSH搭建(注解)</display-name>  
  4.    <welcome-file-list>  
  5.       <welcome-file>index.html</welcome-file>  
  6.    </welcome-file-list>  
  7.   <!-- spring配置文件路径 -->  
  8.    <context-param>  
  9.       <param-name>contextConfigLocation</param-name>  
  10.       <param-value>/WEB-INF/classes/applicationContext*.xml</param-value>  
  11.    </context-param>  
  12.    <!-- spring监听器 -->  
  13.    <listener>  
  14.       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  15.    </listener>  
  16.    <filter>  
  17.       <filter-name>struts2</filter-name>  
  18.       <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  19.    </filter>  
  20.    <filter-mapping>  
  21.        <filter-name>struts2</filter-name>  
  22.        <url-pattern>/*</url-pattern>  
  23.    </filter-mapping>  
  24. </web-app>  

6. 编写实体类、DAO类、Service类以及Action

【User.java】

[java]  view plain  copy

  1. @Entity  
  2. @Table(name="user")  
  3. public class User {  
  4.     @Id  
  5.     @GeneratedValue(strategy = GenerationType.IDENTITY)  
  6.     @Column(name="userid")  
  7.     private Integer userId;  
  8.     @Column(name="username")  
  9.     private String userName;  
  10.     @Column(name="password")  
  11.     private String passWord;  
  12.     @Column(name="birthday")  
  13.     private Date birthday;  
  14.     @Column(name="age")  
  15.     private Integer age;  
  16.     @Column(name="sex")  
  17.     private String sex;  
  18.         getters setters......  
  19. }  

【BaseDao.java】

[java]  view plain  copy

  1. public class BaseDao<T> {  
  2.     @Resource(name = "sessionFactory")  
  3.     protected SessionFactory sessionFactory;  
  4.     protected Class<?> entityClass;  
  5.     public BaseDao()  
  6.     {  
  7.         ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();  
  8.         entityClass = (Class<?>)type.getActualTypeArguments()[0];  
  9.     }  
  10.     protected Session getSession()  
  11.     {  
  12.         return sessionFactory.getCurrentSession();  
  13.     }  
  14.     public Serializable save(T t){  
  15.         return getSession().save(t);  
  16.     }  
  17. }  

【UserDao.java】

[java]  view plain  copy

  1. @Repository("userDao")  
  2. public class UserDao extends BaseDao<User>{  
  3.     @SuppressWarnings("unchecked")  
  4.     public User checkUser(User user){  
  5.         String hql = "from User where userId = :id and password = :password";  
  6.         Query query = getSession().createQuery(hql)  
  7.                         .setParameter("id", user.getUserId())  
  8.                         .setParameter("password", user.getPassWord());  
  9.         List<User> userList = (List<User>)query.list();  
  10.         if(userList != null && userList.size() > 0){  
  11.             System.out.println("wocao");  
  12.             return userList.get(0);  
  13.         }  
  14.         return null;  
  15.     }  
  16. }  

【UserService.java】

[java]  view plain  copy

  1. @Service("userService")  
  2. public class UserService {  
  3.     @Resource  
  4.     private UserDao userDao;  
  5.     public Serializable save(User user){  
  6.         return userDao.save(user);  
  7.     }  
  8.     @Transactional(readOnly = true, rollbackFor = Exception.class)  
  9.     public User checkUser(User user){  
  10.         return userDao.checkUser(user);  
  11.     }  
  12. }  

【LoginAction.java】

[java]  view plain  copy

  1. @Controller("loginAction")  
  2. @Scope("prototype")  
  3. @Namespace("")  
  4. @ParentPackage("struts-default")  
  5. public class LoginAction extends ActionSupport implements SessionAware{  
  6.     private static final long serialVersionUID = 6473585621724667329L;  
  7.     @Resource(name = "userService")  
  8.     private UserService userService;  
  9.     private Map<String, Object> session;  
  10.     private String id;  
  11.     private String password;  
  12.     @Action  
  13.     (  
  14.         value="login",  
  15.         results =  
  16.             {  
  17.                 @Result(name = "success", location = "/main.jsp"),  
  18.                 @Result(name = "error", location = "/login.jsp")  
  19.             }  
  20.     )  
  21.     public String login(){  
  22.         User user = (User)session.get("user");  
  23.         if(user == null){  
  24.             user = new User();  
  25.             user.setUserId(Integer.parseInt(id));  
  26.             user.setPassWord(password);  
  27.         }  
  28.         user = userService.checkUser(user);  
  29.         if(user == null){  
  30.             return "error";  
  31.         }else {  
  32.             session.put("user", user);  
  33.             return "success";  
  34.         }  
  35.     }  
  36.     public String getId() {  
  37.         return id;  
  38.     }  
  39.     public void setId(String id) {  
  40.         this.id = id;  
  41.     }  
  42.     public String getPassword() {  
  43.         return password;  
  44.     }  
  45.     public void setPassword(String password) {  
  46.         this.password = password;  
  47.     }  
  48.     @Override  
  49.     public void setSession(Map<String, Object> session) {  
  50.         this.session = session;  
  51.     }  
  52. }  

7. 测试页面

【login.java】

[html]  view plain  copy

  1. <body>  
  2.     <form action="login.action" method="post">  
  3.     <label>姓名:</label><input name="id" type="text" value="" />  
  4.     <label>密碼:</label><input name="password" type="password" value="" />  
  5.     <input type="submit" value="登陆" />  
  6.     </form>  
  7. </body>  

【main.java】

[html]  view plain  copy

  1. <body>  
  2.     <label>姓名: ${sessionScope.user.userName}</label>  
  3.     <label>出生日期 : ${sessionScope.user.birthday}</label>  
  4.     <label id="skill">展示技能</label>  
  5. </body>  

至此,基于注解方式的SSH框架搭建完成~