总算将一个项目勉强上线,也是第一次我独立完成的这么多任务,框架设计、框架搭建、代码编写、测试、数据库创建、表结构设计……除了页面和详细设计我都做了个遍,虽然很仓促也犯了很多错误,但是整个过程走下来,发现自己真的学到不少东西。在这个空档期写个小总结,以便以后使用 :)
现在框架真是多的要死,也没有什么真正能一统天下的东西,每个人的着眼点和技术习惯都不同,在刚接到项目的时候,老大就要我自己去确定框架。当时我正沉迷于TapeStry+Spring+iBatis开发的畅快之中,当时真想直接将自己的东西移植过去,但是一想公司陆续会有其他人进来加入到项目中,那么TSS这个框架肯定很难找到合适的人选,而且自己在研究TSS的过程中也发现由于文档的缺乏,遇到问题的解决就是一个很严重的问题,最终只能弃用。虽然我很喜欢T4,但是它实在不让人放心,只好期待Howard能给我们不断带来惊喜,真正成为继Struts、WebWork之后的最优选择。有时间我还会继续学习T4,并做一下总结。
经过当时的考虑,我只得放弃TSS,最终选择自己相对熟悉的Struts+Spring+Hibernate,说是熟悉,那是因为以前的项目是用这个,有网友戏称SSH是庸俗组合,呵呵,庸俗就庸俗吧,我想自己能把这套东西搞好也会有相当的难度的(现在证明这个选择是对的,出了问题有人问,项目组的其他人也都是玩这套东西的,维护扩展都方便)。
具体细节就不再描绘了,做软件的都知道问题无法解决是多么的折磨人,这其中的酸甜苦辣只有经历过的人才知道,技术上的问题是遇到一个解决一个,实在觉得解决不了或者没有把握,利马换其他想法,这个很重要,实现的方法有很多,即便不是最优的解决方案,但是节省的大量的时间,在工期紧的时候一定要权衡的去考虑,否则后果不堪设想。
总体框架(SSH)需要4个重要的配置文件:
1.web.xml
<! 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,若设为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
<! 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
<! 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 >
<!-- 开发期间为true -->
< prop key ="hibernate.show_sql" > true </ prop >
</ props >
</ property >
</ bean >
< bean id ="baseTransactionProxy" class ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract ="true" >
< property name ="