Java框架知識點總結

1、Struts1的運行原理前端

在啓動時經過前端總控制器ActionServlet加載struts-config.xml並進行解析,當用戶在jsp頁面發送請求被struts1的核心控制器ActionServlet接收,ActionServlet在用戶請求時將請求參數放到對應的ActionForm對象中的成員變量中,而後ActionServlet則會根據struts-config.xml中的映射關係找到相應的Action中的方法,將對應的ActionForm一併傳給這個Action中的方法裏,而後執行相應的業務邏輯操做,最後就根據ActionMapping的findforward方法返回一個ActionForward,以後在struts-config.xml中找到與之對應的forward標籤,根據它的配置路徑找到對應的jsp頁面。java

2、Struts2的運行原理opp   程序員

一、tomcat 啓動的時候會加載 web.xml 、核心控制器 FilterDispatcher 會加載並解析 struts.xmlweb

二、客戶端會發送一個請求到 action 、FilterDispatcher  會根據後綴名進行攔截spring

三、FilterDispatcher根據 struts.xml  的配置文件信息 找到 某個action 對應的某個類裏的指定方法sql

四、執行相關的業務邏輯最後返回 一個String數據庫

五、<action/> 裏配置 <result/> name的屬性值與返回的String 進行匹配,跳轉到指定的jsp 頁面瀏覽器

3、struts2的體系結構緩存

一、客戶端向Servlet容器(例如Tomcat)發送一個請求;tomcat

二、這個請求通過一系列的過濾器(Filter);

三、接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否須要調用某個Action;

四、若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;

五、ActionProxy經過Configuration Manager詢問框架的配置文件,找到須要調用的Action類;

六、ActionProxy建立一個ActionInvocation的實例。

七、ActionInvocation在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。

八、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果一般是jsp或者FreeMarker的模版。(體系結構圖見下一頁)

 

4、Spring MVC運行原理

整個處理過程從一個HTTP請求開始:

1.Tomcat在啓動時加載解析web.xml,找到spring mvc的前端總控制器DispatcherServlet,而且經過DispatcherServlet來加載相關的配置文件信息。

2.DispatcherServlet接收到客戶端請求,找到對應HandlerMapping,根據映射規則,找到對應的處理器(Handler)。

3.調用相應處理器中的處理方法,處理該請求後,會返回一個ModelAndView。

4.DispatcherServlet根據獲得的ModelAndView中的視圖對象,找到一個合適的ViewResolver(視圖解析器),根據視圖解析器的配置,DispatcherServlet將要顯示的數據傳給對應的視圖,最後顯示給用戶。

 

5、Struts1.x與Struts2.x的區別

Struts 2以WebWork爲核心,

採用攔截器的機制來處理用戶的請求,struts1嚴重依賴於servletAPI,

屬於侵入性框架,struts2不嚴重依賴於servletAPI,屬於非侵入型框架。

線程模型方面:

Struts1的Action是單實例的,

一個Action的實例處理全部的請求。

Struts2的Action是一個請求對應一個實例(每次請求時都新new出一個對象),

沒有線程安全方面的問題

封裝請求參數:

Struts1中強制使用ActionForm對象封裝請求的參數。

Struts2能夠選擇使用POJO類來封裝請求的參數,或者直接使用Action的屬性。

struts1的前端總控制器(核心總控制器)爲ActionServlet,

struts2的前端總控制器(核心總控制器)爲FilterDispather

 

 

6、Spring MVC、struts1和struts2區別

1.spring mvc 單例 非線程安全

  struts1單例 非線程安全

  struts2線程安全對每一個請求都產生一個實例

2.spring mvc的入口是servlet,而struts2是filter

  spring 的前端總控制器爲 DispatcherServlet

  struts2 的前端總控制器爲 FilterDispatcher

  struts1 的前端總控制器爲 actionServlet

3. 參數傳遞:struts是在接受參數的時候,

能夠用屬性來接受參數,這就說明參數是讓多個方法共享的。

springmvc 用方法來接受參數

4.spring mvc是基於方法的設計,而sturts是基於類

 

