1. 程式人生 > >java框架總結1.0

java框架總結1.0

淺談三層架構與MVC

MVC是一個很早就有的經典的程式設計模式:M-V-C-->Model-View-Control,
它來表示域物件與UI表示層通過control來控制的這樣一種架構模式;一般僅僅代表一層
著重處理理清介面;
而web開發中三層架構指的是資料訪問層(DAL-DatabassAccessLayer)--業務
邏輯層(BLL-BussinessLoginLayer)--使用者介面層(UI-UserInterface),一般只一個
系統的巨集觀架構;


三層架構優點:
1.一種標準,標準化
2.增加各層邏輯複用
3.結構更明確,方便維護
4.很容易用新的實現來替換原有的實現
缺點:
1.原本很容易訪問資料庫的,如今必須通過中間層來完成,降低了系統的效能
2.導致級聯的修改,修改一層,其他兩層可能會需要修改
3.增加了開發成本


struts2

1.概念:

struts2是一個基於mvc設計模式的web應用框架,它本質上相當於一個servlet,作為控制器controller來建立模型與檢視的資料互動

2.struts的優缺點:

優點:
1)實現了mvc模式,層次結構清晰,程式設計師只需關注業務邏輯的實現
2)提供豐富的攔截器,也提供豐富的標籤庫,大大提高了開發效率
3)可擴充套件性高,struts-default.xml檔案中設定了預設的bean,resulttype。攔截器等等,使用者可以更改為自己開發所用
缺點:
1)請求引數封裝較為麻煩,由於get/set方法可能比較多,顯得比較臃腫
2)校驗比較繁瑣麻煩細化
3)安全性有待提高,有一些安全漏洞,被黑客攻擊


3.執行流程:

1)瀏覽器傳送一個請求
2)會被StrutsPrepareAndExecuteFilter(前端核心控制器) 攔截,移交控制權給ActionProxy
3)載入struts.xml核心配置檔案,會呼叫struts2框架預設的攔截器inteceptor完成部分功能
4)根據class路徑名查詢action執行操作
5)根據action方法執行結果來選擇跳轉result檢視,反過來執行攔截器,返回到客戶端


4.Action建立方法:

1)建立一個pojo類,自己實現功能
2)建立一個類實現Action介面(定義了五個常量一個execute方法)--input,error,login,none,success
3)建立一個類繼承ActionSupport類


5.封裝資料:

1)屬性驅動;
1)提供與請求引數匹配的屬性,提供get/set方法
2)建立一個javaBean,對其提供get/set,這樣在頁面取值時使用ognl表示式
2)模型驅動:實現ModelDriven介面


6.OGNL表示式:

1)物件導航圖語言,強大的表示式語言,通過簡單一致的表示式去存取物件的任意屬性
2)OGNL三要素: 表示式   OgnlContext 上下文   Root 根,從非根中獲取#{。。。}
3)struts2框架中可以使用ognl+valueStack達到在頁面(jsp)上來獲取相關的資料。


7.攔截器:AOP切面程式設計思想的體現

1)當請求action時,會載入一系列預設的攔截器物件進行攔截,action執行後,產生一個result,再經過一系列的
攔截器,返回到頁面;
2)自定義攔截器:實現interceptor介面或者繼承MethodFilterInterceptor類,再配置進去,
只是這樣預設的攔截器會失效,因此需要手動的引入"defaultStack"


8.檔案上傳:

1)滿足條件:    表單提交方式method=post
表單中必須有一個<input type=”file”>元件
表單中必須設定enctype=”multipart/form-data”
2)fileUpload攔截器實現:FileUtils.copyFile(src,dest);

9.json結構:

1)物件:{key:value,key:value...}取值方法:物件.key
  陣列:["","",""..]通過組合可以形成複雜的資料結構

2)fastJson:String json = JsonObject.toJsonString(user);
  jackson: ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(ps);
3)非同步請求: $.post( url, [data], [callback], [type] )
$.ajax({
  type: 'POST',
 url: url,
  data: data,
  success: success,
  dataType: dataType
});



hibernate



1.hibernate概念:

hibernate是一個開放原始碼的物件關係對映框架,對jdbc進行封裝,將pojo與資料庫建立對映關係,
可以自動生成sql語句,使程式設計師隨心所欲使用面向物件的思想操作資料庫。

2.ORM:

1)物件關係對映,Object Relation Mapping
物件和關係資料是業務實體的兩種表現形式--》在資料庫中是一條資料,在記憶體中為一個物件

