從MVC和三層架構說到ssh整合開發(下)

rlovep發表於2016-01-22

  閱讀上一篇

  這章主要講整合開發,直接從實戰講起

  詳細請看原始碼註釋:

  全部程式碼下載(csdn):連結

  Github連結:連結https://github.com/wpeace1212/javaBlog/tree/master/sshDemo

 1.整合流程

  針對一個簡單專案,讓大家對三層機構和MVC有一個簡單的認識,以及怎樣整合ssh框架;

  1.整合的專案介紹:

  (1) 企業人事管理系統!要求對員工資訊進行維護。

  (2) 後臺系統先登陸,才能操作員工: 新增/修改/刪除

  (3) 沒有登陸,只能檢視列表,不能操作!

  2.功能分類:

  (1) 管理員模組:對應AdminAction中實現

  登陸/註冊

  (2) 員工模組:對應EmployeeAction中實現

  新增一個員工, 指定新增的部門

  對指定的員工資訊修改

  刪除選擇員工

  列表展示

  3.需要的技術:

  (1) Struts2:對是否登陸的攔截,對各個功能請求的分別處理,模型驅動。

  (2) Hibernate4:建立多對一關係的資料庫,以及實現增刪改查

  表t_admin:存放管理員資訊

  表t_dept:存放部門資訊,要用到one-to-many關聯員工表

  表t_employee:存放員工資訊,要用到many-to-one關聯部門表

  (3) Spring:實現bean物件的建立管理,整合,事務管理

  (4) 大體按照下面的流程進行介紹:設計資料庫直接在實體存中實現

  - Jar包引入

  - entity層對映

  - Spring配置

  - hibernate配置

  - Dao層

  - Service層

  - web.xml配置

  - struts.xml配置

  - Action層

  - jsp層

  三層架構:其中2,4,5步是資料訪問層,3,6步是業務邏輯層,7,9,10步表現層

  MVC:其中2,3,4,5,6步是模型層,7,9,步是控制層,10步是檢視層

  (5) 工程簡圖:

00

 2.Jar包下載

  第一步當然是建立web專案、引入jar檔案、準備環境了,建立就不介紹了,只介紹最小包的引入:

  我的最小包下載地址(ssh最小包):http://download.csdn.net/detail/peace1213/9412092

  1.Struts 2.3.16.1

  下載地址:http://struts.apache.org/download

  Struts中需要引入的包:struts-2.3.16.1/apps/struts2-blank/WEB-INF/lib:該lib下面的包都可以引入;

01

  2.spring-framework-4.2.3.RELEASE-dist.zip

  下載地址:http://repo.springsource.org/libs-release-local/org/springframework/spring/

  需要引入的包:

03

  3.Hibernate 4.1.6

  下載地址:http://sourceforge.net/projects/hibernate/files/hibernate4

  需要引入的包:

02

  4.Aopalliance 1.0

  該包在struts的lib中有

  下載地址:http://sourceforge.net/projects/aopalliance

aopalliance.jar

  5.Aspectj 1.7.0

  下載地址:http://www.eclipse.org/aspectj/downloads.php

aspectjrt.jar  

aspectjweaver.jar

  6.Cglib 2.2.3

  下載地址:http://sourceforge.net/projects/cglib/files

cglib-2.2.3.jar

  7.Asm 3.3

  該包在struts的lib中有

  下載地址:http://forge.ow2.org/projects/asm

asm-3.3.jar

  8.Log4j 1.2.17

  該包在struts的lib中有

  下載地址:http://logging.apache.org/log4j/1.2/download.html

log4j-1.2.17.jar

  9.mysql-connector-java-5.1.37-bin.jar

  下載地址:http://dev.mysql.com/downloads/connector/j

mysql-connector-java-5.1.37-bin.jar

  10.Commons Logging 1.1.1

  該包在struts的lib中有

  下載地址:http://commons.apache.org/logging

commons-logging-1.1.1.jar

  其他需要引入的jar:

04

 3.entity層對映

  1.需要建立三個實體類:Admin.java,Dept.java,Employee.java,如下:

此處都省略getset方法:

public class Admin {

    private int id;

    private String adminName;

    private String pwd;

......

public class Dept {

    private int id;

    private String name;

    private Set<Employee> emps=new LinkedHashSet<>();

......



public class Employee {

    private int id;

    private String empName;

    private double salary;

    private Dept dept;

......

  2.建立對應的對映檔案:×.hbm.xml

  1.Admin.hbm.xml:

<class name="Admin" table="t_admin">

        <id name="id">