7、Struts2中result中的type類型

1.dispatcher:它是默認的,用來轉向頁面,一般處理JSP

    2.redirect:將用戶重定向到一個已配置好的URL

    3.redirectAction:將用戶重定向到一個已定義好的action

    4.chain:將action和另一個action連接起來

    5.freemarker:呈現Freemarker模板

    6.httpheader:返回一個已配置好的HTTP頭信息響應

    7.stream:向瀏覽器發送InputSream對象對下載的內容和圖片很是有用

    8.velocity:呈現Velocity模板

    9.xslt :該XML能夠經過XSL模板進行轉換

    10.plaintext:顯示原始文件內容,例如文件源代碼

 

8、Struts2標籤

首先須要引用 <%@taglib prefix="s" uri="/struts-tags"%>

1.<s:if></s:if> 判斷標籤 後面可跟 <s:else>

2.<s:iterator> </s:iterator> 迭代標籤

3.<s:include></s:include> 引入標籤 能夠把一個JSP頁面或者servlet引入一   個頁面中

4.<s:property></s:property> 輸出標籤

5.<s:set></s:set> 標籤賦予變量一個特定範圍內的值

6.<s:form></s:form> 表單標籤

7.<s:testarea></s:textarea> 文本域標籤

8.<s:select></s:select> 下拉標籤

9.<s:url></s:url> 聲明一個url的路徑

 

最經常使用的是:

判斷<s:if></s:if>

循環<s:iterator></s:terator>

輸出<s:property></s:property>

 

9、SSI整合

一、Action繼承於Actionsupport

二、引入struts-spring-plugin.jar包,從而完成struts和spring的整合

三、在struts2的action中注入service,保證service的名字和配置文件中的一致,  並生成get,set方法

四、Dao層繼承於SqlMapClientDaoSupport

五、在dao層的配置文件中注入sqlMapClient

 

10、SSH整合

 

1.首先在web.xml中經過ContextLoaderListener來融入spring,

並加載spring的相關配置文件

 

2.一樣配置sturts2的前端總控制器filterDispatcher來過濾相關的

請求而且加載struts.xml

 

 

3.action繼承ActionSupport,而後經過引入struts-spring-plugin.jar

包而且根據配置文件中service的id生成get,set方法來注入service層。

 

 

4.dao層繼承於HibernateDaoSupport,而且在dao的配置文件中注入sessionFactory.

 

 

5.經過spring中的配置文件加載hibernate.cfg.xml文件從而融入hibernate.

 

 

在ssh框架中是怎麼整合spring?

首先在web.xml中經過ContextLoaderListener來融入spring,

並加載spring的相關配置文件

 

在ssh框架中是怎麼整合hibernate?

經過spring中的配置文件加載hibernate.cfg.xml文件從而融入hibernate

dao層繼承於HibernateDaoSupport,而且在dao的配置文件中注入sessionFactory

 

 

在ssh框架中是怎麼整合struts2?

配置sturts2的前端總控制器filterDispatcher來過濾相關的

請求而且加載struts.xml

 

10、Spring MVC整合

1.首先,要在web.xml裏面配置SpringMVC的核心控制器,DispatcherServlet,對指定的後綴請求進行攔截。

2.Controller層要加 @Controller註解,代表該類是MVC的控制層。

3.建立Service接口,給接口加上註解 @Component或者 @Service 代表這是Service業務處理層

4.在Controller層聲明Service變量(屬性),給變量(屬性) 加上 @Autowired註解,經過自動綁定機制將Service注入到Controller。 (注:@Autowired默認是ByType,若是想根據屬性名注入,那麼就再加上註解 @Resource(name="屬性名"))

5.在Controller層的方法上加上註解 @RequestMapping("requestAddress") 代表該方法的請求地址

6.Dao層要加上註解 @Repository 代表這是數據庫持久層

7.一樣將dao實例注入到service層中。

8.配置視圖解析器 "InternalResourceViewResolver",對處理後的跳轉進行統一配置。

11、Hibernate 中get 和 load的區別