3.兩大配置檔案:

1)核心配置檔案:hibernate.cfg.xml--》配置sessionFactory--》datasource等等及對映檔案位置
2)對映配置檔案:類名.hbm.xml-->配置表與物件的屬性對應關係


4.hibernate執行原理:

1)讀取解析核心配置檔案
2)進而讀取解析對映配置檔案
3)得到sessionFactory-->不是輕量級的,一般一個專案有一個sessionFactory(單例)
4)得到session(多例)--》因此session物件使非執行緒安全的;
ⅠsessionFactory.openSession():建立一個新的session,需要手動關閉
ⅡsessionFactory.getCurrectSession():獲得一個與執行緒繫結的session,
 這樣在各層建立使用的session是同一個,而且使用完後會自動關閉(需要在配置檔案中配置)

5)開啟事務--》session.beginTransaction()
6)執行持久化操作--》crud
save  儲存物件
update 修改操作
delete刪除
get/load 根據id進行查詢
savenOrUpdate 執行save或update操作
createQuery()獲取一個Query物件
createSQLQUery()獲取一個可以操作sql的SQLQuery物件
createCriteria() 獲取一個Criteria它可以完成條件查詢


7)提交事務--》session.getTransaction().commit();
8)關閉session和sessionFactory;


5.持久化類--persistent objectPO類

有幾點注意:1)PO類中屬性儘量用包裝類修飾
  2)必須有OID與主鍵對應--hibernate框架就是通過OID來判斷物件的
  3)不能用fina修飾
主鍵生成策略:sequence,native,identity,increment,uuid,assigned等等
1)自然主鍵:具有具體業務含義,如學號,身份證
2)代理主鍵:不具有業務含義,如mysql自增主鍵,oracle序列,uuid()生成的唯一序列串

持久化物件三種狀態:
1)瞬時態:無oid,剛new出來,不在session管理範圍--》save(),saveorupdate()變為持久態
2)持久態:有oid,被session管理,發生改變,hibernate能檢測到--》evict(),clear(),close()清空一級快取變為脫管態
3)遊離脫管態:失去session關聯,發生改變,hibernate不能檢測到


6.hibernate快取:

1.一級快取:session快取,當我們第一次操作session的save。。等方法時,就會持久化物件到session中,當下一次查詢時直接先快取中查詢。
2.持久化物件具有自動更新資料庫的能力---》有一個快照,更改提交後,會看快照與實體是否一樣,不一樣,則向資料庫傳送update語句。
3.二級快取:sessionFactory級別快取
內建快取:hibernate自帶的,不可解除安裝,hibernate初始化階段,會將對映資料放置到sessionFactory的快取中;
外接快取:通常所說的二級快取就是外接快取,一個快取外掛,外部快取的物理介質可以是記憶體或者硬碟
適合放入二級快取的使一些很少被修改,不是很重要的資料(如財務資料就不能放入)
一些較為常見的外掛配置:
1.ehcache
2.opensymphony
3.swarmcache
4.jbosscache

7.資料物件的三種關係:

1)一對一:
原則有兩種:唯一外來鍵對應,在任意一方新增外來鍵來描述對應關係
  主鍵對應,一方的主鍵作為另一方的主鍵
2)一對多:
建表原則:在多的一方新增外來鍵來描述關聯關係
xml中配置:inverse="true",表示有對方維護外來鍵,一般外來鍵在哪個表就有誰維護外來鍵
  級聯操作:cascade="delete/save-update"
3)多對多
建表原則:通過一張中間表來描述對應關係,然後中間表至少有兩個欄位作為外來鍵分別指向多對多雙方的主鍵


8.註解開發:

@Entity 宣告一個實體 @Table來描述類與表對應
@Id來宣告一個主鍵    @GenerateValue 用它來宣告一個主鍵生成策略,預設native
@Column來定義列 @Temporal來宣告日期型別
重要:@Transient 表示類的這個屬性不需要生成在表中
@OneToMany(mappedBy=""),表示所在一方放棄外來鍵的維護,相當於xml中的inverse="true"
@joinColumn(),表示外來鍵生成列
@joinTable()描述中間表
@Cascade()級聯操作


9.hibernate檢索方式:

1)導航物件圖檢索:即根據customer找到order物件
2)OID檢索:session.get/load(Customer.class,3)
3)HQL:session.createQuery(hql)--更面向物件
4)QBC:session.createCriteria(Customer.class)--完全面向物件--通過操作api創造查詢條件查詢
5)SQL:session.createSQLQuery(sql);
本地sql也支援命名查詢


10.HQL多表操作:


注意:多了一個迫切內連線和迫切左外連線

1)顯示內連線:inner join with-->from Customer c inner join c.orders with c.id=1;---》返回一個物件陣列
2)隱式內連線:.-->from Customer c where c.o.id=1;
3)迫切內連線:直接返回from後面的物件--》select distinct c form Customer c inner join fetch c.orders;
4)(左右)外連線:from Customer c left outer join c.orders
5)迫切左外連線:from Customer c left outer join fetch c.orders where c.id = 1;

很明顯,實際開發中對於hql語句查詢用的最多的是迫切內連線,直接返回from後的物件


11.HQL優化:

1)儘量少使用not,因為where後面子句中包含了not後,執行時索引就會失效--》全表掃描
2)使用表的別名,首先能提高程式的可閱讀性,還能減少解析時間及歧義語法錯誤
3)。。。


12.抓取策略:

1)延遲載入:hibernate為提高程式執行效率而提供的一種機制,即只有真正使用該物件的資料時才會載入
load:延遲載入,get:採用的立即載入
2)檢索策略分兩種:
1)類級別檢索:
註解:@Proxy(lazy=true/false)即在實體類上方註明是否延遲載入,如果false,load和get一樣
2)關聯級別檢索:查詢到某個物件,獲得其關聯的物件或屬性,即為關聯級別檢索--》c.getOrders().size();
需要研究其抓取策略。
3)主要考慮一個物件關聯資料量(集合或者物件)比較大,為了程式的優化,採用延遲載入,manytoOne和oneToOne上使用
xml配置:一些集合set上fetch=""(描述的是sql語句格式,是子查詢,還是多表聯查等等),lazy=true/false(表示是否立即傳送sql語句)
註解配置:在集合set上@fetch(),@lazyColection()
批量抓取(batchFetch的N+1問題即三個物件傳送四條sql語句--》採用批量抓取--》底層sql語句用where orders in(...)提升效率)




spring



1.概念:

spring是一個分層的一站式輕量級開源框架,也是一個容器框架,主要特點表現在:整合,即不和現有的解決方案競爭,而是將他們整合融合在一起,高效的完成任務;
2.特點:
1)輕量級:大小和開銷都是較小的
2)容器:
3)控制反轉:IOC(inversion of controller)
原來由我們自己例項化的物件交給spring容器進行初始化,並由其建立各個例項之間的依賴關係
實現原理:xml配置檔案+反射機制+bean工廠--》讀取配置檔案詳細資訊,獲得類的位元組碼物件--》反射--》在bean工廠就獲得了物件的例項

4)面向切面:
5)MVC
6)框架

3.IOC與DI:

IOC:指的是物件例項化的權利交給了spring容器
DI:指的是建立例項化的過程中,通過配置動態的將屬性注入到物件中
注入方法:
1)屬性注入:
需要提供無參構造方法--》更加靈活,
2)構造器注入:
需要提供有參構造方法--》高內聚,強依賴的體現

4.springBean和JavaBean

1)用途:springBean用途廣泛,javaBean一般用來作為值物件傳遞資料
2)寫法:javaBean要求為每個屬性都提供對應的set/get方法,而springBean僅需要對其需要注入的屬性提供set方法
3)生命週期:JavaBean不接受任何容器的管理,而springBean由容器管理其生命週期及行為


5.spel表示式:

提供在程式執行是構造複雜表示式來完成物件屬性的儲存及方法的呼叫--》#{表示式}--》#{key.屬性}


6.註解開發

@Component
@Repository @[email protected]
@Value("")簡單屬性注入@Autowired複雜屬性注入--根據型別注入[email protected]("")根據名稱注入[email protected](name="")
@Scope("prototype")多例
@RunWith(SpringJUnit4ClassRunner.class)整合Junit4測試
@ContextConfiguration(locations = "classpath:applicationContext.xml")指明spring配置檔案位置
@Lazy(true) 表示延遲初始化
@Before標誌一個前置增強方法
@AfterReturning後置增強
@AfterThrowing異常丟擲增強
@After--》final增強,必須執行
@Around環繞增強
@DeclareParents引介增強

7.AOP(Aspect Oriented Programming)面向切面程式設計:

1)概念:對業務邏輯的各個部分進行隔離,使各部分之間的耦合度降低,提高程式的可複用性,提高開發效率
2)主要功能:日誌記錄,效能統計,安全控制,事務管理,異常處理--》單獨分離出來,不影響主要業務邏輯程式碼
3)OOP面向物件程式設計--封裝繼承多型,高效的開發
  AOP面向切面程式設計--處理過程中某個步驟隔離出來,降低耦合
4)關鍵詞:
1.目標物件:target--》需要被增強的物件,通過動態代理實現
2.連線點:joinpoint--》被攔截到的點或方法
3.切入點:pointcut--》表示對哪些連線點或者方法進行攔截
4.通知(增強):advice--》攔截都連線點之後所進行的具體操作
分為:前置通知,後置通知,異常通知,最終通知,環繞通知
5.引介:introduction
6.切面:aspect--》切入點和通知的結合
7.織入:weaving--》織入是一個過程,將切面應用到目標物件創建出代理物件的過程
spring採用動態織入,aspectj採用靜態織入
8.代理:Proxy--》一個類被AOP織入增強後,就產生一個結果代理類


5)底層實現:
1.靜態AOP:AspectJ實現的AOP,將切面程式碼直接編譯到Java類檔案中
 動態AOP:將切面程式碼動態織入實現AOP
2.SpringAOP為動態AOP,實現技術為:
1)JDK動態代理:JVM內部動態生成class位元組碼Class物件,只針對於實現了介面的物件進行代理操作
1.Proxy:提供用於建立動態代理類和例項的靜態方法,它還是由這些方法建立的所有動態代理類的超類。
2.靜態方法建立代理物件:
Proxy.newProxyInstance(ClassLoader loader,Class<?>[]interfaces,,InvocationHandler)
解釋:
ClassLoader:目標類的類載入器物件--》target.getClass().getClassLoader();
    Class<>interfaces:目標類實現的介面的class[]物件-->target.getClass().getInterfaces();     
     InvocationHandler:是代理例項的呼叫處理程式 實現的介面,每個代理例項都具有一個關聯的呼叫處理程式。
實現InvocationHandler介面後,用this代替即可


3.重寫invoke(Object proxy,Method method,Object[]args)方法:具體的代理方法執行者
對代理例項呼叫方法時,將對方法呼叫進行編碼並將其指派到它的呼叫處理程式的 invoke 方法
即用代理例項呼叫方法時,都是由invoke方法進行真正的處理呼叫,
處理並返回結果{return method.invoke(target,args);}--》反射
解釋:
proxy:代理物件
method:呼叫的方法
args:呼叫方法的引數
*可以在呼叫方法前做其他操作如校驗等等,也可以在方法後做如丟擲異常釋放資源等操作
2)CGLIB動態位元組碼增強技術:
CGLIB 包的底層是通過使用一個小而快的位元組碼處理框架 ASM,來轉換位元組碼並生成
新的類,目標物件不需要實現介面,都能建立代理物件,只不過是目標物件的子類的代理
1.怎麼建立:
實現MethodInterceptor介面
Enhancer enhancer = new Enhancer();//建立一個增強物件
enhancer.setSuperclass(target.getClass);
enhancer.setCallback(this);//回掉函式,這個this就是MethodInterceptor
return enhancer.create();//產生代理物件,目標物件的子類代理

2.重寫intercept(Object proxy,Method method,Object[]args,MethodProxy methodProxy)方法
解釋:
proxy:代理物件
method:呼叫方法
args:方法引數
methodProxy:自類方法代理物件


返回:{return method.invoke(target,args)或者return methodProxy.invokeSuper(proxy,args)}
同理,也可以在返回前執行校驗等操作




3.spring具體採用哪一種動態代理機制:
如果目標物件有介面,優先使用jdk動態代理
如果目標物件沒有介面,使用cglib動態代理


8.springAOP傳統開發:匯入aop聯盟jar包+xml配置,比較麻煩

前置通知,實現MethodBeforeAdvice
後置通知,實現AfterReturningAdvice
環繞通知,實現MethodInterceptor
異常丟擲通知,實現ThrowsAdvice
引介通知,實現IntroductionInterceptor


9.基於aspectj切面傳統開發:簡化配置