            <generator class="native"></generator>

        </id>

        <property name="adminName" length="20"></property>

        <property name="pwd" length="20"></property>

    </class>

  2.Dept.hbm.xml:

   <class name="Dept" table="t_dept">

       <id name="id" >

          <generator class="native"></generator>

       </id>

       <property name="name" column="Dname"></property>

       <set name="emps" cascade="save-update,delete" table="t_employee" >

           <key column="dept_id"></key>

           <one-to-many class="Employee"></one-to-many>

       </set>

  3.Employee.hbm.xml:

 <class name="Employee" table="t_employee">

       <id name="id">

        <generator class="native"></generator>

       </id>

      <property name="empName"  length="20"></property>

        <property name="salary" type="double"></property> 

        <many-to-one name="dept" column="dept_id" class="Dept"></many-to-one>

   </class>

 4.Spring配置 :

  Spring分為:bean-base.xml,bean-dao.xml,bean-service.xml,bean-action.xml,以及整合成一個的bean.xml

  辭去暫時介紹bean-base.xml基礎功能檔案和bean.xml,其他檔案到相應的介紹地方再進行介紹;

  1.bean-base.xml:主要配置Hibernate的工廠sessionFactory和事務,連線池

<?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"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:aop="http://www.springframework.org/schema/aop"

    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/context

         http://www.springframework.org/schema/context/spring-context.xsd

         http://www.springframework.org/schema/aop

         http://www.springframework.org/schema/aop/spring-aop.xsd

         http://www.springframework.org/schema/tx

         http://www.springframework.org/schema/tx/spring-tx.xsd">

         <!-- 1. 資料來源物件: C3P0連線池 -->

        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

            <property name="driverClass" value="com.mysql.jdbc.Driver"></property>

            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/day01?useUnicode=true&amp;characterEncoding=UTF8"></property>

            <property name="user" value="root"></property>

            <property name="password" value="123456"></property>

            <property name="initialPoolSize" value="3"></property>

            <property name="maxPoolSize" value="10"></property>

            <property name="maxStatements" value="100"></property>

            <property name="acquireIncrement" value="2"></property>

                </bean>

                <!-- ###########Spring與Hibernate整合  start########### -->

    <!-- 【推薦】方式所有的配置全部都在Spring配置檔案中完成 -->

    <bean id="sessionFactory"

        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

        <!-- 注入連線池物件 -->

        <property name="dataSource" ref="dataSource"></property>

        <!-- Hibernate常用配置 -->

        <property name="hibernateProperties">

            <props>

                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

                <prop key="hibernate.show_sql">true</prop>

                <prop key="hibernate.hbm2ddl.auto">update</prop>

            </props>

        </property>

     <!-- hibernate對映配置--> 

        <property name="mappingLocations">

            <list>

                <value>classpath:com/rlovep/entity/*.hbm.xml</value>

            </list>

        </property>

        </bean>

<!-- ###########Spring與Hibernate整合  end########### -->

        <!-- 事務配置 -->

    <!-- a. 配置事務管理器類 -->

    <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">

        <property name="sessionFactory" ref="sessionFactory"></property>

    </bean>

    <!-- b. 配置事務增強(攔截到方法後如果管理事務?) -->

    <tx:advice id="txAdvice" transaction-manager="txManager">

        <tx:attributes>

            <tx:method name="*" read-only="false"/>

        </tx:attributes>

    </tx:advice>

    <!-- c. Aop配置 -->

    <aop:config>

         <aop:pointcut expression="execution(* com.rlovep.service.impl.*.*(..))" id="pt"/>

         <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>

    </aop:config>

         <!-- 用於建表 -->

      <bean id="appDao" class="com.rlovep.entity.AppDao">

            <property name="sessionFactory" ref="sessionFactory"></property>

          </bean>

 </beans>

  2.bean.xml:

....省略.....

    <!-- 引入其他配置檔案 -->

    <import resource="config/bean-base.xml"/>

    <import resource="config/bean-dao.xml"/>

    <import resource="config/bean-service.xml"/>

    <import resource="config/bean-action.xml"/>

</beans>   

 5.Hibernate配置:

  Spring中已經配置好了Hibernate,此處主要講解建立資料庫中的三個表;

  1、建立AppDao類檔案:bean已經在bean.hbm.xml中配置了

/*

 * 用來建立資料庫中的表

 */

public class AppDao {

    //工廠通過spring注入

    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {

        this.sessionFactory = sessionFactory;

    }

    //@Test