加載方式:

    load爲延遲加載(返回的是一個只有id屬性的代理,只有使用該對象屬性時,才   發出sql語句);

    get爲當即加載(執行時,會當即向數據庫發出sql語句)

返回結果:

    load檢索不到記錄時,會拋ObjectNotFoundException異常

    get檢索不到記錄時,會返回null

12、Hibernate、Ibatis、Jdbc三者的區別

Hibernate屬於全自動, Ibatis屬於半自動,Jdbc屬於手動,從開發效率上講hibernate較高,ibatis居中,jdbc較低,從執行效率上講hibernate較低,ibatis居中,jdbc較高,由於jdbc是手工寫sql語句,程序員對sql的控制能力更大,能夠根據業務須要進行優化,而ibatis雖然也能夠對sql進行優化,可是他裏面將resultset封裝爲實體的過程當中採用了反射機制因此必定程度上影響了性能,而hibernate由於高度封裝因此開發效率相對較高,但正由於這個緣由,因此程序員在對sql語句的控制和優化方面相對比較弱,並且在將resultset封裝成實體的過程當中也採用了反射機制,因此在性能方面較低

十3、Hibernate的運行原理

首先經過configuration去加載hibernate.cfg.xml這個配置文件,根據

配置文件的信息去建立sessionFactory,sessionFactory是線程安全的,

是一個session工廠,用來建立session,session是線程不安全的,至關於

jdbc的connection,最後經過session去進行數據庫的各類操做,在進行操做

的時候經過transaction進行事務的控制。

十4、Hibernate五大核心(類/接口)簡述

1 .Configuration接口的做用是對Hibernate進行配置,以及對它進行啓動。(加載  hibernate.cfg.xml)並建立一個SessionFactory對象。

2 .SessionFactory接口

SessionFactory接口負責初始化Hibernate。它充當數據存儲源的代理,並負責建立  Session對象。SessionFactory是線程安全的。

3 .Session接口

Session(會話)接口是Hibernate應用使用的主要接口。Session接口負責執行被持久化對象的CRUD操做(增刪改查)。Session對象是非線程安全的。Session 至關於jdbc的connection

4 .Query與Criteria接口

總之Query和Criteria接口負責執行各類數據庫查詢。

5 .Transaction接口

Transaction(事務)負責操做相關的事務。

十5、Hibernate與JDBC的區別

一、hibernate和jdbc主要區別就是,hibernate先檢索緩存中的映射對象( 即hibernate操做的是對象),而jdbc則是直接操做數據庫.

二、Hibernate是JDBC的輕量級的對象封裝,它是一個獨立的對象持久層框架。Hibernate能夠用在任何JDBC可使用的場合

三、Hibernate是一個和JDBC密切關聯的框架,因此Hibernate的兼容性和JDBC驅動,和數據庫都有必定的關係,可是和使用它的Java程序,和App Server沒有任何關係,也不存在兼容性問題。

四、若是正確的使用JDBC技術,它的執行效率必定比hibernate要好,由於hibernate是基於jdbc的技術.

五、JDBC使用的是SQL語句,Hibernate使用的是HQL語句,可是HQL語句最終還會隱式轉換成SQL語句執行。

十6、Hibernate中的兩大配置文件

*.hbm.xml:主鍵生成策略,映射關係,一對多,一對一的關係。

Hibernate.cfg.xml:方言(用哪一個數據庫),數據庫鏈接信息,包含*.hbm.xml內容,映射  文件,也能夠配事務。

十7、Hibernate事務處理

開啓事務 session.beginTransaction();

執行相關的操做,若是成功則session.getTransaction().commit();

執行操做失敗則 session.getTransaction.rollback();

十8、Hibernate的三種狀態以及狀態的轉換

Transient(臨時)

      new 一個初始化對象後,並無在數據庫裏保存數據,處於臨時狀態;

Persistent(持久化)

      當執行save()方法,調用session.close()方法以前,內存中的對象與數據庫有           對應關係處於持久化狀態;

Detached(託管/遊離)

   當執行session.close()以後,處於託管狀態;