<bean目標target>
<bean增強advice>
<aop:config配置>
<aop:pointcut expression="切點表示式execution(* cn.itheima.aop.IOrderService.*(..)即介面中所有方法攔截)" id="mypointcut">//定義切點
<aop:advisor advice-ref="" pointcut-ref="">//定義切面=切點+增強
</aop:config>


10.spring整合aspectj框架實現aop開發:更加簡化開發

基於xml配置開發:
1.aspectj框架定義了6種通知:
Before:前置通知 可以完成日誌記錄,許可權控制
AfterReturning:後置通知
Around:環繞通知 可以完成日誌操作,許可權操作,效能監控,事務管理
AfterThrowing:丟擲通知
DeclareParents:引介通知
After:最終通知 可以完成資源釋放


2.不需要實現任何介面,定義前置後置等方法後在xml種配置即可
<aop:config>
<aop:aspect ref="">
<aop:before method="" pointcut=""/>
</aop:aspect>
</aop:config>


3.<aop:config proxy-target-class="false">預設false代表有介面使用jdk動態代理,如果要使用cglib,之需改為true即可


基於註解開發:
1.編寫目標,開啟註解<context:component-scan />
2.編寫增強 在類上@Component @Aspect-->宣告是一個增強 
在方法上@Before("execution()")@Around()......


11.spring事務管理

1.平臺事務管理器PlatformTransactionManager:
DataSourceTransactionManager  主要針對於 JdbcTemplate 開發  MyBatis 開發
HibernateTransactionManasger 主要針對於 Hibernate 開發
JpaTransactionManager  主要針對於 JPA 開發。
2.事務特性TransactionDefinition介面定義了很多特性:
事務隔離級別:髒讀,不可重複讀  虛讀。
事務傳播行為:它解決的是兩個被事務管理的方法互相呼叫問題。它與資料庫沒關係,是程式內部維護的問題。
事務超時:多長時間這個事務自動回滾
只讀狀態:true/false
3.對於不現的資料庫,它的底層預設事務隔離級別不一樣。
Oracle 資料庫它預設的是 read_committed--解決髒讀,無法解決不可重複讀,虛度
Mysql 資料庫它預設的是 repeatable_read--解決不可重複讀,髒讀,解決不了虛度
4.事務管理的方式:
1)編碼方案:具有侵入性,將事務管理程式碼新增到業務程式碼,不建議使用
2)宣告式事務控制:基於aop對目標進行代理,新增around環繞通知,不需要修改業務程式碼,推薦使用
具體操作:xml中配置事務管理,在service層添加註解@Transactional
區別:宣告式事務管理細粒度只能到方法級別,而程式設計事務管理能到程式碼塊級別,更靈活,但具有侵入性,不方便管理;


12.spring整合hibernate

1.操作:a.dao層只需繼承HibernateDaoSupport--》
b.注入一個sessionFactory,獲得HibernateTemplate模板物件,它是對hibernate操作的一個簡單封裝,使用更方便
c.執行crud操作:this.getHibernateTemplate().save()....
 

13.spring整合struts2

1.web.xml中配置好StrutsPrepareAndExecuteFilter
[email protected] @[email protected]@ParentPackage()@Action()
3.no session問題解決:
1)不適用延遲載入
2)手動將延遲載入初始化Hibernate.initialize(延遲物件);
3)spring提供一個OpenSessionInViewFilter來解決,在web.xml配置在struts2Filter之前即可
原理是將session的關閉操作不在service完成,而是在檢視層才關閉



mybatis



1.核心物件:sqlSession

1) 往上--》sqlSessionFactoryBuilder-->sqlSessionFactory-->sqlSession
2)往下--》executor()/selectOne()/selectList()-->執行sql---》根據核心配置檔案sqlMapConfig.xml(配置一些基本環境即資料庫連線資訊)
--->user.xml(userMapper.xml)(對映檔案--》preparestatement配置)--->實現物件與資料庫的對映注入操作


2.原生dao開發與Mapper動態代理方式:

1)原生--》user.xml
2)動態代理--》Mapper.xml-->代理物件實現了 InvocationHandler介面,重寫invoke方法生成Proxy代理物件
--》session.getMapper(User.class)==userMapper-->userMapper.findUserById();
3)jdk動態代理:
1)實現InvocationHandler--》invoke()-->proxy-->在呼叫方法前後可以執行復雜的操作  
2)JDK中所要進行動態代理的類必須要實現一個介面,也就是說只能對該類所實現介面中定義的方法進行代理,
  這在實際程式設計中具有一定的侷限性,而且使用反射的效率也並不是很高。
 
 cglib動態代理:
1)使用CGLib實現動態代理,完全不受代理類必須實現介面的限制,而且CGLib底層採用ASM位元組碼生成框架,使用位元組碼技術生成代理類,比使用Java反射效率要高
2)被代理類--》攔截器(實現methodInteceptor介面)--》生成動態代理類(Enhancer位元組碼增強器)--》在呼叫方法前後可以執行復雜的操作


3.與hibernate或者原生jdbc的比較:

1)在SqlMapConfig.xml中配置資料鏈接池,使用連線池管理資料庫連結。
2)將Sql語句配置在XXXXmapper.xml檔案中與java程式碼分離。
3)Mybatis自動將java物件對映至sql語句,通過statement中的parameterType定義輸入引數的型別。
4)Mybatis自動將sql執行結果對映至java物件,通過statement中的resultType定義輸出結果的型別。

注意:
1)parameterType輸入設定
2)resultType和resultMap兩種輸出封裝

不管是哪一種配置,最終的目的都是為了查詢物件與對映檔案中sql語句匹配起來,即能夠一一對映。


4.三種場景:

mybatis就是面向sql語句的持久層---》重點在於sql語句的掌握,對映檔案中一個sql語句就是一個statement物件
hibernate面向查詢物件的持久層---》重點在於crud操作的物件api,對映檔案中註明了資料庫各欄位與物件屬性的對應關係

1)一對一關聯對映:
xml配置:
<assciation properties="" javatype=""/>
2)一對多關聯對映:
xml配置:
<collection properties="" oftype=""/>
3)多對多關聯對映:



5.spring整合mybatis:

配置applicationContext.xml:
1)配置datasource--》如c3p0
2)配置sqlSessionFactory--》負責與資料庫連線:sqlSessionFactory交給spring管理--》spring提供SqlSessionFactoryBean(需要datasource及配置檔案)
3)傳統dao配置:daoImpl--》ref="sqlSessionFactory"-->daoImpl extends SqlSessionDaoSupport
 
  mapper代理dao配置:MapperFactoryBean
mapper代理的開發原則:
1)介面全限定名與namespace名相同
2)方法名與property中的id相同
3)輸入引數型別與parameterType一致,輸出引數型別與resultType或resultMap中的type屬性值相同

  包掃描器:MapperScannerConfigurer

6.逆向工程

1.自動生成對映配置檔案和介面檔案---》會怎麼應用和修改
2.只能生成單表--》所以得學會在單表基礎上修改新增:<assciation/> <collection











springmvc



1.概念:

springwebmvc是spring框架的一部分,是檢視層的一個框架

2.架構流程:


1)使用者傳送請求只前端控制器DispatcherServlet
2)DispatcherServlet收到請求呼叫HandlerMapping處理器對映器
3)HandlerMapping根據請求的url地址找到具體的處理器,生成處理器物件及攔截器物件,返回給DispatcherServlet
4)DispatcherServlet通過HandlerAdapter處理器介面卡呼叫處理器
5)執行處理器,並返回ModelAndView物件到DispatcherServlet
6)DispatcherServlet將ModelAndView傳給檢視解析器ViewReslover
7)ViewReslover解析後返回具體的view到DispatcherServlet
8)DispatcherServlet響應回用戶

綜上所述:前臺到controller檢視層必須經過DispatcherServlet控制器,都是由他來呼叫轉發元件處理請求的


3.三大元件:

1)HandlerMapping:處理器對映器
2)HandlerAdapter:處理器介面卡
3)ViewResolver:檢視解析器


4.springmvc和struts2的比較:

1)核心控制器:springmvc在web.xml中配置前端控制器DispatcherServlet,而struts2在web.xml中配置strutsPrepareAndExecutorFilter
2)請求路徑:springmvc請求路徑配置在方法上@RequestMapping,struts2請求連線通過類上的@[email protected]配置
3)請求引數封裝:springmvc通過形參封裝,struts2通過屬性驅動或者模型驅動封裝
4)返回檢視:springmvc通過建立ModelAndView物件,通過request域傳輸返回,而struts2通過@action配置屬性results={@result(location="")}配置,採用值棧儲存響應
5)@Controller:一般而言,springmvc基於方法url的@Controller預設單例,struts2基於類設計為多例的












