SSH三大框架的各自工作流程


一.Struts2的工作流程:
1.用戶在客戶端發起請求,客戶端會初始化一個servlet容器請求;
2.servlet容器把請求會傳遞給context容器,context容器找到目標web工程。
3.進行解析web.xml中的struts標簽中的配置:

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

class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

4.然后進行struts的一系列的過濾器,如:ActionContextClearUp;
5.接着FilterDispatcher會被調用,它在轉發到某個Actio之前,要先詢問
ActionMapper(它會判斷是否有Action要被執行);
6.如果有,FilterDispatch會將請求交給我們的ActionProxy(Action代理);
7.然后ActionProxy會通過Configure Manager詢問框架的具體配置,找到action配置信息,在通過ActionInnvcation

實例Action對象;
8.執行Action對象的方法,返回結果;
9.根據返回結果在struts.xml中Action子標簽result跳轉具體的處理頁面或另一個Action;
10.響應給我們的用戶。

二.Hibernate的工作流程:

1.當我們使用myeclipse加入hibernate組件時,這個組件會為我們自動生成HibernateSessionFactory類和

hibernate.cfg.xml文件;
2.在hibernate.cfg.xml中主要進行了sessionFatory的配置,它包括數據庫的連接信息,還有緩存信息;

<session-factory>
    <property name="dialect">
        org.hibernate.dialect.Oracle9Dialect
    </property>
    <property name="connection.url">
        jdbc:oracle:thin:@127.0.0.1:1521:orcl
    </property>
    <property name="connection.username">system</property>
    <property name="connection.password">java</property>
    <property name="connection.driver_class">
        oracle.jdbc.driver.OracleDriver
    </property>
    <property name="myeclipse.connection.profile">oeconn</property>
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="cache.provider_class">
        org.hibernate.cache.EhCacheProvider
    </property>

</session-factory>

3.有誰來讀取和解析這么重要的配置文件呢? 當然是HibernateSessionFactory了。
在這個類中有一段靜態代碼塊:
   

private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private static org.hibernate.SessionFactory sessionFactory;

    private static Configuration configuration = new Configuration();
    private static ServiceRegistry serviceRegistry;

    static {
        try {
            configuration.configure();
            serviceRegistry = new ServiceRegistryBuilder().applySettings

(configuration.getProperties()).buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
    }

在這個靜態代碼塊中:通過Configuration類的configure方法加載解析hibernate.cfg.xml;同時也創建了

sessionFactory對象(它用來創建session對象的),所以在tomcat服務器啟動時就會運行該段代碼;
在這里順便提提session創建過程:
1)為什么session要放在ThreadLocal<Session> 中?
我們的模板類雖然是通過資源池獲取數據庫連接或會話對象的,根據持久化技術的不同,模板類需要
綁定數據庫連接和會話資源,但這些資源本身是非線程安全的,也就是不能被多個線程共享,所以它
Hibernate不需同步就可以解決線程安全問題,所以它將session放在了ThreadLocal中。
2)通過SessionFatory創建一個單例session
 

public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

        if (session == null || !session.isOpen()) {
            if (sessionFactory == null) {
                rebuildSessionFactory();
            }
            session = (sessionFactory != null) ? sessionFactory.openSession()
                    : null;
            threadLocal.set(session);
        }

        return session;
    }

4.創建事務對象session.BeginTransaction方法
5.創建持久化對象session.createQuery方法
6.提交事務
7.關閉session、sessionFactory.

三.Spring的工作流程:
1.在myeclipse中加入Spring組件,產生一個applicationContext.xml文件。
2.在web.xml中加入以下配置:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>

web工程進入到web.xml中掃描,發現有ContextLoaderListener類,監聽器,那就說明有Spring組件了。
在找發現<context-param>標簽中有classpath值,然后流程轉到applicationContext.xml中去;
在beans標簽下會加入數據源信息(數據庫的配置信息)。

<!-- 加入數據源 -->
    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName"
            value="oracle.jdbc.driver.OracleDriver">
        </property>
        <property name="url"
            value="jdbc:oracle:thin:@localhost:1521:orcl">
        </property>
        <property name="username" value="empdb"></property>
        <property name="password" value="java"></property>
    </bean>

3.然后通過Ioc控制反轉注入bean。實現了對象不用自己new
,Spring會幫你完成,交給他托管。

<!-- 注入JdbcTemplate類 -->
    <bean id="jdbctemp" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 注入dao類 -->
    <bean id="bdao" class="com.dao.BankDao">
        <property name="jtemp" ref="jdbctemp"></property>
    </bean>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM