<一>SSI框架
1、框架簡介
? ? ? MVC對于我們來說,已經不陌生了,它起源于20世紀80年代針對smalltalk語言的一種軟件設計模式。現在已經被廣泛應用。近年來,隨著java的盛行,MVC的低耦合性、高重用性、可維護性、軟件工程的可管理性等諸多優點使其在java平臺很受歡迎,期間,也誕生了許多優秀的MVC框架,如專注于控制層的struts、webwork、struts2、JSF等框架;專注于業務邏輯方面的Spring框架;專注于持久層的Hibernate、iBatis、Castor、JORM等框架。
下面對SSI框架:struts2+spring+iBatis的三個開源的MVC框架進行說明
Struts2主要來源于webwork框架,與Struts1相比:
Spring功能非常的強大:
iBatis則是一種輕量級的OR Mapping框架,與Hibernate相比,iBatis提供了半自動化對象關系映射的實現,開發人員需要編寫具體的sql語句,為系統設計提供了更大的自由空間,為sql語句優化提供了便利。
2、框架結構
下面這張圖就是我們所用到的這三種框架的結合體,下面對其做以簡單的介紹。
(1)控制層
在控制層,利用Strtus2標簽功能,在Action中直接與jsp頁面上的數據進行交互。在調用業務邏輯層應用時,Struts2提供了對Spring的支持。開發人員需要完成對struts.xml的配置工作和各個Action類的編寫。
總的struts.xml配置文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"> <struts><package name="struts-init" extends="struts-default"><action name="index" class="anonymousAction" method="execute"><result name="success">province_level/shanxi/login.jsp</result></action><action name="nologinAct" class="nologinAct"><result name="success">/common/nologin.jsp</result></action><!-- 插件下載 --><action name="downLoadFileLogin" class="anonymousAction" method="getDownLoadFile"><result name="success" type="stream"><!--文件類型,當前是所有的類型 --><param name="contentType">application/octet-stream</param><!--第一個參數是指打開下載框默認是inline瀏覽器能打開的就不去下載直接打開 --><param name="contentDisposition">attachment;fileName="${fileName}"</param><param name="inputName">inputStream</param> <!--方法名字 --><param name="bufferSize">1024</param> <!--文件大小 --></result></action><interceptors><!-- 聲明攔截器 --><interceptor name="checkPrivilege"class="com.highland.criminal.business.sysman.Interceptor.CheckAuthorityInterceptor"></interceptor><interceptor name="json" class="org.apache.struts2.json.JSONInterceptor" /><!-- 自定義攔截器 --><interceptor name="exceptionInterceptor" class="com.highland.framework.web.interceptor.ExceptionInterceptor"></interceptor><!-- 聲明一個新的攔截器棧(先檢查權限) --><interceptor-stack name="myDefaultStack"><interceptor-ref name="defaultStack" /><interceptor-ref name="checkPrivilege" /><interceptor-ref name="exceptionInterceptor" /><interceptor-ref name="json" /></interceptor-stack></interceptors><!-- 默認使用的攔截器(攔截器棧) --><default-interceptor-ref name="myDefaultStack" /><!-- 全局的Result配置 --><global-results><result name="error">/common/error.jsp</result><result name="login" type="redirect">nologinAct.action</result><result name="noPrivilegeError">/xtba/common/noPrivilegeError.jsp</result></global-results><global-exception-mappings><exception-mapping result="error"exception="com.highland.framework.exception.BaseException"></exception-mapping></global-exception-mappings><!-- 為兼容ecside增加的錯誤action --><action name="errorAction"class="com.highland.criminal.business.sysman.action.ExceptionAction"><result>/common/error.jsp</result></action></package><include file="struts/struts-hdzhfx.xml"></include><!-- 綜合分析--></struts>由于項目中可能涉及多個功能模塊,所以在總的struts.xml中通過<include>標簽引入各個功能模塊的xml配置。這里以綜合分析模塊為例,對struts-hdzhfx.xml配置文件進行分析
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- 綜合分析報告--><package name="hdzhfx" namespace="/" extends="struts-init"><!-- 這種方式配置返回值鏈接:返回簡單json字符串參數total和rows --><action name="glhdfx_new" class="hdzhfxAction" method="glhdfx_new"><result name="success" type="json"><param name="includeProperties">total,rows</param></result></action><!-- 這種方式配置簡單的查詢方法鏈接 --><action name="zhfx_thqfx" class="hdzhfxAction" method="thqfx_Query"></action><!-- 這種方式配置返回值鏈接:返回list數據 --><action name="listhdkxx" class="hdzhfxAction" method="listhdxx" ><result name="success">/xzzxyw/hdfx/queryHdxxList.jsp</result><result name = "success_hdxx" type = "json"><param name = "root">bkxxs</param></result></action></package> </struts>(2)業務邏輯層
在業務邏輯層,利用Spring框架的依賴注入實現對業務邏輯類和Dao類的實例進行托管;
在事務處理方面,利用Spring提供的面向切面的事務處理功能,使對數據的事務控制脫離于數據訪問接口實現;
在對象關系映射方面,利用Spring對數據庫連接池的托管和對iBatis框架的支持。
開發人員需要完成對數據源的配置、對不同模塊所對應的application*.xml文件的配置,以及對業務邏輯接口的定義和業務邏輯實現的編寫。
①?spring-->ibatis-->applicationContext-ibatis.xml:這里加載數據源配置及事務機制
<?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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"><!-- 引入項目的jdbc配置文件 --><bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:/jdbc.properties</value></list></property></bean><!-- 配置數據源 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"><property name="driverClass"><value>${jdbc.driverClassName}</value></property><property name="jdbcUrl"><value>${jdbc.url}</value></property><property name="user"><value>${jdbc.username}</value></property><property name="password"><value>${jdbc.password}</value></property><property name="initialPoolSize"><value>50</value></property><property name="minPoolSize"><value>50</value></property><property name="maxPoolSize"><value>300</value></property><property name="checkoutTimeout"><value>5000</value></property><property name="maxIdleTime"><value>1800</value></property><property name="idleConnectionTestPeriod"><value>3000</value></property><property name="acquireIncrement"><value>5</value></property><property name="maxStatements" value="0"/><property name="testConnectionOnCheckout" value="false"/> </bean><!-- 定義事務管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource"><ref bean="dataSource"/></property></bean><!-- Spring的IBatis模板 --><!-- 加入對大數據類型操作的支持 --><bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/><bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean" ><property name="configLocations"><!-- 重點:這里將spring中的ibatis層與ibatis連接起來了 --><value>classpath*:/ibatis/app-sqlmap-config.xml</value></property><property name="dataSource"><ref bean="dataSource" /></property><property name="lobHandler" ref="lobHandler"/> <!-- 加入對大數據類型操作的支持 --> </bean><bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate"><property name="sqlMapClient" ref="sqlMapClient"></property> </bean><!--開啟事務 --><tx:annotation-driven transaction-manager="transactionManager" /> </beans>spring-->ibatis-->app-ibatis-hdzhfx.xml?(這個文件與applicationContext-ibatis.xml是通過<ref bean="sqlMapClient">關聯到一起的)
這里配置Dao的bean值,是為下一層spring-->service-->app-service-hdzhfx.xml中的bean的返回值<ref bean="tbryhdDao" />做的配置。
<?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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><bean id="tbryhdDao" class="com.highland.criminal.business.dao.stdao.TbRyHdDao"><property name="sqlMapClient"><ref bean="sqlMapClient" /></property></bean><bean id="tbryhdtxlbdDao" class="com.highland.criminal.business.dao.stdao.TbRyHdTxlBdDao"><property name="sqlMapClient"><ref bean="sqlMapClient" /></property></bean> </beans>② spring-->service-->app-service-hdzhfx.xml承上啟下的作用。
承上:<ref bean="tbryhdDao" />這里的ref中bean的值對應的是spring-->ibatis-->app-ibatis-hdzhfx.xml中配置的bean的id? ??
啟下:這里的bean 的id值zhHdfxService對應的是spring-->struts-->app-struts-hdzhfx.xml中需要的service的名字 <ref bean="zhHdfxService" />。
<?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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><!-- 配置bean:注意這里的bean的id對應的是spring中app-struts-hdzhfx.xml中的ref對應的bean值--><bean id="zhHdfxService" parent="baseTransactionProxy"><property name="target"><bean class="com.highland.criminal.business.xzqbyp.hdfx.service.imp.HdZhfxServiceImpl"><!-- 這里的ref中bean的值對應的是spring中的ibatis下app-ibatis-hdzhfx.xml中配置的bean的id --> <property name="tbryhdDao"><ref bean="tbryhdDao" /></property><property name="tbRyhdtxlDao"><ref bean="tbryhdtxlbdDao" /></property></bean></property></bean></beans>③ spring -->struts-->app-struts-hdzhfx.xml:
?<ref bean="zhHdfxService" />這里的bean的值對應的是spring-->service-->app-service-hdzhfx.xml中配置的bean的id
這里bean的id值hdzhfxAction對應的是配置struts-hdzhfx.xml中需要的action的class類值
<?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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><!-- 配置bean:注意這里的bean的id對應的是spring中struts-hdzhfx.xml中的action的class --><bean id="hdzhfxAction" class="com.highland.criminal.business.xzqbyp.hdfx.action.HdZhfxAction" scope="prototype"><property name="zhHdfxService"><ref bean="zhHdfxService" /><!-- 注意:這里的bean的值對應的是spring中service中的app-service-hdzhfx.xml中配置的bean的id --></property></bean></beans>(3) 持久層
在持久層,利用iBatis提供的半自動化對象關系映射實現。開發人員需要編寫具體的sql語句,為系統設計提供了更大的自由空間。另外,開發人員需要完成對ibatis的配置文件app-sqlmap-config.xml和*-sqlmap.xml的配置,以及對DAO接口的定義和DAO接口的實現。
app-sqlmap-config.xml:這里配置了多個sql文件的引用
與spring層之間的關聯:在spring-->ibatis-->applicationContext-ibatis.xml中配置了這:
<bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
? ? ? ? <property name="sqlMapClient" ref="sqlMapClient"></property> ?
? ? </bean>
hdzhfx-sqlmap.xml:這個文件里寫sql語句
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "sql-map-2.dtd"> <sqlMap namespace="hdfxnew"><!-- 映射實體 --><typeAlias alias="hdfxxx" type = "com.highland.framework.hdanalysis.domain.hdfxdomain" /><!-- 根據id查詢信息 --><select id="queryHdInfo" parameterClass="hdfxxx" resultClass="hdfxxx">select BJGSD,CTLX,MYZT,THDD,THJZ,JZDQ,JZXQ,IMEI,IMSI,JD,WD,DFTHDD,DFTHJZ,DFJZDM,DFIMSI,DFGSD,DFIMEI,DFHMJZXM,DFCH,DFJZQW,DFJD,DFWD,HOLDING_TIME,BJHM,DFHM,CALL_TYPE,START_TIME,END_TIME from HD_CALL_INFO where 1=1 and scbz=0<isNotEmpty property="BJHM"> and BJHM= #BJHM#</isNotEmpty><isNotEmpty property="DFHM"> and DFHM= #DFHM#</isNotEmpty><isNotEmpty property="CALL_TYPE"> and CALL_TYPE= #CALL_TYPE#</isNotEmpty><isNotEmpty property="START_TIME"> and to_date(START_TIME,'yyyy-MM-dd hh24miss') >= to_date(#START_TIME#,'yyyy-MM-dd')</isNotEmpty><isNotEmpty property="END_TIME"> and to_date(END_TIME,'yyyy-MM-dd hh24miss') <![CDATA[<=]]> to_date(#END_TIME#,'yyyy-MM-dd')</isNotEmpty><isNotEmpty property="THDD"> and THDD= #THDD#</isNotEmpty></select><!-- 新增記錄 --><insert id="savedrrzdata" parameterClass="hdfxxx">insert into HD_CALL_LOG (xxzjbh,jzhm,ckrxm,asjbh,ckrsfzh,drzs,drms,drsj)values (#xxzjbh#,#jzhm#,#ckrxm#,#asjbh#,#ckrsfzh#,#drzs#,#drms#,#drsj#)<selectKey resultClass="java.lang.String" keyProperty="xxzjbh">select #xxzjbh# as xxzjbh from dual</selectKey></insert><!-- 查詢所有的信息 --><select id="queryHdlogInfo" parameterClass="hdfxxx" resultClass="hdfxxx">select xxzjbh,ckrsfzh,jzhm,ckrxm,asjbh,drzs,drms,drsj from HD_CALL_LOG where 1=1 and scbz=0</select> </sqlMap>(4)小結
????????在各層之間進行交換的過程中,利用數據傳輸類進行數據的傳遞和交互。其中數據傳輸類與數據庫表一一對應。
SSI框架能夠降低代碼的耦合度,增強了代碼的健壯性和可重用性,加快了開發速度,但是也有一些不足之處,比如由于三種框架的配置文件較多,也會帶來一些不便,特別是對于較小的應用來說更是如此。
總結
- 上一篇: 2022-2028全球自动车道警告系统行
- 下一篇: ROS学习笔记之——amcl源码的解读