狀態的轉換

      處於託管狀態下,調用update()方法後,轉換爲持久化狀態;

      在持久化狀態下,執行delete()方法後,轉換爲臨時狀態;

      在未初始化對象以前,調用get(),load(),find(),iterate()以後,直接進入持久化    狀態。

十9、分頁步驟

①前臺封裝一個顯示分頁的組件

②查詢總條數

③後臺封裝分頁工具類,計算開始位置、結束位置、總頁數

④後臺寫支持分頁的sql語句

⑤前臺包含分頁組件,實現分頁效果

 

注意:

查詢總條數的where和查詢列表信息的where條件要保證一致。

二10、hibernate緩存概述

hibernate分爲一級緩存即session緩存也叫事務級別的緩存以及

二級緩存sessionFactory即應用級別的緩存,還有查詢緩存即三級緩存.

一級緩存的生命週期和session的生命週期保持一致,

hibernate默認就啓用了一級緩存,

不能將其關閉,能夠經過session.clear()和session.evict(object)來管理一級緩存。其中get,load,iterate都會使用一級緩存,一級緩存緩存的是對象。

二級緩存的生命週期和sessionFactory的生命週期保持一致,能夠跨session,被多個session共享,hibernate3默認開啓二級緩存,也能夠手動開啓並指定緩存插件如ehcache,oscache

等。二級緩存也只能緩存對象。

三級緩存也叫查詢緩存,查詢緩存是針對普通屬性結果集的緩存,

對實體對象的結果集只緩存id。對query.list()起做用,query.iterate不起做用,也就是query.iterate不使用查詢緩存

 

二11、Ssh的概述:

ssh是web開發中常見的一種框架

s-struts

s-spring

h-hibernate

其中struts在框架中充當控制器,實現MVC,主要用來處理用戶的請求,和跳轉頁面。使項目結構清晰,開發者只須要關注業務邏輯的實現便可。

spring在ssh充當粘合劑,粘合struts-sping-hibernate,主要用來進行事物的控制,

hibernate-充當數據庫持久層,主要用它來與數據庫交互,提升開發效率,減輕程序員sql控制要求,並且hibernate經過反射機制,有靈活的映射性,還支持各類關係,一對一,一對多,多對多。

在進行ssh整合的時候,咱們應該注意:

1. Action繼承於ActionSupport

引入struts-spring-plugin.jar包,從而完成struts和spring的整合

在struts2的action中注入service,保證service的名字和配置文件中的一致,並生成get,set方法

Dao層繼承於hibernateDaoSupport

在dao層的配置文件中注入sessionFactory

 

二12、防止表單重複提交

針對於重複提交的總體解決方案:

1.用redirect來解決重複提交的問題

2.點擊一次以後,按鈕失效

3.經過loading

4.自定義重複提交過濾器

5.解決struts2重複提交

能夠結合s:token標籤來解決重複提交問題

 

利用token的原理:

1.在前端的jsp頁面中加入s:token標籤,在訪問該頁面時就會生成

  隱藏域,該隱藏域中包含一個隨機生成的字符串,並把該字符串

  存入session中

 

2.在struts2的配置文件中加入token攔截器後,當正常訪問action

的時候,會從session中取出該字符串,而後和頁面隱藏域中提交

字符串作對比,若是一致則正常執行並刪除session中存儲的字符串。

二十3、JSP標籤:

1.JSP  include動做

jsp:include  動做

以「<jsp: 動做名 」 開始,以「</jsp:動做名>  」 結束

好比:<jsp:include page=" Filename" />

 

2.JSP指令:<%@ include%><%@   %>

    以「<%@ 」 開始,以「%> 」 結束。好比:

    <%@ include file = " Filename" %>

3.JSP輸出表達式:<%= %><%=Java表達式 %>

    輸出變量的值,後邊不能加<%= ; %>

4.JSP Scriptlet【腳本】:<% ;%>  <% Java 代碼 %>

     例子:

    <% Calendar now = Calendar.getInstance(); %>

5.JSP聲明:<%! %> <%! 函數或者方法 %>

   例子:

   <%!

String getHello(String name) {

 return "Hi," + name + "!";

}

   %>

6.迭代標籤:<c:foreach>

   Jstl中的核心標籤(core)

7.JSP註釋:

<!-- 這是註釋,但客戶端能夠查看到 -->

<%-- 這也是註釋,但客戶端不能查看到 --%>

8.el表達式:${}

9.jsp:include動做是在運行時動態包含。

  @include指令是在編譯時包含。

  它們兩個都只能包含本項目的相關文件,不能包含其餘項目的。  

   若是要包含其餘項目的文件可使用c:import

二十4、過濾器

filter的概述:

filter是一個過濾器,用來在請求前和響應後進行數據的處理。

 

filter的生命週期是:

實例化--->初始化(init)-->進行過濾(doFilter)--->銷燬(destroy)-->釋放資源

 一個Filter必須實現javax.servlet.Filter接口

 

 在項目中咱們一般經過filter進行編碼轉換,

 進行安全驗證,進行重複提交的判斷。

 

瞭解(不須要主動說)

filter 至關於 攔截器 至關於Spring AOP

servlet+jsp+javabean+jdbc+filter

<filter>

    <filter-name>encodingFilter</filter-name>

    <filter-class>org.leopard.filter.EncodingFilter</filter-class>

    <init-param>

      <param-name>encode</param-name>

      <param-value>utf-8</param-value>

    </init-param>

  </filter>

  <filter-mapping>

    <filter-name>encodingFilter</filter-name>

    <url-pattern>*</url-pattern>

</filter-mapping>

二十5、攔截器的理解

什麼是攔截器:

攔截器是AOP中的概念,它自己是一段代碼,能夠經過定義「織入點」,來指定攔截器的代碼在「織入點」的先後執行,從而起到攔截的做用

正如上面 Struts2的Reference中講述的,Struts2的Interceptor,其攔截的對象是Action代碼,能夠定義在Action代碼以前或者以後執行攔截器的代碼。

在項目中,咱們常常用來攔截經過非正常程序而進行的訪問

Struts2的攔截器和Servlet過濾器相似。在執行Action的execute方法以前,Struts2會首先執行在struts.xml中引用的攔截器,在執行完全部引用的攔截器的intercept方法後,會執行Action的execute方法。

其中intercept方法是攔截器的核心方法,全部安裝的攔截器都會調用之個方法。在Struts2中已經在struts-default.xml中預約義了一些自帶的攔截器,如timer、params等。若是在<package>標籤中繼承struts-default,則當前package就會自動擁有struts-default.xml中的全部配置。代碼以下:

<package name="demo" extends="struts-default" > ... </package>

  攔截器是Struts2框架的核心,它主要完成解析請求參數、將請求參數賦值給Action屬性、執行數據校驗、文件上傳等工做

     在struts-default.xml中有一個默認的引用,在默認狀況下(也就是<action>中未引用攔截器時)會自動引用一些攔截器。struts2中默認的攔截器是defaultStack.  

  自定義攔截器須要特別注意的是不要忘記引入struts2默認的攔截器。爲了實現某些操做,咱們能夠自定義攔截器,

自定義攔截器有三種方式定義。分別爲實現Interceptor接口,繼承抽象類AbstractInterceptor,繼承MethodFilterInteceptor類。

攔截器在項目中的運用:

同時能夠減輕代碼冗餘,提升重用率。

若是要求用戶密碼、權限等的驗證,就能夠用自定義的攔截器進行密碼驗證和權限限制。對符合的登入者才跳轉到正確頁面。

二十6、Spring融入框架

咱們經過在web.xml中配置ContextLoaderListener這個監聽器也加載

spring的配置文件,從而融入到項目框架中。

二十7、項目的部署方式

一、若是項目單獨部署到tomcat中的時候,應該看tomcat中的server.xml;

二、若是和eclipse結合使用進行項目部署的時候,應該看eclipse裏面的server.xml.

相關文章
相關標籤/搜索