    public void test(){

        //sessionFactory=(SessionFactory)ac.getBean("sessionFactory");

        Session session = sessionFactory.openSession();

        Transaction tx = session.beginTransaction();

        //儲存管理員,並建立表

        Admin admin=new Admin();

        admin.setAdminName("admin");

        admin.setPwd("123456");

        session.save(admin);

        //儲存部門和僱員,並建立表

        Dept dept1=new Dept();

        Dept dept2=new Dept();

....省略.....

//持久化

        session.save(dept1);

....省略.....

        session.save(employee4);

        tx.commit();

        session.close();

    }

  2.建立類App類建立資料庫和存資料:

public class App {

    private ApplicationContext ac=new ClassPathXmlApplicationContext("config/bean-base.xml");

    @Test

    public void test(){

        //ac.getBean("deptDao");

        AppDao appDao = (AppDao)ac.getBean("appDao");

        appDao.test();

    }

}

  3.點選執行App的test方法就可以完成資料庫的建立;

 6.Dao層:實現資料增刪改查;

  1.先建立介面: IAdminDao,IDepDao,IEmployee,IBaseDao(所有Dao的通用操作介面定義)

  此處只貼出IBaseDao介面的定義:

/*

 * * 所有dao的通用操作介面定義

 */

public interface IBaseDao<T> {

    /**

     * 儲存

     * @param obj

     */

    void save(T obj);



....省略.....

}

  2.介面的實現:AdminDao,DepDao,Employee,BaseDao(所有Dao的通用操作,希望所有的dao都繼承此類)

  BaseDao實現:

/*

 * 所有dao的通用操作,希望所有的dao都繼承此類

 */

public class BaseDao<T> implements IBaseDao<T>{

    //當前操作實際的bean型別

    private Class<T>clazz;

    //獲取類名稱

    private String className;

    // IOC容器(依賴)注入SessionFactory物件

    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {

        this.sessionFactory = sessionFactory;

    }

     public BaseDao() {

        Type type=this.getClass().getGenericSuperclass();

        //轉換為引數化型別

        ParameterizedType pt=(ParameterizedType)type;// BaseDao<Employee>

        //得到實際型別

        Type types[]=pt.getActualTypeArguments();

        //獲取實際型別

        clazz=(Class<T>)types[0];

        className = clazz.getSimpleName();//例如:Employee

    }

....省略.....

    @Override

    public List<T> getAll() {

        Query query = sessionFactory.getCurrentSession().createQuery("from "+className);

        List<T> list = query.list();

        return list;

    }

}

  其他介面實現:

//只需要繼承通用操作,和特點介面就行:這裡介面中沒有方法,可以加方法

public class DeptDao extends BaseDao<Dept> implements IDepDao{

}

 7.Service層:

  同樣先建立介面再建立類,此處不貼出程式碼,介紹bean-dao.xml,bean-service.xml的建立,以及對剛剛建立的Dao和service進行測試

  1.bean-dao.xml

 <!-- dao例項 -->

         <bean id="adminDao" class="com.rlovep.dao.impl.AdminDao">

             <property name="sessionFactory" ref="sessionFactory"></property>

          </bean>

          <bean id="deptDao" class="com.rlovep.dao.impl.DeptDao">

             <property name="sessionFactory" ref="sessionFactory"></property>

          </bean>

          <bean id="employeeDao" class="com.rlovep.dao.impl.EmployeeDao">

             <property name="sessionFactory" ref="sessionFactory"></property>

          </bean>

  2.bean-service.xml

 <!-- service 例項 -->

          <bean id="adminService" class="com.rlovep.service.impl.AdminService">

            <property name="adminDao" ref="adminDao"></property>

          </bean>

           <bean id="deptService" class="com.rlovep.service.impl.DeptService">

            <property name="deptDao" ref="deptDao"></property>

          </bean>

           <bean id="employeeService" class="com.rlovep.service.impl.EmployeeService">

            <property name="employeeDao" ref="employeeDao"></property>

          </bean>

  3.測試剛剛建立的dao和service:

  在包service中建立App測試類:

public class App {

    //載入spring的配置檔案

   private ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");

   //測試Admin的操作

   @Test

   public void testAdmin(){

       //獲得bean

     IAdminService adminService=(IAdminService)ac.getBean("adminService");

     Admin admin=new Admin();

     admin.setAdminName("admin");

     admin.setPwd("123456");

    System.out.println( adminService.login(admin));

   }

   //測試Dept的操作

   @Test

   public void testDept(){

     IDeptService service=( IDeptService)ac.getBean("deptService");

    System.out.println( service.findById(1));

   }

