5.1 Servlet 與 Jsp
5.1.1 頁面請求與工做流程
- 用戶經過瀏覽器連接訪問
- 瀏覽器接受請求,發送到相應的服務器
- 服務器接受請求尋找資源
- 服務器返回資源
- 把資源以HTTP的格式響應給客戶端
- 瀏覽器解析展示給用戶看
5.1.2 GET和POST的區別
- GET
-
- GET有大小限制,一般1024Byte
- 連接會看到傳輸的數據,不安全
- POST
-
5.1.3 什麼是Servlet
- Servlet 是採用Java語言編寫的服務器端程序,它運行於Web服務器中的Servlet容器中,其主要功能是提供請求/響應的Web服務模式,能夠生成動態的Web內容,而這正是HTML所不具有的功能。
- 有點
-
- 較好的移植性。
- 執行效率高。
- 功能強大。
- 使用方便。
- 可擴展性強。
- 響應步驟
-
- 1) 用戶經過單擊一個連接來向Servlet發起請求。
- 2) Web服務器接收到該請求後,會把該請求交給相應的容器來處理,當容器發現這是對Servlet發起的請求後,容器此時會建立兩個對象: HttpServletResponse 和HttpServletRequest。
- 3) 容器能夠根據請求消息中的URL消息找到對應的Servlet,而後針對該請求建立一個單獨的線程,同時把第2)步中建立的兩個對象以參數的形式傳遞到新建立的線程中。
- 4) 容器調用Servlet的service( )方法來完成對用戶請求的響應,service( )方法會調用doPost()或doGet()方法來完成具體的響應任務,同時把生成的動態頁面返回給容器。
- 5) 容器把響應消息組裝成HTTP格式返回給客戶端。此時,這個線程運行結束,同時刪除第2)步建立的兩個對象。
- 與CGI相比
-
- CGI每次新建一個進程
- Servlet每次建立一個線程
5.1.5 Servlet的生命週期控制器
- 加載。容器經過類加載器使用Servlet類對應的文件來加載Servlet。
- 建立。經過調用Servlet的構造函數來建立一 個Servlet 實例。
- 初始化。經過調用Servlet的init( )方法來完成初始化工做,這個方法是在Servlet已被建立但向客戶端提供服務以前調用的,須要注意的是,init( )方法只會被調用一次。
- 處理客戶請求。Servlet 一旦被建立後,它就能夠爲客戶端提供服務了。每當有新的客戶請求到來時,容器都會建立--個新的線程來處理該請求,接着會調用Servlet的service()方法來完成客戶端的請求,固然,service()方法會根據請求的method屬性值的不一樣調用決定是調用doGet()方法仍是調用doPost()方法來完成具體的響應。
- 卸載。容器在卸載Servlet以前須要調用destroy( )方法,讓Servlet本身釋放其佔用的系統資源,一旦destroy 方法被調用,容器就不會再向這個Servlet發送任何請求消息了。若是容器須要這個Servlet,那麼就必須從新建立並初始化一個實例。須要注意的是,destroy( )方法只會被調用一次。
5.1.6 JSP
5.1.7 JSP與Servlet
- 相同點
-
- JSP是特殊的Servlet
- JSP最終要轉換成Servlet來運行。
- 不一樣點
-
5.1.8 MVC模式
- Model 模型
- View 視圖
- Controller
- 優勢
-
- 低耦合性
- 高重用性和可適用性
- 較低的生命週期成本
- 部署快速
- 可維護性
- 有利於軟件工程化管理
5.1.9 Servlet中forward 與 redirect 區別
- forward 是跳轉 (推薦)
-
- redirect 是重定向
-
5.1.10 JSP內置對象
5.1.11 request對象主要有哪些方法
5.1.12 JSP有哪些動做
- 6個基本動做
- jsp:include。用來在頁面被請求時引用一個文件。
-
- jsp:useBean。用來尋找或者實例化一個JavaBean。
-
- jsp:setProperty。用來設置已經實例化的Bean對象的屬性。
-
- jsp:forward。用來把請求轉到一個新頁面。
-
- Jsp:plugin。用於在瀏覽器中播放或者顯示一個對象。
-
5.1.13 JSP中include指令與include動做的區別
- 指令
-
- 動做 (更適合JSP)
-
- 其餘差別
-
- 當使用include動做時,在頁面中聲明的變量不可用於另外一文件,除非將變量放置在request、session、 application 做用域中;而在使用include指令時,當前頁面和被包含頁面能夠共享變量。
- 當使用include指令時,新生成的JSP頁面要符合JSP語法要求,應該避免變量名的衝突;而在使用include動做時,不存在變量名衝突問題。
- include指令會修改被包含文件,但不會當即生效,除非修改主頁面或刪除主頁面的類;而include動做修改了被包含的文件,會當即生效。
5.1.14 會話跟蹤技術有哪些
- 四種會話跟蹤技術
-
- page。表明與一個頁面相關的對象和屬性。一個頁面由一個編譯好的JavaServlet類(能夠帶有任何的include指令,可是沒有include動做)表示。這既包括Servlet又包括被編譯成Servlet的JSP頁面。
- request。表明與Web客戶端發送的一一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web組件。
- session。表明與用於某個Web客戶端的一一個用戶體驗相關的對象和屬性,一個Web會話能夠也常常會跨越多個客戶端請求。
- application。 表明與整個Web應用程序相關的對象和屬性,這實質上是跨越多個Web應用程序,包括多個頁面、請求和會話的一個全局做用域。
5.1.15 Web開發中如何指定字符串的編碼
5.1.16 什麼是Ajax
- Ajax (Asynchronous JavaScript and XML,異步JavaScript與XML)
5.1.17 cookie和session有什麼區別
- cookie它是有Web服務器保存在用戶瀏覽器上的小文件,能夠包含用戶的信息。
- session是指用來在客戶端與服務器之間保持狀態的解決方案以及存儲結構。
- 區別
-
- cookie是客戶端的瀏覽器上; session保存在服務器上。
- cookie安全性不夠,客戶端別人能夠輕易查看。 session在服務器端安全。
- cookie性能更好。session保存在服務器上訪問量增大會減少性能。
- cookie單個大小不能超過4KB,大部分瀏覽器最多保存20個cookie, session不存在這樣的問題。
- 用戶登錄信息等重要信息存放在session中,其餘的保存咋cookie中;
5.2 J2EE 與 EJB
5.2.1 什麼書J2EE
- J2EE是Java平臺企業版的簡稱。
-
- 構件
-
- 客戶端構件
-
- Applets
- Application Clients
- 服務器構件
-
- Web構件(Servlet和JSP)
- EJBs兩種
- 服務
-
- 通訊 由容器提供的支持協做構件之間的通訊。
5.2.2 J2EE中經常使用的術語有哪些
- Web服務器
-
- 指駐留在Internet上的計算機程序。
- 主流兩大Web服務器
-
- IIS(Internet Information Services)
- Apache Http Server
- Web容器
-
- Web容器也被叫作Web應用服務器,它是一種服務程序,用來給運行在其中的程序(例如Servlet、JSP等)提供一個運行的環境。
- 常見Web同期
-
- EJB容器
-
- EJB容器是一個服務器端容器。是J2EE應用的業務層的技術標準只要知足J2EE規範的組件就能在EJB容器中運行。這個組件會被高效的管理。
- Applet容器
-
- Applet容器是一個客戶端容器,包含的組件爲Applet。Applet是一種嵌入在瀏覽器中的輕量級的客戶端,Web頁面沒法充分地表現數據或者應用界面是就會啓用它。沒法使用J2EE的更總Service和API。
- Application Client容器
-
- Application Client 容器是一個客戶端容器,包含的組件爲Application Client。相對Applet而言,Application Client是一種較重量級的客戶端,它可以使用J2EE的大多數Service和API。
- JNDI
-
- JNDI全稱爲Java Naming and Directory Interface,譯爲Java命名和目錄接口。它提供了一個目錄系統,並將服務名稱與對象關聯起來,從而使得開發人員在開發過程當中可以使用名稱來訪問對象。經過使用JNDI,一方面實現了快速查找和定位分佈式應用程序的功能,另外一-方面使得程序有了更好的可擴展性。因爲JNDI是獨立於目錄協議的,所以應用還可使用JNDI訪問各類特定的目錄服務,例如輕量級目錄訪問協議( Lightweight Directory Access Protocol, LDAP)、網絡數據服務( Network Data Service, NDS)和域名系統( Domain Name System ,DNS)等。
- JMS
-
- JMS全稱爲Java Message Service,譯爲Java消息服務。它是一個Java平臺中面向消息中間件的API,主要實現各個應用程序之間進行異步通訊,包括建立、發送、接收、讀取消息等。經過使用JMS,可以最大限度地提高消息應用的可移植性。JMS既支持點對的消息通訊,也支持發佈/訂閱式的消息通訊。餘他過遊資的使處出行然↔浙治93新∩國州論關企包來備控
- JTA
-
- JTA全稱爲Java Transaction API,譯爲Java事務服務。它提供各類分佈式事務服務(在多個網絡計算機上進行數據訪問和更新),爲J2EE實現分佈式事務處理提供了重要的支撐。
- JAF
-
- JAF的全稱爲JavaBeans Activation Framework,譯爲JavaBeans激活框架。它是一個專用的數據處理框架,提供了一種統一處理不一樣數據格式的方法。
- RMI
-
- RMI全稱爲Remote Method Invocation,譯爲遠程方法調用,它主要用於遠程調用服務,經過它,能夠像調用本地函數同樣調用另一-臺計算機上運行的程序,而不須要關心遠程計算機所使用的系統或所使用的語言,也就是說,只要知足必定的規範,就能夠實如今不一樣的計算機上進行函數調用。
5.2.3 EJB有哪些不一樣的類別
- EJB是Enterprise JavaBean的簡稱,至關於分佈式組件對象模型( Distributed Component Object Model, DCOM), 它是一種服務器端組件體系結構,用於開發和部署多層的、分佈式的以及面向對象的應用系統的跨平臺體系結構。
- EJB能夠分爲如下3種類型:
-
- Session Bean (會話Bean)
-
- Session Bean用來實現服務器端的業務邏輯,同時協調Bean之間的交互。Session Bean 僅存在於客戶應用與服務器交互的時間段內,Session Bean中的數據是不保存在數據庫中的。根據Session Bean是否有狀態又能夠分爲兩種類型: Stateless Session Bean ( 無狀態的Session Bean)和Stateful Session Bean ( 有狀態的Session Bean)。
- Entity Bean(實體Bean)
-
- Entity Bean主要是資料組件,表明數據庫中的記錄,所以它與數據庫中的數據有着相同的生存週期,也就是說,只要數據庫中的數據存在,Entity bean就一直存在。;此外,Entity Bean還能夠被多個客戶應用共享。Entity 有兩種對數據持久化的處理方式:①CMP ( ContainerManaged Persistence," 容器管理的持續性)。構件的相關數據庫操做由容器自動完成,不須要在bean中編寫數據庫操做的代碼。②BMP ( Bean Managed Persistence, Bean 管理的持續性)。構件的相關數據庫操做由開發人員在代碼中經過JDBC編程來實現。這兩種EntityBean的形態不一樣,可是目的相同,兩者的主要的區別在於維護資料的角色,CMP是由EJB Vontainer來維護,而BMP則是由Bean自行維護資料的一致性。
- Entity Bean- -共有3種狀態: no - state、pooled 和ready。其中,no一state狀態表示Bean實例尚未被建立;pooled狀態表示Bean實例已經被建立,但尚未和一個EJBObject關聯起來; ready狀態表示與EJB Object關聯起來,若斷開關聯,則回到pooled狀態。
- Message Driven. Bean ( 消息驅動Bean)
-
- Message Driver Bean用來處理異步消息,一-般不是由用戶來調用的。它的調用方式爲:當有異步消息發送到某個Message Driver Bean後,容器會負責調用Message Driver Bean的OnMessage( )方法來處理這個異步請求。
5.2.4 EJB與JavaBean有什麼異同
- EJB是基於Java的遠程方法調用( Remote Method Invocation, RMI)技術,能夠被遠程訪問(跨進程、跨計算機),但它必須被部署在Webspere、WebLogic 等容器中。EJB客戶從不直接訪問真正的EJB組件,而是經過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所建立和管理。
- Java Bean是可複用的組件,理論上講,任何一個Java類均可以是一一個Bean。但一般狀況下,因爲Java Bean是被容器(例如Tomcat)所建立的,所以Java Bean應具備一個無參的構造器,另外,一般JavaBean還要實現Serializable接口用於實現Bean的持久性。JavaBean實際上至關於微軟COM模型中的本地進程內COM組件,是不能被跨進程訪問的。
5.2.5 EJB有哪些生命週期
- Stateless Session Bean
-
- No State(無狀態)
- Method Ready(準備方法)
-
- Stateful Session Bean
-
- No State(無狀態)
- Method Ready(準備方法)
- Passivated(頓化)
-
- Entity Bean
-
- No State(無狀態)
- Pooled State(池狀態)
- Method Ready(準備方法)
-
5.2.6 EJB的角色有哪幾種
- EJB將開發部署EJB應用的任務劃分到了6個不一樣的角色,它們分別爲Enterprise Bean Provider (企業級組件開發者)、Application Assembler (應用組合者)、EJB Deployer (EJB部署者)、EJB Server Provider ( EJB服務器提供者)、EJB Container Provider (EJB容器提供者)和System Administrator (系統管理員)。
-
5.2.7 EJB的開發流程是怎樣的
- 3個很是重要的3個對象:Remote接口、Home接口和Bean類。
- 步驟 簡略
-
- 定義Romote接口。
- 編寫一個接口即成javax.ejb.EJBHome。
- 編寫bean類的實現類(SessionBean)。
- 在項目的META-INF目錄中建立兩個文件:ejb-jar.xml和jboss.xml。
- 把上述EJB項目發佈到JBoss容器上後,客戶端就能夠調用該EJB對象了。
5.2.8 EJB3.0與EJB2.0有哪些不一樣之處
- EJB 3.0與EJB 2.0最大的不一樣之處就在於EJB 3.0經過元數據、去掉部署文件、省去對Home接口的使用等方法簡化了開發的工做。此外,在訪問數據庫的方法上也有所不一樣: EJB2.0在訪問數據庫時使用的是Entity Bean,而EJB 3. 0用的是JPA ( Java Persistance API) 。
5.2.9 EJB容器有哪些做用
- 全部RJB否必須運行在EJB容器中,EJB容器是Enterprise JavaBean的擁有者,它負責管理運行在其中的bean。
5.2.10 EJB規範規定EJB中禁止的操做有哪些
- 具體而言,EJB 規範規定EJB中禁止的操做有如下8種:
-
- 不能操做線程和線程API ( 線程API指非線程對象的方法,例如notify、wait 等)。
- 不能操做AWT ( Abstract Windowing Toolkit,抽象窗口工具包)。
- 不能實現服務器功能。
- 不能對靜態屬性存取。
- 不能使用I0操做直接存取文件系統。
- 不能加載本地庫。
- 不能將this做爲變量,不能將this返回。
- 不能循環調用。
5.2.11 Web服務器與Web應用服務器有什麼區別
- Web服務器是能夠向發出請求的瀏覽器提供文檔的程序。
- 應用服務器提供訪問業務員邏輯的途徑以供客戶端應用程序使用。
- Web服務器通常是通用的,而應用古物器通常是專用的,例如Tomcat只是處理Java應用程序。
5.2.12 什麼是Web Service
- Web Service是一種基於網絡的分佈式模塊化組件,它能夠將可調用的功能發佈到Web.上以供應用程序訪問(應用程序可使用標準的Web協議和數據格式來訪問它)。
- 基於的協議
-
- 1)可擴展可標記語言( eXtensible Markup Language, XML)。
- 2)Web服務描述語言( Web Service Description Language, WSDL)。
- 3)通用描述、發現與集成服務( Universal Description ,Discovery and Integration, UDDI)。
- 4)簡單對象存取協議(Simple Object Access Protocol,SOAP)。
-
- Web Service優勢
-
- 無缺的封裝性。
- 鬆耦合。
- 高度客戶操做性。
- 動態性。
5.2.13 SOAP與REST有什麼區別
- SOAP是一個嚴格定義的信息交換協議,用於在Web Service中把遠程調用和返回封裝成機器可讀的格式化數據,SOAP數據使用XML數據格式,定義了一整套複雜的標籤,來描述調用的遠程過程、參數、返回值和出錯信息等內容。
- REST ( Representational State Transfer,表述性狀態轉移)形式上爲客戶端經過申請資源來實現狀態的轉換,能夠被看做一臺虛擬的狀態機。須要注意的是它只是一種軟件架構風格,而不是一個具體的協議或標準,並且,它是面向資源的,甚至連服務也會被抽象成資源。
- SOAP與REST的對比
-
5.2.14 什麼是XML
- 可擴展標記語言
- 優勢
-
- 實用性強。
- 訪問速度快。
- 可擴展性好。
- 跨平臺性好。
- 缺點
-
- XML文檔定義有兩種形式: 用於驗證文檔
-
- 文檔類型定義(Document Type Define,DTD)
- Schema
- 解析兩種方式
-
5.2.15 數據庫鏈接池的工做機制是怎樣的
- 數據庫鏈接池負責分配、管理並釋放數據庫鏈接,它容許應用程序重複使用一個現有的數據庫鏈接,而再也不是從新創建一個新的數據庫鏈接,同時,它還負責釋放空閒時間超過最大空閒時間的數據庫鏈接,避免由於沒有釋放數據庫鏈接而引發的數據庫鏈接遺漏。
5.2.16 J2EE開發有哪些調優的方法
- 優化設計,當心使用繼承,繼承會致使遞歸。
- 儘量使用數據庫鏈接池
- 給Web容器配置合理的線程數量來處理客戶端的HTTP請求。
- 根據實際狀況設置Java虛擬機中堆空間的大小。
- 使用框架(例如Hibernate)來提升系統的效率。
- 把一些常常被訪問的Servlet或JSP緩存起來,可以減小響應時間和提升系統的性能。
- 當在系統中使用EJB時,因爲對EJB的調用是採用對象請求代理(Object Request Broker,ORB)的方式來完成的,而ORB使用了線程來處理對EJB的請求,所以,應該合理配置線程池的大小以便它可以在平均負載和高峯期都能都很好地處理EJB的請求。
- 優化I/O性能。I/O使用不當將會形成資源競爭,下降系統性能。因此,在實際應用時,儘量少使用System.out打印調試信息,推薦使用緩衝。
- 優化查詢。在模型設計時就應考慮冗餘相對不會變化的數據,若是設計大數據量,最好可以考慮分區設計。
- 對session進行合理管理與設置。根據實際狀況對內存中可能存在的session的個數設置一個合適的值。注意:儘可能減小session的大小,以下降其對內存的使用。並且,除非是在必須的狀況下,不然儘可能不要啓用對session的持久化。同時,經過對session設置一個合理的超時時間來回收較長時間不使用的session ,也能夠有效地提升系統的效率。
5.3 框架
表示層(web層)、業務邏輯層(service層)、數據訪問層(dao層)
MVC 模型、視圖、控制器
5.3.1 什麼是Struts框架
- 總體採用MVC設計
- 控制器(Controller) 包括
-
- ActionServlet
- RequestProcessor
-
- Action採用配置器模式
- 優勢
-
- 因爲採用了MVC模式,所以它實現了表現與邏輯的分離,使得系統有較好的可擴展性。同時Struts的標記庫(Taglib)包含了大量的tag,有助於提升系統的開發效率。
- 提供了頁面導航功能,使系統的脈絡更加清晰。經過一一個配置文件創建整個系統各部分之間的聯繫,使有系統結構變得更加清晰,從而加強了系統的可擴展性與可維護性。
- 提供了表單的驗證功能,進-一步加強了系統的健壯性。
- 提供了數據庫鏈接池管理。
- 提供了Exception 處理機制。
- 支持國際化。
- 缺點
-
- Taglib中包含了大量的tag, ,對於初學者而言,開發難度比較大。
- 2Struts 開發中包含了許多XML格式的配置文件。一方面,這些配置文件不易調試;另外一方面,大量的XML文件也不便於管理。
- Struts 只能支持Web應用程序的開發。
- Struts 的Action不是線程安全的,所以Action類用到的全部資源都必須進行同步。
- 單元測試不方便。因爲Action與Web層的緊耦合,致使其很是依賴於Web容器,給單元測試帶來了不便。
- 部署煩瑣。當轉到表示層時,須要配置forward,例如,若是有10個表示層的JSP文件,則須要配置10個Struts。此外,當目錄、文件變動後,須要從新修改forward,並且每次修改配置以後,還須要從新部署整個項目,對於Tomcate等服務器,還必須重啓服務器。
- 對Servlet的依賴性過強。Struts 處理Action時必須要依賴ServletRequest和ServletResponse,擺脫不了對Servlet容器的依賴。
5.3.2 Struts框架響應客戶請求的工做流程是什麼
- 在Struts框架中,控制器主要是ActionServlet,可是對業務邏輯的操做則主要由Action、ActionMapping、ActionForward 等組件協調完成。其中,Action 扮演了真正的控制邏輯實現者的角色,而ActionMapping和ActionForward則指定了不一樣業務邏輯或流程的運行方向。
- 對於採用Struts 框架的Web應用而言,在Web應用啓動時,會加載並初始化ActionServlet, ActionServlet 從struts - config. xml文件中讀取配置信息,並把它們存放到ActionMappings對象中。具體而言,當ActionServlet接收到一個客戶請求時,執行以下流程:
- 1)檢索和用戶請求匹配的ActionMapping實例,若是不存在,就返回用戶請求路徑無效的信息。
- 2)若是ActionForm實例不存在,就建立-一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中。
- 3)根據配置信息決定是否須要表單驗證。若是須要驗證,就調用ActionForm的validate( )方法。
- 4)若是ActionForm的validate( )方法返回null或返回-一個不包含ActionMessge 的ActionErrors對象,就表示表單驗證成功。
- 5) ActionServlet 根據ActionMapping實例包含的映射信息決定將請求轉發給哪一個Action。若是對應的Action 實例不存在,就先建立一個實例,而後調用Action 的execute()方法。
- 6) Action 的execute( )方法返回一個ActionForward對象,ActionServlet 再把客戶請求轉發給ActionForward 對象指向的JSP組件。
- 7) ActionForward 對象指向的JSP組件生成動態頁面,返回給客戶。對於以上流程中的步驟4),若是ActionForm的validate( )方法返回一個(包含一個)或多個ActionMessage的ActionErrors 對象,就表示表單驗證失敗,s此時,ActionServlet 將直接把請求轉發給包含客戶提交表單的JSP組件。在這種狀況下,不會再建立Action對象並調用Action的execute方法了。
5.3.3 Struts框架的數據驗證可分爲幾種類型
- 表單驗證
- 業務邏輯驗證
-
- 業務邏輯驗證由Action處理,若是用戶在表單中輸人的姓名爲「Hehao」,那麼按照本應用的業務規則,不容許輸入「Hehao」,所以將生成業務邏輯錯誤。須要注意的是,在Action裏面完成數據驗證,實際上就是在execute()方法前面增長數據驗證的部分代碼。
5.3.4 Form Bean的表單驗證流程是什麼
- 在Form Bean 的表單驗證主要有如下4個步驟:出米dmothenn/ 用深濟n 15
-
- 1) 用戶提交HTML表單後,Struts框架會自動把表單數據組裝到ActionForm Bean中。
- 2) Struts 框架調用ActionForm Bean的validate( )方法進行表單驗證。
- 3) 若是validate( )方法返回的ActionErrors對象爲null,'或者不包含任何ActionMessage對象,就表示沒有錯誤,數據驗證經過。
- 4) 若是ActionErrors中包含ActionMessage對象,就表示發生了驗證錯誤,Struts 框架會把ActionErrors對象保存到request範圍內,而後把請求轉發到恰當的視圖組件中,視圖組件經過< html : errors >標籤把request範圍內的ActionErrors 對象中包含的錯誤消息顯示出來,提示用戶修改錯誤。
5.3.5 在Struts配置文件中,<action>元素包括哪些屬性和子元素
5.3.6 ActionForm Bean的做用有哪些
- Action通常用於控制業務邏輯的處理,例如增長、刪除、修改、查詢等,ActionForm Bean用於封裝用戶請求的參數。當接收到頁面輸人的數據後,會首先保存在ActionForm Bean中,而後在Action裏面調用邏輯層的代碼來處理這些數據。
- ActionForm Bean 的做用有以下3點:
-
- 1) ActionFormBean本質上也是一種JavaBean,是專門用來傳遞表單數據的數據傳遞對象( DATA Transfer Object, DTO)。 除了具備一些JavaBean的常規方法外,ActionForm Bean 還包含一些特殊的方法,例如用於驗證HTML表單的數據以及將其屬性從新設置爲默認值。
- 2) Struts框架利用ActionFormBean來進行View組件和Controller組件之間表單數據的傳遞。
- 3) Struts框架把View組件接收到的用戶輸人的表單數據保存在ActionFormBean中,而後把它傳遞給Controller組件,Controller 組件能夠對ActionForm Bean中的數據進行修改,JSP 文件使用Struts 標籤讀取修改後的ActionForm Bean的信息,從新設置HTML表單。
5.3.7 ActionForm的執行步驟有哪些
- ActionForm的執行步驟有如下幾點:
-
- 1)檢查Action的映射,肯定Action中是否已經配置了對ActionForm的映射。
- 2)根據name屬性查找FormBean的配置信息。
- 3)檢查Action的Form Bean的使用範圍,肯定在此範圍下是否已經有此Form Bean的實例。假如當前範圍下已經存在此Form Bean的實例,並且對當前請求來講,是同一種類型的話,那麼就重用。不然,就從新構建-一個Form Bean的實例。
- 4) Form Bean的reset( )方法被調用。示< moita >
- 5)調用對應的setter( )方法,對狀態屬性賦值。
- 6)根據validate的屬性選擇調用方法。若是validate 的屬性被設置爲true,那麼就調用Form Bean的validate() 方法。若是validate( )方法沒有返回任何錯誤,控制器將ActionForm做爲參數傳遞給Action實例的execute()方法並執行。
5.3.8 forward與global-forward有什麼區別
5.3.9 Struts如何實現國際化
5.3.10 Struts1與Struts2有哪些區別
5.3.11 什麼是IoC
- 控制反轉(Inverse of Control,IoC),有時也被稱爲依賴注入,是一種下降對象耦合關係的設計思想。
- 上層接口再也不依賴下層接口,由調用者來決定被調用者。對象不會被顯式地調用,而是根據需求經過IoC容器(例如Spring)來提供。
- 優勢:
-
- 1) 經過IoC容器,開發人員不須要關注對象如何被建立的,同時增長新類也很是方便,只須要修改配置文件便可實現對象的「熱插拔」。
- 2) loC 容器能夠經過配置文件來肯定須要注入的實例化對象,所以很是便於進行單元測試。
- 缺點
-
- 1) 對象是經過反射機制實例化出來的,所以會對系統的性能有必定的影響。
- 2) 建立對象的流程變得比較複雜。
5.3.12 什麼是AOP
- 面向切面編程(Aspect-Oriented Programming,AOP)是對面向對象開發的一種補充,它容許開發人員在不改變原來模型的基礎上動態地修改模型以知足新的需求。
- aop配置文件
-
5.3.13 什麼是Spring框架
- Spring是一個J2EE的框架,這個框架提供了對輕量級IoC的良好支持,同時也提供了對AOP技術很是好的封裝。
-
- Spring工做原理圖
-
- 優勢:
-
- 1)在使用J2EE開發多層應用程序時,Spring有效地管理了中間層的代碼,因爲Spring採用了控制反轉和麪向切面編程的思想,所以這些代碼很是容易進行單獨測試。
- 2)使用Spring有助於開發人員培養一個良:好的編程習慣:面向接口編程而不是面向類編程。面向接口編程使得程序有更好的可擴展性。
- 3)Spring對數據的存取提供了一個一致的框架(不管是使用JDBC仍是O/R映射的框架,例如Hibernate或JDO)。
- 4)Spring經過支持不一樣的事務處理API(如JTA、JDBC、Hibermate等)的方法對事務的管理提供了- -致的抽象方法。
- 5)使用Spring框架編寫的大部分業務對象不須要依賴Spring。
5.3.14 什麼是Hibernate
- Hibernate是一個開放源代碼的對象關係映射( Object Relation Mapping,ORM,一種用來完成對象模型到關係模型的映射技術)框架,它不只能夠運行在J2EE容器中,也能夠在J2EE容器外運行。它對JDBC進行了很是輕量級的對象封裝,因此任何可使用JDBC的地方均可以用Hibernate來替代。Hibernate 實現了Java 對象與關係數據庫記錄的映射關係,簡化了開發人員訪問數據庫的流程,極大地提升了軟件的開發效率。
-
-
- Hibernate的使用過程以下:
-
- 1)應用程序經過Configuration類讀取配置文件並建立SessionFactory對象。
-
- SessionF actory sessionFactory = new Configuration( ). configure( ). buildSessionfactory( );
- 2)經過SessionFactory生成-一個Session對象。
-
- Session session = sessionF actory. openSession( ) ;
- 3)經過Session對象的beginTrancation( )方法建立-一個事務。
-
- Transaction t = session. beginTransaction( );
- 接着能夠經過Session 對象的get()、load( )、save( )、update( )、delete( )和saveOrUpdate()等方法實現數據的加載、保存、更新和刪除等操做;也能夠經過session生成-一個Query對象,而後利用Query對象執行查詢操做;最後經過commit( )方法或rollback( )方法完成事務操做。
- 4)在完成全部持久化操做與事務操做後須要關閉Session與SessionFactory。
- 優勢
-
- 1)提升開發效率。
- 2)使得開發能夠徹底採用面向對象的思想,不須要關心數據庫的關係模型。
- 3)使用Hibernate開發的系統有很好的可移植性,能夠很容易地實現不一樣數據庫之間的移植而不須要關係不一樣數據庫SQL語句的差別。
- 4)支持透明持久化,Hibernate 的API沒有侵入性,當保存一個對象時,這個對象不須要繼承Hibernate中的任何類和實現任何接口。雖然如此,但Hibernate只適用於針對單-一對象簡單的增、刪、查、改,而對於批量的修改/刪除的場合,則不適用,這也是OR框架的弱點,因此,當要使用數據庫的特定優化機制時,不適合使用Hibernate。
- 使用Hibernate時如何讓提升性能
-
- 1)延遲加載。當Hiberate從數據庫獲取某一個對象數據、獲取某一個對象的集合屬性值時或者獲取某一個對象所關聯的另外一個對象時,並不會當即從數據庫中把數據加載到對象中,而是經過創建一一個代理對象,把這個對象的屬性都設置爲默認值,只有當這些數據在被使用時纔會從數據庫中去加載對應的數據,使用這種方法有助於提升Hiberate的性能。
- 2)緩存技術。Hibermate 中提供了一級緩存與二級緩存,合理的利用緩存也有助於提升系統的性能,爲了不不合理的利用緩存致使內存的過分消耗下降系統的性能,能夠經過合理配置緩存的參數(例如配置緩存能夠加載數據的個數)來避免這個問題。
- 3)優化查詢語句。經過優化查詢語句來提升系統的性能。
- Hibernate中怎樣實現類之間的關係? (例如一-對多、多對多關係)
-
- 類之間的關係主要體如今表之間的關係,它們都是對對象進行操做,程序中把全部表與類都映射在一塊兒,它們經過配置文件中的many- to -one、one- to- many、many - to- many來進行配置。
5.3.15 什麼是Hibernate的二級緩存
- 一級緩存使用的場合以下:當使用Session查詢數據時,首先會在該Session內部查找該對象是否存在,若存在,則直接返回,不然,就到數據庫中去查詢,並將查詢的結果緩存起來以便後期使用。一級緩存的缺點就是當使用Session來表示一次會話時,它的生命週期較短,並且它是線程不安全的,不能被多個線程共享,所以,在實際使用時,對效率的提高不是很是明顯。
- 鑑於以上緣由,二級緩存的概念被引入了張二級緩存用來爲Hibernate配置-~種全局的緩存,以便實現多個線程與事務共享。在使用了二級緩存機制後,當查詢數據時,會首先在內部緩存中去查找,若是不存在,接着在二級緩存中查找,最後纔去數據庫中查找。
- 二級緩存一-般適用於如下幾種狀況:
-
- 1)數據量較小。若是數據量太大,緩存太多,會消耗大量內存,形成內存資源短缺,從而下降系統的性能。
- 2)對數據的修改較少。若是進行大量的修改,就須要頻繁地對緩存中數據與數據庫中的數據進行同步,而這也會影響系統的性能。
- 3)不會被大量的應用共享的數據。若是數據被大量線程或事務共享,多線程訪問時的同步機制也會影響系統的性能。
- 4)不是很重要的數據。若是查詢的數據很是重要(例如財務數據),對數據的正確性要求很是高,最好不要使用二級緩存。
5.3.16 Hibernate中的session的update()和saveOrUpdate()、load()和get()有什麼區別
- Hibernate的對象有3種狀態,分別爲:瞬時態( Transient)、持久態( Persistent)和脫管態(Detached)。
- saveOrUpdate( )方法同時包含了save( )和update( )方法的功能。Hibernate會根據對象的狀態來肯定是調用save( )方法仍是調用update( )方法:若對象是持久化對象,則不進行任何操做,直接返回;若傳人的對象與session中的另外一一個對象有相同的標識符,則拋出一個異常;若對象的標識符屬性(用來惟一肯定-一個對象)在數據庫中不存在或者是二個臨時值,則調用save()方法把它保存到數據庫中,不然,調用update()方法更新對象的值到數據庫中。鑑於此,在使用時,若能肯定對象的狀態,則最好不要調用saveOrUpdate( )方法,這樣有助於提升效率,例如,若是可以肯定這個對象所對應的值在數據庫中確定不存在,那麼就能夠直接調用save()方法。
- get()方法與load()方法都是用來經過從數據庫中加載所需的數據來建立一個持久化的對象,它們主要有如下幾個不一樣點:
-
- 1)若是數據庫中不存在該對象,load( )方法會拋出一個ObjectNotFoundException異常,而get()方法則會返回null。
- 2) get()方法首先查詢Session內部緩存,若不存在,則接着查詢二級緩存,最後查詢數據庫;而load()方法在建立時會首先查詢Session內部緩存,若是不存在,就建立代理對象,實際使用數據時才查詢二級緩存和數據庫,所以load()方法支持延遲加載(對象中的屬性在使用時纔會加載,而不是在建立對象時就加載全部屬性)。
- 3) get( )方法永遠只返回實體類,而load()方法能夠返回實體類的代理類實例。
- 4)get()方法和find()方法都是直接從數據庫中檢索,而load()方法的執行則比較複雜:首先查找Session的persistent Context中是否有緩存,如有,則直接返回;若沒有,則判斷是不是lazy。若是不是,直接訪問數據庫檢索,查到記錄返回,查不到拋出異常;如果lazy,則須要創建代理對象,對象的initialized屬性爲false, target 屬性爲null。在訪問得到的代理對象的屬性時檢索數據庫,若找到記錄,則把該記錄的對象複製到代理對象的target.上,並將initialized置爲true;若找不到,就拋出異常。
5.3.17 Hibernate有哪些主鍵生成策略
1. increment:適用於short,int,long做爲主鍵.不是使用的數據庫自動增加機制.
* 先進行查詢 :select max(id) from user;
* 再進行插入 :得到最大值+1做爲新的記錄的主鍵.
* 問題:不能在集羣環境下或者有併發訪問的狀況下使用.
2. identity:適用於short,int,long做爲主鍵。可是這個必須使用在有自動增加數據庫中.採用的是數據庫底層的自動增加機制.
* 底層使用的是數據庫的自動增加(auto_increment).像Oracle數據庫沒有自動增加.
3. sequence:適用於short,int,long做爲主鍵.底層使用的是序列的增加方式.
* Oracle數據庫底層沒有自動增加,想自動增加須要使用序列.
4. uuid:適用於char,varchar類型的做爲主鍵.
5. native:本地策略.根據底層的數據庫不一樣,自動選擇適用於該種數據庫的生成策略.(short,int,long)
* 若是底層使用的MySQL數據庫:至關於identity.
* 若是底層使用Oracle數據庫:至關於sequence.
6. assigned:主鍵的生成不用Hibernate管理了.必須手動設置主鍵.
5.3.18如何實現分頁機制
5.3.19 什麼是SSH