高階引數的繫結:
1.陣列:
在形參中新增引數:string[] ids
在pojo新增string[] ids屬性,提供set/get方法
2.List:在pojo類中新增List<Items>成員屬性,提供get/set方法,回顯是遍歷展示
前臺通過value取值


@RequestMapping註解:
方法上必須有
有時為了複雜的需求,可以在類上也新增此註解,組成兩級路徑--》窄化請求對映
請求方法限定:@RequestMapping(method={RequestMethod.POST})預設post/get都支援


Controller方法返回值:
1.返回ModelAndView--封裝資料和檢視--return modelAndView;

2.返回字串--model封裝直接返回檢視,通過檢視解析器解析為物理檢視地址
1)邏輯檢視名:return "item/editItem";
2)Redirect重定向:return "redirect:queryItem.action"--url地址會變,
相當於一個新的request/response,這時如果還要傳遞引數,可以在後面拼接?..&...
3)forward轉發:return "forword:editItem.action"--url地址不變,還是同一個
request/response,不需要再次新增請求引數


3.返回void--原生態request和response解決跳轉和返回值
response.sendRedirect("url"):重定向
request.getRequestDispatcher("").forword(request,response):請求轉發
response.getWriter().write();

頁面獲取值:
${key名稱.屬性.屬性}-->不管是字串,pojo,vo都可以


異常處理:
客戶端---請求》springmvcDispatcherServlet-->Controller-->service-->dao
 ||  |  |
|丟擲 丟擲    丟擲
HandlerExceptionResolver全域性異常處理器進行異常處理

圖片上傳
json資料互動
@RequestBody-->將請求json轉為java物件
@ResponseBody--》將java轉為json輸出