   //測試Employee的操作

   @Test

   public void testEmployee(){

     IEmployeeService service=( IEmployeeService)ac.getBean("employeeService");

     List<Employee> list = service.getAll();

    System.out.println( service.findById(9));

   }

}

 8.web.xml配置:

  1、需要配置Spring

  2、需要配置Struts2

  3、配置檔案如下:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

  <display-name>sshDemo</display-name>

  <!-- 配置spring的OpenSessionInView模式 【目的:JSp頁面訪問懶載入資料】 -->

        <!-- 注意:訪問struts時候需要帶上*.action字尾 -->

        <filter>

            <filter-name>OpenSessionInView</filter-name>

            <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>

        </filter>

        <filter-mapping>

            <filter-name>OpenSessionInView</filter-name>

            <url-pattern>*.action</url-pattern>

        </filter-mapping>

              <!-- Struts2的配置 -->

          <filter>

          <!-- 配置過濾器的名字 -->

            <filter-name>struts2</filter-name>

          <!--  配置核心過濾器類 -->

            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

          </filter>

        <!--配置要攔截的URL,辭去配置全部攔截 -->

          <filter-mapping>

              <filter-name>struts2</filter-name>

              <url-pattern>/*</url-pattern>

          </filter-mapping>

            <!--在web.xml中加入如下程式碼令伺服器自動載入Spring   --> 

        <context-param>

            <param-name>contextConfigLocation</param-name>

            <param-value>classpath:bean.xml</param-value>

        </context-param>

        <listener>

            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

        </listener>

         <!-- 首頁配置 -->

    <welcome-file-list>

        <welcome-file>index.jsp</welcome-file>

    </welcome-file-list>

</web-app>

 9.struts.xml配置 :

  1.由於spring的整合,在 struts.xml配置檔案中的class屬性直接使用:spring的配置檔案bean-action.xml中定義的bean

  2.struts.xml檔案:

<package name="struts2" extends="struts-default">

<!-- 配置action,class屬性使用Spring中定義的bean->

      <action name="admin_*" class="adminAction" method="{1}">

       <!-- 登陸失敗 -->

            <result name="loginFaild">/login.jsp</result>

            <!-- 登陸成功 -->

            <result name="index" type="redirectAction">emp_list</result>

      </action>

       <action name="emp_*" class="employeeAction" method="{1}">

           <!-- 列表展示 -->

            <result name="list">/WEB-INF/list.jsp</result>

            <!-- 進入新增頁面檢視 -->

            <result name="add">/WEB-INF/add.jsp</result>

            <!-- 新增成功,進入列表 (防止重新整理就多一條記錄問題,所以用重定向) -->

            <result name="listAction" type="redirectAction">emp_list</result>       

            <!-- 進入修改頁面 -->

            <result name="edit">/WEB-INF/edit.jsp</result>

      </action>

  3.bean-action.xml檔案:

    <!-- 指定action多例 -->

    <bean id="adminAction" class="com.rlovep.action.AdminAction" scope="prototype">

        <property name="adminService" ref="adminService"></property>

    </bean>

    <bean id="employeeAction" class="com.rlovep.action.EmployeeAction" scope="prototype">

        <property name="deptService" ref="deptService"></property>

        <property name="employeeService" ref="employeeService"></property>

    </bean>

 10.Action層 :

  1、建立AdminAction檔案:繼承ActionSupport類,和實現ModelDriver介面

  2、建立EmployeeAction檔案:繼承ActionSupport類,和實現ModelDriver介面

  3、建立攔截器類:AdminInterceptor類用於判斷是否登陸;繼承AbstractInterceptor

@Override

    public String intercept(ActionInvocation invocation) throws Exception {

        //得到當前執行的方法

        String method = invocation.getProxy().getMethod();

        //判斷:當不為登陸方法和list方法時

        if(!"login".equals(method)&&!"list".equals(method)){

            Object obj= ActionContext.getContext().getSession().get("adminInfo");

            if(obj==null){

                //沒有登陸

                return "login";

            }else{

                //放行

                return invocation.invoke();

            }

        }

        //放行

        return invocation.invoke();

    }

  建立相應的jsp檔案:

  主要有:index,login,edit,add,list等jsp檔案;詳情見工程原始碼;

 11.測試圖:部署動態工程

  測試登陸

4

  測試新增

5

  測試刪除

6

  測試修改

7

  好的本章介紹到這裡

  相關文件:從MVC和三層架構說到ssh整合開發(上)

相關文章