<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-51  評論-14  文章-0  trackbacks-0

    總算將一個項目勉強上線,也是第一次我獨立完成的這么多任務(wù),框架設(shè)計、框架搭建、代碼編寫、測試、數(shù)據(jù)庫創(chuàng)建、表結(jié)構(gòu)設(shè)計……除了頁面和詳細設(shè)計我都做了個遍,雖然很倉促也犯了很多錯誤,但是整個過程走下來,發(fā)現(xiàn)自己真的學到不少東西。在這個空檔期寫個小總結(jié),以便以后使用 :)

     現(xiàn)在框架真是多的要死,也沒有什么真正能一統(tǒng)天下的東西,每個人的著眼點和技術(shù)習慣都不同,在剛接到項目的時候,老大就要我自己去確定框架。當時我正沉迷于TapeStry+Spring+iBatis開發(fā)的暢快之中,當時真想直接將自己的東西移植過去,但是一想公司陸續(xù)會有其他人進來加入到項目中,那么TSS這個框架肯定很難找到合適的人選,而且自己在研究TSS的過程中也發(fā)現(xiàn)由于文檔的缺乏,遇到問題的解決就是一個很嚴重的問題,最終只能棄用。雖然我很喜歡T4,但是它實在不讓人放心,只好期待Howard能給我們不斷帶來驚喜,真正成為繼Struts、WebWork之后的最優(yōu)選擇。有時間我還會繼續(xù)學習T4,并做一下總結(jié)。

    經(jīng)過當時的考慮,我只得放棄TSS,最終選擇自己相對熟悉的Struts+Spring+Hibernate,說是熟悉,那是因為以前的項目是用這個,有網(wǎng)友戲稱SSH是庸俗組合,呵呵,庸俗就庸俗吧,我想自己能把這套東西搞好也會有相當?shù)碾y度的(現(xiàn)在證明這個選擇是對的,出了問題有人問,項目組的其他人也都是玩這套東西的,維護擴展都方便)。

     

    具體細節(jié)就不再描繪了,做軟件的都知道問題無法解決是多么的折磨人,這其中的酸甜苦辣只有經(jīng)歷過的人才知道,技術(shù)上的問題是遇到一個解決一個,實在覺得解決不了或者沒有把握,利馬換其他想法,這個很重要,實現(xiàn)的方法有很多,即便不是最優(yōu)的解決方案,但是節(jié)省的大量的時間,在工期緊的時候一定要權(quán)衡的去考慮,否則后果不堪設(shè)想。

    總體框架(SSH)需要4個重要的配置文件:

    1.web.xml

     

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd"
    >
    <web-app>
        
    <display-name>sample</display-name>
        
    <context-param> 
            
    <param-name>contextConfigLocation</param-name> 
            
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
        
    </context-param> 
        
    <!--OpenSessionInViewFilter配置,其實是一個又繁瑣性能又低的東西,以后再也不想用到-->
        
    <filter>
            
    <filter-name>OpenSessionInViewFilter</filter-name>
            
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
            
    <!-- singleSession默認為true,若設(shè)為false則等于沒用OpenSessionInView --> 
            
    <init-param> 
                
    <param-name>singleSession</param-name> 
                
    <param-value>true</param-value>
            
    </init-param>
        
    </filter>
        
    <filter-mapping> 
            
    <filter-name>OpenSessionInViewFilter</filter-name> 
            
    <url-pattern>/*</url-pattern> 
        
    </filter-mapping>
        
    <!--encoding-->
        
    <filter>
            
    <filter-name>Set Character Encoding</filter-name>
            
    <filter-class>com.shpcims.util.SetCharacterEncodingFilter</filter-class>
            
    <init-param>
                
    <param-name>encoding</param-name>
                
    <param-value>utf-8</param-value> 
            
    </init-param>
        
    </filter>
        
    <filter-mapping>
            
    <filter-name>Set Character Encoding</filter-name>
            
    <servlet-name>action</servlet-name>
        
    </filter-mapping>
        
    <!--Spring Context listener-->
        
    <listener> 
            
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
        
    </listener>

        
        
    <servlet>
            
    <servlet-name>action</servlet-name>
            
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
            
    <init-param>
                
    <param-name>config</param-name>
                
    <param-value>/WEB-INF/struts-config.xml</param-value>
            
    </init-param>
            
    <init-param>
                
    <param-name>debug</param-name>
                
    <param-value>3</param-value>
            
    </init-param>
            
    <init-param>
                
    <param-name>detail</param-name>
                
    <param-value>3</param-value>
            
    </init-param>
            
    <load-on-startup>1</load-on-startup>
        
    </servlet>
        
    <servlet-mapping>
        
    <servlet-name>action</servlet-name>
            
    <url-pattern>*.do</url-pattern>
        
    </servlet-mapping>
        
        
        
    <welcome-file-list>
            
    <welcome-file>index.jsp</welcome-file>
        
    </welcome-file-list>
        
        
    <taglib>
            
    <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
            
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
        
    </taglib>
        
    <taglib>
            
    <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
            
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
        
    </taglib>
        
    <taglib>
            
    <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
            
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
        
    </taglib>
        
    <taglib>
            
    <taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>
            
    <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
        
    </taglib>
        
    <taglib>
            
    <taglib-uri>/WEB-INF/CustomTag.tld</taglib-uri>
            
    <taglib-location>/WEB-INF/tags/CustomTag.tld</taglib-location>
        
    </taglib>
    </web-app>

    2.Struts-config.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts-config PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
    "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"
    >
    <struts-config>
        
        
    <!-- forms -->
        
    <form-beans>
            
    <form-bean name="loginForm" type="com.shpcims.web.login.form.LoginForm" />    </form-beans>
        
    <global-forwards>
            
    <forward name="web_report" path="/reporter"/>
            
    <forward name="report_fail" path="/WEB-INF/jsp/SystemError.jsp"/>
        
    </global-forwards>
        
        
    <!-- actions -->
        
    <action-mappings>
            
    <action path="/LoginAction"
                    type
    ="org.springframework.web.struts.DelegatingActionProxy"
                    scope
    ="request"
                    name
    ="loginForm"
                    validate
    ="true"
                    input
    ="/index.jsp">
                
    <forward name="success"     path="/CreditInfoPreAction.do" />
                
    <forward name="fail"         path="/index.jsp" />
            
    </action>
            
        
    </action-mappings>
        
        
    <!-- Custmoer Controller for Authentication -->
        
    <controller>
           
    <set-property property="processorClass" value="com.shpcims.framework.CustomerRequestProcessor" />
        
    </controller>
        
        
    <!-- Message-resources -->
        
    <message-resources parameter="ApplicationResources" />
        
        
    <!-- plug-in -->
        
    <!-- tiles template -->
        
    <plug-in className="org.apache.struts.tiles.TilesPlugin" >
            
    <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
            
    <set-property property="definitions-debug" value="2" />
            
    <set-property property="definitions-parser-details" value="2" />
            
    <set-property property="definitions-parser-validate" value="true" />
        
    </plug-in>
        
    <!-- spring plug-in -->
        
    <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
            
    <set-property property="contextConfigLocation" value="/WEB-INF/beans.xml" />
        
    </plug-in>    
        
    <!-- Validator plugin -->
        
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
            
    <set-property
                
    property="pathnames"
                    value
    ="/WEB-INF/validaterule/validator-rules.xml,
                   /WEB-INF/validaterule/validation.xml
            "
    />
        
    </plug-in>
    </struts-config>

    3.applicationContext.xml

     

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
     
    <beans>
        
    <!-- service -->
        
    <bean id="chartService" parent="baseTransactionProxy">
            
    <property name="target">
                
    <bean class="com.shpcims.service.ChartServiceImpl">
                
    </bean>
            
    </property>
        
    </bean>    
        
        
    <!-- dao -->
        
    <bean id="customDao" class="com.shpcims.dao.CustomDaoImpl">
            
    <property name="sessionFactory" ref="sessionFactory" />
        
    </bean>
    <!-- 配置sessionFactory, 注意這里引入的包的不同 -->
        
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            
    <property name="dataSource" ref="dataSource" />
            
    <!-- mappingResources -->
            
    <property name="mappingResources">
                
    <list>
                    
    <value>com/shpcims/model/Area.hbm.xml</value>            </list>
            
    </property>
            
    <property name="hibernateProperties">
                
    <props>
                    
    <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
                    
    <!-- 開發(fā)期間為true -->
                    
    <prop key="hibernate.show_sql">true</prop>
                
    </props>
            
    </property>
        
    </bean>
        
        
    <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
              abstract
    ="true">
            
    <property name="proxyTargetClass" value="true" />
            
    <property name="transactionManager" ref="transactionManager"/>
            
    <property name="transactionAttributes">
                
    <props>
                    
    <prop key="update*">PROPAGATION_REQUIRED</prop>
                    
    <prop key="insert*">PROPAGATION_REQUIRED</prop>
                    
    <prop key="create*">PROPAGATION_REQUIRED</prop>
                    
    <prop key="assign*">PROPAGATION_REQUIRED</prop>
                    
    <prop key="reassign*">PROPAGATION_REQUIRED</prop>
                    
    <prop key="delete*">PROPAGATION_REQUIRED</prop>
                    
    <prop key="select*">PROPAGATION_REQUIRED</prop>
                    
    <prop key="remove*">PROPAGATION_REQUIRED</prop>
                    
    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                    
    <prop key="add*">PROPAGATION_REQUIRED</prop>
                    
    <prop key="delete*">PROPAGATION_REQUIRED</prop>
                
    </props>
            
    </property>
        
    </bean>
        
        
    <bean id="calculateJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            
    <property name="targetObject">
                
    <ref bean="gradeCalculateService" />
            
    </property>
            
    <property name="targetMethod">
                
    <value>calcuateCreditLevel</value>
            
    </property>
        
    </bean>
        
        
    <bean id="cronCalculateTigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
            
    <property name="jobDetail">
                
    <ref bean="calculateJob"/>
            
    </property>
            
    <property name="cronExpression">
                
    <value>0 0 0 1,15 * ?</value>
            
    </property>
        
    </bean>
        
        
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            
    <property name="triggers">
                
    <list>
                    
    <ref bean="cronCalculateTigger"/>
                
    </list>
            
    </property>
        
    </bean>
        
        
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            
    <property name="driverClassName">
                
    <value>net.sourceforge.jtds.jdbc.Driver</value>
            
    </property>
            
    <property name="url">
                
    <value>jdbc:jtds:sqlserver://192.168.0.16:1433/SHPCIMS</value>
            
    </property>
            
    <property name="username">
                
    <value>sqlserver</value>
            
    </property>
            
    <property name="password">
                
    <value>sqlserver</value>
            
    </property>
        
    </bean>
        
        
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            
    <property name="dataSource" ref="dataSource" />
        
    </bean>
        
        
    <!-- init properties 
        <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="location">
                <value>init.properties</value>
            </property>
        </bean>
    -->
        
        
    <!-- use to resolve hibernate lazy load --> 
        
    <bean id="hibernateLazyResolver" class="com.shpcims.util.HibernateLazyResolver"> 
            
    <property name="sessionFactory"><ref local="sessionFactory"/></property> 
        
    </bean> 
        
        
    <!-- log advice -->
        
    <bean name="logger" class="com.shpcims.framework.LogAdvice">
            
    <property name="systemManagerService" ref="systemManagerService" />
        
    </bean>
        
    <bean name="beforeLogAdvice" class="com.shpcims.framework.BeforeLogAdvice">
            
    <property name="systemManagerService" ref="systemManagerService" />
        
    </bean>
    </beans>
    4.beans.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
     
    <beans>
        
    <!-- action -->
        
    <bean name="/LoginAction" class="com.shpcims.web.login.action.LoginAction" singleton="false">
            
    <property name="systemManagerService" ref="systemManagerService" />
        
    </bean>
        
    <bean name="autoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
            
    <property name="beanNames">
                
    <list>
                    
    <value>/LoginAction</value>            
                                                                    
    </list>
            
    </property>
            
    <property name="interceptorNames">
                
    <list>
                    
    <value>logger</value>
                    
    <value>beforeLogAdvice</value>
                
    </list>
            
    </property>
            
    <property name="proxyTargetClass" value="true"/>
        
    </bean>
    </beans>

    4個文件中的大多數(shù)配置都是很普通的,只在這記錄一些比較容易出問題的地方,

    web.xml中配置了OpenSessionInViewFilter,這個東西是我在整個框架構(gòu)建中浪費最多時間也是出現(xiàn)問題最多的地方,后來和項目組同事討論,最終在新的項目中放棄了對這爛東西的使用,如果使用延遲加載,那么所有需要加載的東西應(yīng)該在Dao中使用Hibernate.initialize(object)強制加載,使得持久化操作保持在Dao層中完成,徹底拋棄OpenSesionInViewFilter。HOHO

    Spring ContextListner 的加載仍然放在web.xml里面進行,盡管在Struts中使用了ContextLoaderPlugin,但僅僅是在加載StrutsAction的時候才使用到,而整個SpringContext的初始化仍然是放在web.xml里面進行。個人覺得這樣做肯定有很多好處,但是目前仍不能說出真正的緣由。如此配置的初衷還是因為用到了OpenSessionInViewFilter,因為如果在Struts中去初始化Spring,OpenSessionInViewFilter根本跑不起來,因為它本身是在web.xml中初始化的,而且需要ContextListner 的支持。必須配置在web.xml中,此時仍使用ContextLoaderPlugin來加載就會出現(xiàn)Spring被加載兩次的情況,結(jié)果造成OpenSessionInViewFilter失效。盡管現(xiàn)在不再使用那個Filter,配置卻仍然這樣保持下來,我覺得仍然可以避免一些問題,畢竟配置在Struts下面就被Struts綁死了,那么好像是 Struts在控制整體,違背了框架搭建的初衷,也無法使Spring發(fā)揮自己最大的功力。

    Struts-config.xml中有3個需要注意的地方,第一個是使用DelegatingActionProxy,我曾經(jīng)對我項目組的同事每個人都解釋了一遍為什么要使用這個東東,真是痛苦的要死。但是這個東西一直都被認為是Struts+Spring最好的配置方式,其他的諸如使用WebLoadContext那種方式好像都無法帶來這樣的好處。我覺得這樣用的好處是:就如它的名字一樣,Proxy,Struts在使用它的時候根本不知道它的存在,幾乎感覺不到影響,只是把配置文件寫到beans.xml中去了。第二個好處是Struts的線程安全問題,如此配置新的線程不再共享同一個Action,更高深的東西我也說不清楚了 :(。第三個好處就是方便的使用AOP,這個是我最喜歡的了,有了這個Proxy,StrutsAction才真正的成為Spring轄區(qū)的一部分,方便的使用AOP,我不知道沒有AOP我需要多寫幾千行代碼,這對項目的及時完工真是不知道作出多少貢獻,也使得框架更加優(yōu)雅,極盡贊美之詞也不為過。:P

    第二個注意的地方是使用了Tiles框架,盡管后來美工給我Frame框架的時候造成了很多麻煩,可我仍然挺喜歡Tiles,心想如果我在用T4的時候能那么輕易的使用Tiles當時真的就用TSS也說不一定哦。Tiles里面基礎(chǔ)配置沒什么可說的,tiles-defs.xml、layout.jsp,頁面上的使用寫正確配置就可以了,但是在使用Tiles的時候遇到一個預(yù)加載JS的需求,要不是手頭有以前項目的代碼,估計就玩完了


    <tiles:getAsString name="javascript" ignore="true"/>

    <SCRIPT language="JavaScript">
    <!--
    function init(){
        
    if(window.subinit){
            subinit();
        }

    }

    <tiles:insert attribute="fw_script_block" ignore="true" />
    //-->
    </SCRIPT>
    <link href="css/portal.css" rel="stylesheet" type="text/css">
    </HEAD>
    <BODY onload="init()" style="overflow-x:hidden;overflow-y:hidden">

    看上去很普通的代碼,但是其中使用了tiles的一個樹型 ignore="true", 才真正使得預(yù)加載JS變得更加方便和可控制,這樣我就不用在每個布局模板上都寫上一個沒有意義的空方法在里面咯。

    第三個問題是使用Validation框架,盡管以前使用過,但是自己用的時候才知道配置起來沒那么簡單,最初我采用Struts-1.2.9版本,沒想到Validation不能用,后來在網(wǎng)上發(fā)現(xiàn)Validation用的包不全是Struts自帶的,版本不統(tǒng)一導(dǎo)致了Validation問題多多,折磨我好多天,最終不得不放棄Struts1.2.9而降級到1.2.8,才使得問題得以解決。

    applicationContext.xml中的配置也相對要穩(wěn)定一些,需要什么加什么就好了,當時我為了將JUnit分離出來還特地請教了一位高人,JUnit分離其實有很大的意義,它不但真正意義上脫離了Web環(huán)境還使得測試數(shù)據(jù)和真實數(shù)據(jù)的分離。利用好JUnit絕對是提高開發(fā)效率的一件法寶,難怪有很多大師級的人物都說編寫測試用例要比編寫代碼挑戰(zhàn)大得多。但是項目最終的遺留問題讓我被迫放棄了這個JUnit分離:(,原因是我無法解決相對路徑的查找,項目中大量用到了Socket、線程、任務(wù)計劃這種東西,使得相對路徑的問題多多,沒辦法我只能盡量縮減配置文件的數(shù)目,不知道有沒有更好的解決方案。

     



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1028413

    posted on 2008-03-29 16:49 Hank1026 閱讀(512) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 一级特黄特色的免费大片视频| 久久精品国产亚洲AV嫖农村妇女| 亚洲人成色在线观看| 16女性下面扒开无遮挡免费| 亚洲av之男人的天堂网站| a毛片在线免费观看| 国产亚洲AV无码AV男人的天堂| 中文字幕免费在线看线人动作大片| 亚洲国产小视频精品久久久三级| 一级片在线免费看| 不卡一卡二卡三亚洲| 久久精品成人免费看| 亚洲综合无码一区二区| 91青青青国产在观免费影视| 亚洲电影在线播放| 成人激情免费视频| 日日摸日日碰夜夜爽亚洲| 亚洲国产精品无码久久九九| 本免费AV无码专区一区| 久久亚洲成a人片| 18观看免费永久视频| 亚洲成A人片在线播放器| 国产一级淫片视频免费看 | 亚洲色欲或者高潮影院| 三年片在线观看免费大全电影| 亚洲精品国产专区91在线| 最近的免费中文字幕视频| 国产91成人精品亚洲精品| 国产精品亚洲精品日韩已方| 久久免费精品一区二区| 91亚洲va在线天线va天堂va国产| 毛片免费在线播放| 青青草国产免费国产是公开| 九月丁香婷婷亚洲综合色| 免费人成网站在线观看10分钟| 亚洲AV色欲色欲WWW| 国产亚洲精品无码成人| 亚洲大片免费观看| 国产精品亚洲天堂| 亚洲天天做日日做天天欢毛片| 午夜毛片不卡高清免费|