RESTful--一種資源定位及資源操作的設計風格
/攔截所有請求,不包括jsp
/*攔截所有請求


攔截器:
自定義需要實現HandlerInterceptor





























相關推薦

java框架總結1.0

淺談三層架構與MVCMVC是一個很早就有的經典的程式設計模式:M-V-C-->Model-View-Control, 它來表示域物件與UI表示層通過control來控制的這樣一種架構模式;一般僅僅代表一層 著重處理理清介面;而web開發中三層架構指的是資料訪問層(DA

Facebook宣佈釋出深度學習框架 PyTorch 1.0開發者預覽版

今日,Facebook 宣佈釋出深度學習框架 PyTorch 1.0 開發者預覽版,包括一些列工具和整合,使其與 Google Cloud、AWS、Azure 的機器學習服務更為相容。 ARM、Nvidia、高通、英特爾也在核心庫整合和跟蹤推理執行時的工具中添加了 PyTorch 支援。 &

從零寫分散式RPC框架 系列 1.0 (2)RPC-Common模組設計實現

RPC-Common模組提供RPC-Server和RPC-Client的通用物件,封裝統一規則,使RPC Server和RPC Client 可以基於同一協議通訊。主要包含底層通訊的Netty所需的編碼解碼器(RpcEncoder,RpcDecoder),實現自定義協議的傳輸物件(Rpc

從零寫分散式RPC框架 系列 1.0 (5)整合測試

本篇將對前面幾篇模組作整合處理,使用spring-boot-starter的形式進行釋出。然後新建 examples 工程模組對其測試使用。 系列文章: 從零寫分散式RPC框架 系列 1.0 (1)架構設計 從零寫分散式RPC框架 系列 1.0 (2)RPC-Common模組設計

從零寫分散式RPC框架 系列 1.0 (4)RPC-Client模組設計實現

RPC-Client模組負責建立 動態代理物件 供 服務消費者 使用,而動態代理物件的方法執行則是通過RPC呼叫RPC-Server的服務實現。即RPC-Client遮蔽了底層的通訊過程,使得服務消費者可以基於介面透明使用服務提供者的服務。 系列文章: 從零寫分散式RPC框架 系

從零寫分散式RPC框架 系列 1.0 (3)RPC-Server模組設計實現

RPC-Server模組負責(1)將@RpcService註解標記的服務和自身資訊註冊到ZK叢集,(2)對外提供RPC服務實現,處理來自RPC-Client的請求。該模組整體的核心類為 RpcServer ,而真正處理請求的核心類是 RpcServerHandler 。另外還有一個 ZK

Java——IO總結1

    對於任何程式設計語言而言,輸入輸出(Input/Output)系統都是非常核心的功能。程式執行需要資料,資料的獲取往往需要跟外部系統進行通訊,外部系統可能是檔案、資料庫、其他程式、網路、IO裝置等等。  輸入(Input)指的是:可以讓程式從外部系統獲得資料(核心含

java框架學習日誌-0

再學習java基礎後,按照學習路線,應該學習java框架,但是學習框架之前,要搞清楚框架是什麼。 百度搜索框架,都是一些很專業,很抽象的話,讓人不是很理解。在看過一些書籍和視訊後,我對框架有了自己的理解。 我把一個程式比喻成一棟大樓,類(class)就像是房間一樣。比如說我們今天學了if語句

iOS網路框架AFNetworking3.1.0底層原始碼解讀

AFNetworking基本是iOS開發中的網路第三方庫標配,本文基於AFNetworking3.1.0版本。咱們主要從使用的角度來介紹AFNetworking的發起Get請求的過程,偏重於解讀過程,解讀當你使用AFNetworking發起一個Get請求的時候,

JAVA學習日誌1.0

關於1.0課內容的小結 一、 JAVA語言的主要特點 跨平臺:Java程式可以在任意作業系統上執行,一次編寫到處執行(依賴Java的虛擬機器 JVM (Java Virtual Machine)) 二、常用DOC命令 –d: 回車 碟符切換 –dir(directory):列出當前目

leetcode刷題——一些演算法技巧總結1.0

運算子優先順序,簡單記就是:! > 算術運算子 > 關係運算符 > && > || > 賦值運算子 把數字取反,可以作為一種標記 pythonlast = {c: i for i, c in enumerate(S)}標記字串S中每個字母的最後一個位

java SE總結(1)

1. 面向物件的特徵:     繼承:被繼承的類稱為父類,繼承的類稱為子類。子類擁有父類的屬性和方法,當然,構造方法除外。     封裝:方法就是一種封裝,類也是一種封裝,封裝之後,外部想進行訪問,必須通過一定規則。   &

Spring框架學習1.0對動態代理的理解z,自定義BeanFactory

自定義一個介面 和一個接實現類 public interface Hello { void setInfo(String a,String b); String getInfo(); void hah(String s); }/** * Creat

從零寫分散式RPC框架 系列 1.01)架構設計

本系列文章的目的是搭建出一個基於Netty,Zookeeper和SpringBoot的簡易分散式RPC框架,並且釋出到Maven中央倉庫以 spring-boot-starter 的形式對外提供開箱即用的服務。1.0 版本使用 protobuf 來做序列化,最終

Java基礎總結0開始(二):final、finally、finalize的區別

final:用於修飾類、方法和屬性;被修飾的類不能被繼承,方法不能重寫,屬性不可改變即參量;        -----ps:abstract和final不能同時修飾類finally:多用捕獲異常後必須執行執行的程式碼塊,比例關閉連線,IO流等;finaliza:JVM在回收垃

Java基礎總結0開始(三):Java反射原理

反射:Java虛擬機器允許執行時獲取類的資訊。  2.1 反射的常用方法:        a.forName(String className) :           返回與帶有給定字串名的類或介面相關聯的 Class 物件。        b.forName(String

Android多媒體框架總結(1)

場景介紹:  裝置端通過伺服器傳向客戶端(Android手機)實時傳送視訊資料(H.264)和音訊資料(g711a或g711u), 需要在客戶端將音視訊資料儲存為MP4檔案存放在本地,使用者可以通過APP或者直接在手機上觀看MP4檔案.解決方案:  通過Android MultiMedia Framework

【外掛釋出】JAVA微服務框架,Jeecg-P3-Demo 1.0.0 外掛開源釋出

JAVA微服務框架,Jeecg-P3-Demo 1.0.0 外掛開源釋出 Jeecg-P3-Demo專案,採用JEECG-P3微服務框架技術,做了幾個常見Demo功能案例:普通列表、樹列表、一對多列表、產品管理(bootstrap-talbe列表)等功能,為大家快速瞭解使用P3微服務

【外掛釋出】JAVA微服務框架,Jeecg-P3-Base-System 1.0.0 外掛開源釋出

JAVA微服務框架,Jeecg-P3-Base-System 1.0.0 外掛開源釋出 系統管理外掛,採用JEECG-P3微服務框架技術,實現了P3外掛平臺支撐的基礎功能:使用者管理,角色管理、選單管理等功能。 實現許可權攔截器,在jeecg-p3-starter-web

易學筆記-0Java語言總結/0.1 String、StringBuilder、StringBuffer三者有什麼區別

易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/