Java編程中的框架基礎(chǔ)面試知識(shí)

Java是一種可以撰寫(xiě)跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。Java 技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話(huà)和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開(kāi)發(fā)者專(zhuān)業(yè)社群。

給你java學(xué)習(xí)路線(xiàn):html-css-js-jq-javase-數(shù)據(jù)庫(kù)-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm

spring mvc 工作機(jī)制(原理):

DispatcherServlet主要用作職責(zé)調(diào)度工作,本身主要用于控制流程

小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 六五零,五五四,六零七 】,無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開(kāi)發(fā)工具,很多干貨和技術(shù)資料分享!

1.springmvc將所有的請(qǐng)求都提交給DispatcherServlet,它會(huì)委托應(yīng)用系統(tǒng)的其他模塊負(fù)責(zé)對(duì)請(qǐng)求進(jìn)行真正的處理工作。

2.DispatcherServlet查詢(xún)一個(gè)或多個(gè)HandlerMapping,找到處理請(qǐng)求的Controller.

3.DispatcherServlet將請(qǐng)求提交到目標(biāo)Controller

4.Controller進(jìn)行業(yè)務(wù)邏輯處理后,會(huì)返回一個(gè)ModelAndView

5.DispathcherServlet查詢(xún)一個(gè)或多個(gè)ViewResolver視圖解析器,找到ModelAndView對(duì)象指定的視圖對(duì)象;

6.視圖負(fù)責(zé)將結(jié)果顯示到客戶(hù)端;

視圖對(duì)象負(fù)責(zé)渲染返回給客戶(hù)端。

DispatcherServlet:前端控制器;(相當(dāng)于一個(gè)轉(zhuǎn)發(fā)器,中央處理器,調(diào)度)

ModelAndView:模型和視圖的結(jié)合體;(Spring mvc的底層對(duì)象)

HandlerMapping: 處理器映射器;

Spring mvc運(yùn)行原理

1. 客戶(hù)端請(qǐng)求提交到DispatcherServlet;

2. 由DispatcherServlet控制器查詢(xún)一個(gè)或多HandlerMapping,找到處理請(qǐng)求的Controller;

3. DispatcherServlet將請(qǐng)求提交到Controller;

4. Controller調(diào)用業(yè)務(wù)邏輯處理后,返回ModelAndView;

5. DispatcherServlet查詢(xún)一個(gè)或多個(gè)ViewResoler視圖解析器,找到ModelAndView指定的視圖;

6. 視圖負(fù)責(zé)將結(jié)果顯示到客戶(hù)端;

DispatcherServlet是整個(gè)Spring MVC的核心。它負(fù)責(zé)接收HTTP請(qǐng)求組織協(xié)調(diào)Spring MVC的各個(gè)組成部分。其主要工作有以下三項(xiàng):

1. 截獲符合特定格式的URL請(qǐng)求。

2. 初始化DispatcherServlet上下文對(duì)應(yīng)的WebApplicationContext,并將其與業(yè)務(wù)層、持久化層的WebApplicationContext建立關(guān)聯(lián)。

3. 初始化Spring MVC的各個(gè)組成組件,并裝配到DispatcherServlet中。

Hibernate工作原理及為什么要用?

原理:

1.讀取并解析配置文件

2.讀取并解析映射信息,創(chuàng)建SessionFactory

3.打開(kāi)Sesssion

4.創(chuàng)建事務(wù)

Transation

5. 持久化操作

6.提交事務(wù)

7.關(guān)閉Session

8.關(guān)閉SesstionFactory

為什么要用:

1. 對(duì)JDBC訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪(fǎng)問(wèn)層繁瑣的重復(fù)性代碼。

2. Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn)。他很大程度的簡(jiǎn)化DAO層的編碼工作

3. hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來(lái)實(shí)現(xiàn)透明性。

4. hibernate的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。

Struts工作機(jī)制?為什么要使用Struts?

工作機(jī)制:

Struts的工作流程:

在web應(yīng)用啟動(dòng)時(shí)就會(huì)加載初始化ActionServlet,ActionServlet從

struts-config.xml文件中讀取配置信息,把它們存放到各種配置對(duì)象

當(dāng)ActionServlet接收到一個(gè)客戶(hù)請(qǐng)求時(shí),將執(zhí)行如下流程.

(1)檢索和用戶(hù)請(qǐng)求匹配的Action Mapping實(shí)例,如果不存在,就返 回請(qǐng)求路徑無(wú)效信息;

(2)如果Action Form實(shí)例不存在,就創(chuàng)建一個(gè)Action Form對(duì)象,把客戶(hù)提交的表單數(shù)據(jù)保存到Action Form對(duì)象中;

(3)根據(jù)配置信息決定是否需要表單驗(yàn)證.如果需要驗(yàn)證,就調(diào)用Action Form的validate()方法;

(4)如果Action Form的validate()方法返回null或返回一個(gè)不包含Action Message的 ActuibErrors對(duì)象,就表示表單驗(yàn)證成功;

(5)Action Servlet 根據(jù)Action Mapping所包含的映射信息決定將請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè)Action,如果相應(yīng)的Action實(shí)例不存在,就先創(chuàng)建這個(gè)實(shí)例,然后調(diào)用Action的execute()方法;

(6)Action的execute()方法返回一個(gè)Action Forward對(duì),象,Action Servlet在把客戶(hù)請(qǐng)求轉(zhuǎn)發(fā)給 Action Forward對(duì)象指向的JSP組件;

(7)Action Forward對(duì)象指向JSP組件生成動(dòng)態(tài)網(wǎng)頁(yè),返回給客戶(hù);

為什么要用:

JSP、Servlet,JavaBean技術(shù)的出現(xiàn)給我們構(gòu)建強(qiáng)大的企業(yè)應(yīng)用系統(tǒng)提供了可能。但用這些技術(shù)構(gòu)建的系統(tǒng)非常的繁亂,所以在此之上,我們需要一個(gè)規(guī)則、一個(gè)把這些技術(shù)組織起來(lái)的規(guī)則,這就是框架,Struts便應(yīng)運(yùn)而生。

基于Struts開(kāi)發(fā)的應(yīng)用由3類(lèi)組件構(gòu)成:控制器組件、模型組件、視圖組件

如何優(yōu)化Hibernate?

1. 使用雙向一對(duì)多關(guān)聯(lián),不使用單向一對(duì)多

2.靈活使用單向一對(duì)多關(guān)聯(lián)

3.不用一對(duì)一,用多對(duì)一取代

4.配置對(duì)象緩存,不使用集合緩存

5.一對(duì)多集合使用Bag,多對(duì)多集合使用Set

6.繼承類(lèi)使用顯式多態(tài)

7.表字段要少,表關(guān)聯(lián)不要怕多,有二級(jí)緩存撐腰

Spring工作原理

Spring 已經(jīng)用過(guò)一段時(shí)間了,感覺(jué)Spring是個(gè)很不錯(cuò)的框架。內(nèi)部最核心的就是IOC了,動(dòng)態(tài)注入,讓一個(gè)對(duì)象的創(chuàng)建不用new了,可以自動(dòng)的生產(chǎn),這其實(shí)就是利用java里的反射,反射其實(shí)就是在運(yùn)行時(shí)動(dòng)態(tài)的去創(chuàng)建、調(diào)用對(duì)象,Spring就是在運(yùn)行時(shí),跟xml Spring的配置文件來(lái)動(dòng)態(tài)的創(chuàng)建對(duì)象,和調(diào)用對(duì)象里的方法的 。

Spring還有一個(gè)核心就是AOP這個(gè)就是面向切面編程,可以為某一類(lèi)對(duì)象 進(jìn)行監(jiān)督和控制(也就是在調(diào)用這類(lèi)對(duì)象的具體方法的前后去調(diào)用你指定的 模塊)從而達(dá)到對(duì)一個(gè)模塊擴(kuò)充的功能。這些都是通過(guò)配置類(lèi)達(dá)到的。

Spring目的:就是讓對(duì)象與對(duì)象(模塊與模塊)之間的關(guān)系沒(méi)有通過(guò)代碼來(lái)關(guān)聯(lián),都是通過(guò)配置類(lèi)說(shuō)明管理的(Spring根據(jù)這些配置 內(nèi)部通過(guò)反射去動(dòng)態(tài)的組裝對(duì)象)

Struts2 框架本身大致可以分為3個(gè)部分:

核心控制器FilterDispatcher、業(yè)務(wù)控制器Action和用戶(hù)實(shí)現(xiàn)的企業(yè)業(yè)務(wù)邏輯組件。

核心控制器FilterDispatcher是Struts 2框架的基礎(chǔ),包含了框架內(nèi)部的控制流程和處理機(jī)制。

業(yè)務(wù)控制器Action和業(yè)務(wù)邏輯組件是需要用戶(hù)來(lái)自己實(shí)現(xiàn)的。

用戶(hù)在開(kāi)發(fā)Action和業(yè)務(wù)邏輯組件的同時(shí),還需要編寫(xiě)相關(guān)的配置文件,供核心控制器FilterDispatcher來(lái)使用。

Struts 2 的工作流程相對(duì)于 Struts1 要簡(jiǎn)單,與WebWork框架基本相同,所以說(shuō)Struts 2是WebWork的升級(jí)版本。

基本簡(jiǎn)要流程如下:

1.客戶(hù)端初始化一個(gè)指向Servlet容器的請(qǐng)求;

2.這個(gè)請(qǐng)求經(jīng)過(guò)一系列的過(guò)濾器(Filter)(這些過(guò)濾器中有一個(gè)叫做ActionContextCleanUp的可選過(guò)濾器, 這個(gè)過(guò)濾器對(duì)于Struts2和其他框架的集成很有幫助,例如:SiteMesh?Plugin)

3.接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢(xún)問(wèn)ActionMapper來(lái)決定這個(gè)請(qǐng)求是否需要調(diào)用某個(gè)Action;

4、如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy;

5、ActionProxy通過(guò)Configuration Manager(配置管理器)詢(xún)問(wèn)框架的配置文件,找到需要調(diào)用的Action類(lèi);

6、ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。

7、ActionInvocation實(shí)例使用命名模式來(lái)調(diào)用,在調(diào)用Action的過(guò)程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。

8、一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。

返回結(jié)果通常是(但不總是,也可?能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。

在表示的過(guò)程中可以使用Struts2?框架中繼承的標(biāo)簽。在這個(gè)過(guò)程中需要涉及到ActionMapper;

9.響應(yīng)的返回是通過(guò)我們?cè)趙eb.xml中配置的過(guò)濾器;

10、如果ActionContextCleanUp是當(dāng)前使用的,則FilterDispatecher將不會(huì)清理sreadlocal?ActionContext;

如果ActionContextCleanUp不使用,則將會(huì)去清理

2、說(shuō)下Struts的設(shè)計(jì)模式

MVC模式:web應(yīng)用程序啟動(dòng)時(shí)就會(huì)加載并初始化ActionServler。用戶(hù)提交表單時(shí),一個(gè)配置好的ActionForm對(duì)象被創(chuàng)建,并被填入表單相應(yīng)的數(shù)據(jù),ActionServler根據(jù)Struts-config.xml文件配置好的設(shè)置決定是否需要表單驗(yàn)證,如果需要就調(diào)用ActionForm的Validate()驗(yàn)證后選擇將請(qǐng)求發(fā)送到哪個(gè)Action,如果Action不存在,ActionServlet會(huì)先創(chuàng)建這個(gè)對(duì)象,然后調(diào)用Action的execute()方法。Execute()從ActionForm對(duì)象中獲取數(shù)據(jù),完成業(yè)務(wù)邏輯,返回一個(gè)ActionForward對(duì)象,ActionServlet再把客戶(hù)請(qǐng)求轉(zhuǎn)發(fā)給ActionForward對(duì)象指定的jsp組件,ActionForward對(duì)象指定的jsp生成動(dòng)態(tài)的網(wǎng)頁(yè),返回給客戶(hù)。

3、攔截器和過(guò)濾器的區(qū)別

1、攔截器是基于java反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)的。

2、攔截器不依賴(lài)于servlet容器,過(guò)濾器依賴(lài)于servlet容器。

3、攔截器只能對(duì)Action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有請(qǐng)求起作用。

4、攔截器可以訪(fǎng)問(wèn)Action上下文、值棧里的對(duì)象,而過(guò)濾器不能。

5、在Action的生命周期中,攔截器可以多次調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次。

4、struts1于struts2的比較

1、Action類(lèi):Struts1要求Action類(lèi)繼承一個(gè)抽象基類(lèi)。Struts1的一個(gè)普遍問(wèn)題是使用抽象類(lèi)編程而不是接口。

Struts2 Action類(lèi)可以實(shí)現(xiàn)一個(gè)Action接口,也可實(shí)現(xiàn)其他接口,使可選和定制的服務(wù)成為可能。

Struts2提供一個(gè)ActionSupport基類(lèi)去實(shí)現(xiàn)常用的接口。Action接口不是必須的,任何有execute標(biāo)識(shí)的POJO對(duì)象都可以用作Struts2的Action對(duì)象。

2、線(xiàn)程模式:Struts1 Action是單例模式并且必須是線(xiàn)程安全的,因?yàn)閮H有Action的一個(gè)實(shí)例來(lái)處理所有的請(qǐng)求。

單例策略限制了Struts1 Action能作的事,并且要在開(kāi)發(fā)時(shí)特別小心。Action資源必須是線(xiàn)程安全的或同步的。

Struts2 Action對(duì)象為每一個(gè)請(qǐng)求產(chǎn)生一個(gè)實(shí)例,因此沒(méi)有線(xiàn)程安全問(wèn)題。(實(shí)際上,

servlet容器給每個(gè)請(qǐng)求產(chǎn)生許多可丟棄的對(duì)象,并且不會(huì)導(dǎo)致性能和垃圾回收問(wèn)題)

3、Servlet依賴(lài):

Struts1 Action 依賴(lài)于Servlet API,因?yàn)楫?dāng)一個(gè)Action被調(diào)用時(shí)HttpServletRequest和HttpServletResponse被傳遞給execute方法。

Struts2 Action不依賴(lài)于容器,允許Action脫離容器單獨(dú)被測(cè)試。如果需要,Struts2 Action仍然可以訪(fǎng)問(wèn)初始的request和response。

但是,其他的元素減少或者消除了直接訪(fǎng)問(wèn)HttpServetRequest和HttpServletResponse的必要性。

4、可測(cè)性:

測(cè)試Struts1?Action的一個(gè)主要問(wèn)題是execute方法暴露了servlet?API(這使得測(cè)試要依賴(lài)于容器)。

一個(gè)第三方擴(kuò)展--Struts TestCase--提供了一套Struts1的模擬對(duì)象(來(lái)進(jìn)行測(cè)試)

Struts2 Action可以通過(guò)初始化、設(shè)置屬性、調(diào)用方法來(lái)測(cè)試,“依賴(lài)注入”支持也使測(cè)試更容易。

5、捕獲輸入:

Struts1使用ActionForm對(duì)象捕獲輸入。所有的ActionForm必須繼承一個(gè)基類(lèi)。因?yàn)槠渌鸍avaBean不能用作ActionForm,開(kāi)發(fā)者經(jīng)常創(chuàng)建多余的類(lèi)捕獲輸入。動(dòng)態(tài)Bean(DynaBeans)可以作為創(chuàng)建傳統(tǒng)ActionForm的選擇,但是,

開(kāi)發(fā)者可能是在重新描述(創(chuàng)建)已經(jīng)存在的JavaBean(仍然會(huì)導(dǎo)致有冗余的javabean)。

Struts2直接使用Action屬性作為輸入屬性,消除了對(duì)第二個(gè)輸入對(duì)象的需求。輸入屬性可能是有自己(子)屬性的rich對(duì)象類(lèi)型。

Action屬性能夠通過(guò)web頁(yè)面上的taglibs訪(fǎng)問(wèn)。Struts2也支持ActionForm模式。rich對(duì)象類(lèi)型,包括業(yè)務(wù)對(duì)象,能夠用作輸入/輸出對(duì)象。

這種ModelDriven特性簡(jiǎn)化了taglib對(duì)POJO輸入對(duì)象的引用。

6、表達(dá)式語(yǔ)言:

Struts1整合了JSTL,因此使用JSTL EL。這種EL有基本對(duì)象圖遍歷,但是對(duì)集合和索引屬性的支持很弱。

Struts2可以使用JSTL,但是也支持一個(gè)更強(qiáng)大和靈活的表達(dá)式語(yǔ)言-- "Object Graph Notation Language "(OGNL).

7、綁定值到頁(yè)面(view):

Struts1使用標(biāo)準(zhǔn)JSP機(jī)制把對(duì)象綁定到頁(yè)面中來(lái)訪(fǎng)問(wèn)。

Struts2使用"ValueStack"技術(shù),使taglib能夠訪(fǎng)問(wèn)值而不需要把你的頁(yè)面(view)和對(duì)象綁定起來(lái)。

ValueStack策略允許通過(guò)一系列名稱(chēng)相同但類(lèi)型不同的屬性重用頁(yè)面(view)。

8、類(lèi)型轉(zhuǎn)換:

Struts1 ActionForm屬性通常都是String類(lèi)型。Struts1使用Commons-Beanutils進(jìn)行類(lèi)型轉(zhuǎn)換。每個(gè)類(lèi)一個(gè)轉(zhuǎn)換器,對(duì)每一個(gè)實(shí)例來(lái)說(shuō)是不可配置的。

Struts2使用OGNL進(jìn)行類(lèi)型轉(zhuǎn)換。提供基本和常用對(duì)象的轉(zhuǎn)換器。

9、校驗(yàn):

Struts1支持在ActionForm的validate方法中手動(dòng)校驗(yàn),或者通過(guò)Commons Validator的擴(kuò)展來(lái)校驗(yàn)。

同一個(gè)類(lèi)可以有不同的校驗(yàn)內(nèi)容,但不能校驗(yàn)子對(duì)象。

Struts2支持通過(guò)validate方法和XWork校驗(yàn)框架來(lái)進(jìn)行校驗(yàn)。XWork校驗(yàn)框架使用為屬性類(lèi)類(lèi)型定義的校驗(yàn)和內(nèi)容校驗(yàn),

來(lái)支持chain校驗(yàn)子屬性.

10、Action執(zhí)行的控制:

Struts1支持每一個(gè)模塊有單獨(dú)的Request Processors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。

Struts2支持通過(guò)攔截器堆棧(Interceptor Stacks)為每一個(gè)Action創(chuàng)建不同的生命周期。堆棧能夠根據(jù)需要和不同的Action一起使用。

為什么要使用Struts2

Struts2 是一個(gè)相當(dāng)強(qiáng)大的Java Web開(kāi)源框架,是一個(gè)基于POJO的Action的MVC Web框架。它基于當(dāng)年的Webwork和XWork框架,繼承其優(yōu)點(diǎn),同時(shí)做了相當(dāng)?shù)母倪M(jìn)。

1.Struts2基于MVC架構(gòu),框架結(jié)構(gòu)清晰,開(kāi)發(fā)流程一目了然,開(kāi)發(fā)人員可以很好的掌控開(kāi)發(fā)的過(guò)程。

2.使用OGNL進(jìn)行參數(shù)傳遞。OGNL提供了在Struts2里訪(fǎng)問(wèn)各種作用域中的數(shù)據(jù)的簡(jiǎn)單方式,你可以方便的獲取Request,Attribute,Application,Session,Parameters中的數(shù)據(jù)。大大簡(jiǎn)化了開(kāi)發(fā)人員在獲取這些數(shù)據(jù)時(shí)的代碼量。

(OGNL是Object-Graph Navigation Language的縮寫(xiě),它是一種功能強(qiáng)大的表達(dá)式語(yǔ)言,通過(guò)它簡(jiǎn)單一致的表達(dá)式語(yǔ)法,可以存取對(duì)象的任意屬性,調(diào)用對(duì)象的方法,遍歷整個(gè)對(duì)象的結(jié)構(gòu)圖,實(shí)現(xiàn)字段類(lèi)型轉(zhuǎn)化等功能。它使用相同的表達(dá)式去存取對(duì)象的屬性。)

3.強(qiáng)大的攔截器: Struts2的攔截器是一個(gè)Action級(jí)別的AOP,Struts2中的許多特性都是通過(guò)攔截器來(lái)實(shí)現(xiàn)的,例如異常處理,文件上傳,驗(yàn)證等。攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗(yàn)證,權(quán)限驗(yàn)證等置于攔截器中

以完成一些Java?Web項(xiàng)目中比較通用的功能。在我實(shí)現(xiàn)的的一Web項(xiàng)目中,就是使用Struts2的攔截器來(lái)完成了系統(tǒng)中的權(quán)限驗(yàn)證功能。

4.易于測(cè)試: Struts2的Action都是簡(jiǎn)單的POJO,這樣可以方便的對(duì)Struts2的Action編寫(xiě)測(cè)試用例,大大方便了5Java Web項(xiàng)目的測(cè)試。

5.易于擴(kuò)展的插件機(jī)制在Struts2添加擴(kuò)展是一件愉快而輕松的事情,只需要將所需要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中作一些簡(jiǎn)單的設(shè)置就可以實(shí)現(xiàn)擴(kuò)展;

6.模塊化管理: Struts2已經(jīng)把模塊化作為了體系架構(gòu)中的基本思想,可以通過(guò)三種方法來(lái)將應(yīng)用程序模塊化:將配置信息拆分成多個(gè)文件把自包含的應(yīng)用模塊創(chuàng)建為插件創(chuàng)建新的框架特性,即將與特定應(yīng)用無(wú)關(guān)的新功能組織成插件,以添加到多個(gè)應(yīng)用中去。

7.全局結(jié)果與聲明式異常:

為應(yīng)用程序添加全局的Result,和在配置文件中對(duì)異常進(jìn)行處理,這樣當(dāng)處理過(guò)程中出現(xiàn)指定異常時(shí),可以跳轉(zhuǎn)到特定頁(yè)面。

他的如此之多的優(yōu)點(diǎn),是很多人比較的青睞,與spring ,Hibernate進(jìn)行結(jié)合,組成了現(xiàn)在比較流行的ssh框架,

struts2有哪些優(yōu)點(diǎn)

1.在軟件設(shè)計(jì)上Struts2的應(yīng)用可以不依賴(lài)于Servlet API和struts API。 Struts2的這種設(shè)計(jì)屬于無(wú)侵入式設(shè)計(jì);

2.攔截器,實(shí)現(xiàn)如參數(shù)攔截注入等功能;

3.類(lèi)型轉(zhuǎn)換器,可以把特殊的請(qǐng)求參數(shù)轉(zhuǎn)換成需要的類(lèi)型;

4.多種表現(xiàn)層技術(shù),如:JSP、freeMarker、Velocity等;

5.Struts2的輸入校驗(yàn)可以對(duì)指定某個(gè)方法進(jìn)行校驗(yàn);

6.提供了全局范圍、包范圍和Action范圍的國(guó)際化資源文件管理實(shí)現(xiàn)

struts2是如何啟動(dòng)的?

struts2框架是通過(guò)Filter啟動(dòng)的,即StrutsPrepareAndExecuteFilter,此過(guò)濾器為struts2的核心過(guò)濾器;

StrutsPrepareAndExecuteFilter的init()方法中將會(huì)讀取類(lèi)路徑下默認(rèn)的配置文件struts.xml完成初始化操作。

struts2讀取到struts.xml的內(nèi)容后,是將內(nèi)容封裝進(jìn)javabean對(duì)象然后存放在內(nèi)存中,以后用戶(hù)的每次請(qǐng)求處理將使用內(nèi)存中的數(shù)據(jù),而不是每次請(qǐng)求都讀取struts.xml文件。

struts2框架的核心控制器是什么?它有什么作用?

1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。

2)作用:負(fù)責(zé)攔截由/*指定的所有用戶(hù)請(qǐng)求,當(dāng)用戶(hù)請(qǐng)求到達(dá)時(shí),該Filter會(huì)過(guò)濾用戶(hù)的請(qǐng)求。

默認(rèn)情況下,如果用戶(hù)請(qǐng)求的路徑不帶后綴或者后綴以.action結(jié)尾,這時(shí)請(qǐng)求將被轉(zhuǎn)入struts2框架處理,

否則struts2框架將略過(guò)該請(qǐng)求的處理。 可以通過(guò)常量"struts.action.extension"修改action的后綴,

如:

如果用戶(hù)需要指定多個(gè)請(qǐng)求后綴,則多個(gè)后綴之間以英文逗號(hào)(,)隔開(kāi)。

struts2配置文件的加載順序:

struts.xml ——> struts.properties常量可以在struts.xml或struts.properties中配置,如果在多個(gè)文件中配置了同一個(gè)常量,則后一個(gè)文件中配置的常量值會(huì)覆蓋前面文件中配置的常量值.

struts.xml文件的作用:通知Struts2框架加載對(duì)應(yīng)的Action資源

struts2是如何管理action的?這種管理方式有什么好處?

struts2框架中使用包來(lái)管理Action,包的作用和java中的類(lèi)包是非常類(lèi)似的。

主要用于管理一組業(yè)務(wù)功能相關(guān)的action。在實(shí)際應(yīng)用中,我們應(yīng)該把一組業(yè)務(wù)功能相關(guān)的Action放在同一個(gè)包下。

struts2默認(rèn)能解決get和post提交方式的亂碼問(wèn)題嗎?

不能。struts.i18n.encoding=UTF-8屬性值只能解析POST提交下的亂碼問(wèn)題

ActionContext、ServletContext、pageContext的區(qū)別?

1)ActionContext是當(dāng)前的Action的上下文環(huán)境,通過(guò)ActionContext可以獲取到request、session、ServletContext等與Action有關(guān)的對(duì)象的引用;

2)ServletContext是域?qū)ο螅粋€(gè)web應(yīng)用中只有一個(gè)ServletContext,生命周期伴隨整個(gè)web應(yīng)用;

3)pageContext是JSP中的最重要的一個(gè)內(nèi)置對(duì)象,可以通過(guò)pageContext獲取其他域?qū)ο蟮膽?yīng)用,同時(shí)它是一個(gè)域?qū)ο螅饔梅秶会槍?duì)當(dāng)前頁(yè)面,當(dāng)前頁(yè)面結(jié)束時(shí),pageContext銷(xiāo)毀,生命周期是JSP四個(gè)域?qū)ο笾凶钚〉摹?/p>

==========================================================

小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 六五零,五五四,六零七 】,無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開(kāi)發(fā)工具,很多干貨和技術(shù)資料分享!

Spring 面試題

1. Spring框架有哪些模塊?

Spring框架由七個(gè)模塊組成組成,這7個(gè)模塊(或組件)均可以單獨(dú)存在,也可以與其它一個(gè)或多個(gè)模塊聯(lián)合使用,如下所示:

(1)Spring 核心容器——IoC容器

(2)Spring AOP

(3)Spring ORM

(4)Spring DAO

(5)Spring WEB

(6)Spring上下文(Context)

(7)Spring MVC

2. 為什么要使用Spring框架,它有什么優(yōu)點(diǎn)?

(1)輕量級(jí)的框架

(2)非侵入性的

(3)可以整合其它的框架,比如Struts,Hibernate等

(4)可以提供事務(wù)管理

4.怎么使用Spring配置事務(wù)?

Spring同時(shí)支持編程式事務(wù)策略和聲明式事務(wù)策略,大部分時(shí)候都采用聲明式事務(wù)策略。

聲明式事務(wù)管理的配置方式,通常有以下4種:

(1)使用TransactionProxyFactoryBean為目標(biāo)Bean生成事務(wù)代理的配置。此方式是最傳統(tǒng)、配置文件最臃腫、最難以閱讀的方式。

(2)采用Bean繼承的事務(wù)代理配置方式,比較簡(jiǎn)潔,但依然是增量式配置。

(3)采用BeanNameAutoProxyCreator,根據(jù)Bean Name自動(dòng)生成事務(wù)代理的方式。這是直接利用Spring的AOP框架配置事務(wù)代理的方式,需要對(duì)Spring的AOP框架有所理解。但這種方式避免了增量式配置,效果非常不錯(cuò)。

(4)采用DefaultAdvisorAutoProxyCreator,直接利用Spring的AOP框架配置事務(wù)代理的方式,效果非常不錯(cuò),只是這種配置方式的可讀性不如第3種方式。

5.請(qǐng)你談?wù)凷SH整合

SSH整合:

(1) Struts(表示層)+ Spring(業(yè)務(wù)層)+ Hibernate(持久層)

(2) Struts:Struts是一個(gè)表示層框架,主要作用是界面展示、接收請(qǐng)求和分發(fā)請(qǐng)求。

在MVC框架中,Struts屬于VC層次,負(fù)責(zé)界面表現(xiàn),負(fù)責(zé)MVC關(guān)系的分發(fā)。

(View:沿用JSP,HTTP,F(xiàn)orm,Tag,Resourse;Controller:ActionServlet,struts-config.xml,Action)

(3) Hibernate:

Hibernate是一個(gè)持久層框架,它只負(fù)責(zé)與關(guān)系數(shù)據(jù)庫(kù)的操作。

(4) Spring:Spring是一個(gè)業(yè)務(wù)層框架,是一個(gè)整合的框架,能夠很好地黏合表示層與持久層。

9.Spring里如何定義Hibernate?Mapping?

添加hibernate mapping 文件到WEB-INF目錄下的applicationContext.xml文件中。

10.解釋一下Dependency Injection(DI,依賴(lài)注入)和IoC(Inversion of Control,控制反轉(zhuǎn))

1.依賴(lài)注入DI是一種設(shè)計(jì)模式,通常也稱(chēng)作控制反轉(zhuǎn),盡管在技術(shù)上來(lái)講,依賴(lài)注入是一個(gè)IoC的特殊實(shí)現(xiàn),依賴(lài)注入是指一個(gè)對(duì)象應(yīng)用另外一個(gè)對(duì)象來(lái)提供一種特殊的能力。例如,把一個(gè)數(shù)據(jù)庫(kù)連接以參數(shù)的形式傳到一個(gè)對(duì)象的構(gòu)造函數(shù)里面而不是在那個(gè)對(duì)象內(nèi)部自行創(chuàng)建一個(gè)連接。

2.控制反轉(zhuǎn)和依賴(lài)注入的基本思想就是把類(lèi)的依賴(lài)從類(lèi)內(nèi)部轉(zhuǎn)化到外部以減少依賴(lài)。

3.應(yīng)用控制反轉(zhuǎn),對(duì)象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體,將其所依賴(lài)的對(duì)象的引用,傳遞給它。

也可以說(shuō),依賴(lài)被注入到對(duì)象中。所以,控制反轉(zhuǎn)是,關(guān)于一個(gè)對(duì)象如何獲取它依賴(lài)的對(duì)象的引用,這個(gè)責(zé)任的反轉(zhuǎn)。

13.Spring中的核心類(lèi)有那些,各有什么作用?

BeanFactory:產(chǎn)生一個(gè)新的實(shí)例,可以實(shí)現(xiàn)單例模式。

BeanWrapper:提供統(tǒng)一的get及set方法。

ApplicationContext:提供Spring框架的實(shí)現(xiàn),包括BeanFactory的所有功能。

14.什么是AOP,AOP的作用是什么?

面向切面編程(AOP)提供另外一種角度來(lái)思考程序結(jié)構(gòu),通過(guò)這種方式彌補(bǔ)了面向?qū)ο缶幊?OOP)的不足。

除了類(lèi)(classes)以外,AOP提供了切面。切面對(duì)關(guān)注點(diǎn)進(jìn)行模塊化,例如橫切多個(gè)類(lèi)型和對(duì)象的事務(wù)管理。

Spring的一個(gè)關(guān)鍵的組件就是AOP框架,可以自由選擇是否使用AOP,提供聲明式企業(yè)服務(wù),特別是為了替代EJB聲明式服務(wù)。

最重要的服務(wù)是聲明性事務(wù)管理,這個(gè)服務(wù)建立在Spring的抽象事物管理之上。

允許用戶(hù)實(shí)現(xiàn)自定義切面,用AOP來(lái)完善OOP的使用,可以把Spring AOP看作是對(duì)Spring的一種增強(qiáng).

15.使用Spring有什么好處?

(1)Spring能有效地組織你的中間層對(duì)象,無(wú)論你是否選擇使用了EJB。如果你僅僅使用了Struts或其它的包含了J2EE特有APIs的?framework,你會(huì)發(fā)現(xiàn)Spring關(guān)注了遺留問(wèn)題。

(2)Spring能消除在許多工程上對(duì)Singleton的過(guò)多使用。

(3)Spring能消除使用各種格式的屬性定制文件的需要,在整個(gè)工程中,可通過(guò)一種一致的方法來(lái)進(jìn)行配置。

(4)Spring能通過(guò)接口而不是類(lèi)促進(jìn)好的編程習(xí)慣,減少編程代價(jià)到幾乎為零。

(5)Spring被設(shè)計(jì)為讓使用它創(chuàng)建的應(yīng)用盡可能少的依賴(lài)于它的APIs。在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對(duì)象沒(méi)有依賴(lài)于Spring。

(6)使用Spring構(gòu)建的應(yīng)用程序易于單元測(cè)試。

(7)Spring能使EJB的使用成為一個(gè)實(shí)現(xiàn)選擇,而不是應(yīng)用架構(gòu)的必然選擇。你能選擇用POJOs或local?EJBs來(lái)實(shí)現(xiàn)業(yè)務(wù)接口,卻不會(huì)影響調(diào)用代碼。

(8)Spring幫助你解決許多問(wèn)題而無(wú)需使用EJB。Spring能提供一種EJB的替換物,它們適于許多web應(yīng)用。

例如,Spring能使用AOP提供聲明性事務(wù)而不通過(guò)使用EJB容器,如果你僅僅需要與單個(gè)的數(shù)據(jù)庫(kù)打交道,甚至不需要JTA實(shí)現(xiàn)。

(9)Spring為數(shù)據(jù)存取提供了一致的框架,不論是使用JDBC或O/R?mapping產(chǎn)品(如Hibernate)。

16.什么是Spring,它有什么特點(diǎn)?

Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。

(1)輕量——從大小與開(kāi)銷(xiāo)兩方面而言Spring都是輕量的。完整的Spring框架可以在一個(gè)大小只有1MB多的JAR文件里發(fā)布,并且Spring所需的處理開(kāi)銷(xiāo)也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應(yīng)用中的對(duì)象不依賴(lài)于Spring的特定類(lèi)。

(2)控制反轉(zhuǎn)——Spring通過(guò)一種稱(chēng)作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦合。當(dāng)應(yīng)用了IoC,一個(gè)對(duì)象依賴(lài)的其它對(duì)象會(huì)通過(guò)被動(dòng)的方式傳遞進(jìn)來(lái),而不是這個(gè)對(duì)象自己創(chuàng)建或者查找依賴(lài)對(duì)象。你可以認(rèn)為IoC與JNDI相反——不是對(duì)象從容器中查找依賴(lài),而是容器在對(duì)象初始化時(shí)不等對(duì)象請(qǐng)求就主動(dòng)將依賴(lài)傳遞給它。

(3)面向切面——Spring提供了面向切面編程的豐富支持,允許通過(guò)分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)(例如審計(jì)(auditing)和事務(wù)管理)進(jìn)行內(nèi)聚性的開(kāi)發(fā)。應(yīng)用對(duì)象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已。

它們并不負(fù)責(zé)其它的系統(tǒng)級(jí)關(guān)注點(diǎn),例如日志或事務(wù)支持。

(4)容器——Spring包含并管理應(yīng)用對(duì)象的配置和生命周期,在這個(gè)意義上它是一種容器,你可以配置你的每個(gè)bean如何被創(chuàng)建——基于一個(gè)可配置原型(prototype),你的bean可以創(chuàng)建一個(gè)單獨(dú)的實(shí)例或者每次需要時(shí)都生成一個(gè)新的實(shí)例——以及它們是如何相互關(guān)聯(lián)的。然而,Spring不應(yīng)該被混同于傳統(tǒng)的重量級(jí)的EJB容器,它們經(jīng)常是龐大與笨重的,難以使用。

(5)框架——Spring可以將簡(jiǎn)單的組件配置、組合成為復(fù)雜的應(yīng)用。在Spring中,應(yīng)用對(duì)象被聲明式地組合,典型地是在一個(gè)XML文件里。Spring也提供了很多基礎(chǔ)功能(事務(wù)管理、持久化框架集成等等),將應(yīng)用邏輯的開(kāi)發(fā)留給了你。

比較Hibernate的三種檢索策略?xún)?yōu)缺點(diǎn)?

1.立即檢索:

優(yōu)點(diǎn):對(duì)應(yīng)用程序完全透明,不管對(duì)象處于持久化狀態(tài),還是游離狀態(tài),應(yīng)用程序都可以方便的從一個(gè)對(duì)象導(dǎo)航到與它關(guān)聯(lián)的對(duì)象;

缺點(diǎn):1.select語(yǔ)句太多;2.可能會(huì)加載應(yīng)用程序不需要訪(fǎng)問(wèn)的對(duì)象白白浪費(fèi)許多內(nèi)存空間;

2.延遲檢索:

優(yōu)點(diǎn):由應(yīng)用程序決定需要加載哪些對(duì)象,可以避免可執(zhí)行多余的select語(yǔ)句,以及避免加載應(yīng)用程序不需要訪(fǎng)問(wèn)的對(duì)象。因此能提高檢索性能,并且能節(jié)省內(nèi)存空間;

缺點(diǎn):應(yīng)用程序如果希望訪(fǎng)問(wèn)游離狀態(tài)代理類(lèi)實(shí)例,必須保證他在持久化狀態(tài)時(shí)已經(jīng)被初始化;

3.迫切左外連接檢索

優(yōu)點(diǎn):1對(duì)應(yīng)用程序完全透明,不管對(duì)象處于持久化狀態(tài),還是游離狀態(tài),應(yīng)用程序都可以方便地沖一個(gè)對(duì)象導(dǎo)航到與它關(guān)聯(lián)的對(duì)象。

2.使用了外連接,select語(yǔ)句數(shù)目少;

缺點(diǎn):1.可能會(huì)加載應(yīng)用程序不需要訪(fǎng)問(wèn)的對(duì)象,白白浪費(fèi)許多內(nèi)存空間; 2復(fù)雜的數(shù)據(jù)庫(kù)表連接也會(huì)影響檢索性能;

hibernate里面的sorted collection 和ordered collection有什么區(qū)別

sorted collection是在內(nèi)存中通過(guò)java比較器進(jìn)行排序的

ordered collection是在數(shù)據(jù)庫(kù)中通過(guò)order by進(jìn)行排序的

==========================================

spring hibernate struts的筆試面試題

2.Hibernate是如何延遲加載?

1.Hibernate2延遲加載實(shí)現(xiàn):a)實(shí)體對(duì)象 b)集合(Collection)

2.Hibernate3 提供了屬性的延遲加載功能,當(dāng)Hibernate在查詢(xún)數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒(méi)有存在與內(nèi)存中,當(dāng)程序真正對(duì)數(shù)據(jù)的操作時(shí),對(duì)象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開(kāi)銷(xiāo),從而提高了服務(wù)器的性能。

3.Hibernate中怎樣實(shí)現(xiàn)類(lèi)之間的關(guān)系?(如:一對(duì)多、多對(duì)多的關(guān)系)類(lèi)與類(lèi)之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進(jìn)行操作,它們都是對(duì)對(duì)象進(jìn)行操作,我們程序中把所有的表與類(lèi)都映射在一起,它們通過(guò)配置文件中的many-to-one、one-to-many、many-to-many、

4.說(shuō)下Hibernate的緩存機(jī)制

1.內(nèi)部緩存存在Hibernate中又叫一級(jí)緩存,屬于應(yīng)用事物級(jí)緩存;

2.二級(jí)緩存:

a)應(yīng)用及緩存;

b)分布式緩存;

條件:數(shù)據(jù)不會(huì)被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非關(guān)鍵數(shù)據(jù);

c)第三方緩存的實(shí)現(xiàn);

6.如何優(yōu)化Hibernate?

1.使用雙向一對(duì)多關(guān)聯(lián),不使用單向一對(duì)多;

2.靈活使用單向一對(duì)多關(guān)聯(lián);

3.不用一對(duì)一,用多對(duì)一取代;

4.配置對(duì)象緩存,不使用集合緩存;

5.一對(duì)多集合使用Bag,多對(duì)多集合使用Set;

6.繼承類(lèi)使用顯式多態(tài);

7.表字段要少,表關(guān)聯(lián)不要怕多,有二級(jí)緩存撐腰 ;

7.Struts工作機(jī)制?為什么要使用Struts?

工作機(jī)制:Struts的工作流程: 在web應(yīng)用啟動(dòng)時(shí)就會(huì)加載初始化ActionServlet,ActionServlet從?struts-config.xml文件中讀取配置信息,把它們存放到各種配置對(duì)象 當(dāng)ActionServlet接收到一個(gè)客戶(hù)請(qǐng)求時(shí),將執(zhí)行如下流程;

-(1)檢索和用戶(hù)請(qǐng)求匹配的ActionMapping實(shí)例,如果不存在,就返回請(qǐng)求路徑無(wú)效信息;

-(2)如果ActionForm實(shí)例不存在,就創(chuàng)建一個(gè)ActionForm對(duì)象,把客戶(hù)提交的表單數(shù)據(jù)保存到ActionForm對(duì)象中;

-(3)根據(jù)配置信息決定是否需要表單驗(yàn)證.如果需要驗(yàn)證,就調(diào)用ActionForm的validate()方法;

-(4)如果ActionForm的validate()方法返回null或返回一個(gè)不包含ActionMessage的ActuibErrors對(duì)象, 就表示表單驗(yàn)證成功;

-(5)ActionServlet根據(jù)ActionMapping所包含的映射信息決定將請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè)Action,如果相應(yīng)的Action實(shí)例不存在,就先創(chuàng)建這個(gè)實(shí)例,然后調(diào)用Action的execute()方法;

-(6)Action的execute()方法返回一個(gè)ActionForward對(duì)象,ActionServlet在把客戶(hù)請(qǐng)求轉(zhuǎn)發(fā)給?ActionForward對(duì)象指向的JSP組件;

-(7)ActionForward對(duì)象指向JSP組件生成動(dòng)態(tài)網(wǎng)頁(yè),返回給客戶(hù);

=================================================

hibernate 面試題小集

3.說(shuō)說(shuō)Hibernate中的update()和saveOrUpdate()的區(qū)別,session的load()和get()的區(qū)別。

saveOrUpdate()方法可以實(shí)現(xiàn)update()的功能,但會(huì)多些步驟,具體如下:

如果對(duì)象在該session中已經(jīng)被持久化,不進(jìn)行操作;對(duì)象的標(biāo)識(shí)符屬性(identifier property)在數(shù)據(jù)庫(kù)中不存在或者是個(gè)暫時(shí)的值,調(diào)用save()方法保存它;如果session中的另一個(gè)對(duì)象有相同的標(biāo)識(shí)符拋出一個(gè)異常;以上皆不符合則調(diào)用update()更新之。

Session.load/get方法均可以根據(jù)指定的實(shí)體類(lèi)和id從數(shù)據(jù)庫(kù)讀取記錄,并返回與之對(duì)應(yīng)的實(shí)體對(duì)象。

session的get()和load()其區(qū)別在于:

如果未能發(fā)現(xiàn)符合條件的記錄,get方法返回null,而load方法會(huì)拋出一個(gè)ObjectNotFoundException;

load方法可返回實(shí)體的代理類(lèi)實(shí)例,而get方法永遠(yuǎn)直接返回實(shí)體類(lèi);load方法可以充分利用內(nèi)部緩存和二級(jí)緩存中的現(xiàn)有數(shù)據(jù),而get方法則僅僅在內(nèi)部緩存中進(jìn)行數(shù)據(jù)查找,如沒(méi)有發(fā)現(xiàn)對(duì)應(yīng)數(shù)據(jù),將越過(guò)二級(jí)緩存,直接調(diào)用SQL完成數(shù)據(jù)讀取。

hibernate中對(duì)象的三種狀態(tài)?

瞬時(shí)態(tài)(Transient)、持久態(tài)(Persistent)、脫管態(tài)(Detached)。

處于持久態(tài)的對(duì)象也稱(chēng)為PO(Persistence Object),瞬時(shí)對(duì)象和脫管對(duì)象也稱(chēng)為VO(Value Object)。

瞬時(shí)態(tài):

由new命令開(kāi)辟內(nèi)存空間的java對(duì)象, eg. Person person =new Person(”amigo”, “女”);

如果沒(méi)有變量對(duì)該對(duì)象進(jìn)行引用,它將被java虛擬機(jī)回收。

瞬時(shí)對(duì)象在內(nèi)存孤立存在,它是攜帶信息的載體,不和數(shù)據(jù)庫(kù)的數(shù)據(jù)有任何關(guān)聯(lián)關(guān)系,在Hibernate中,可通過(guò)session的save()或 saveOrUpdate()方法將瞬時(shí)對(duì)象與數(shù)據(jù)庫(kù)相關(guān)聯(lián),并將數(shù)據(jù)對(duì)應(yīng)的插入數(shù)據(jù)庫(kù)中,

此時(shí)該瞬時(shí)對(duì)象轉(zhuǎn)變成持久化對(duì)象。

持久態(tài):

處于該狀態(tài)的對(duì)象在數(shù)據(jù)庫(kù)中具有對(duì)應(yīng)的記錄,并擁有一個(gè)持久化標(biāo)識(shí)。如果是用hibernate的delete()方法,對(duì)應(yīng)的持久對(duì)象就變成瞬時(shí)對(duì)象,因數(shù)據(jù)庫(kù)中的對(duì)應(yīng)數(shù)據(jù)已被刪除,該對(duì)象不再與數(shù)據(jù)庫(kù)的記錄關(guān)聯(lián)。

當(dāng)一個(gè)session執(zhí)行close()或clear()、evict()之后,持久對(duì)象變成脫管對(duì)象,此時(shí)持久對(duì)象會(huì)變成脫管對(duì)象,此時(shí)該對(duì)象雖然具有數(shù)據(jù)庫(kù)識(shí)別值,但它已不在HIbernate持久層的管理之下。

持久對(duì)象具有如下特點(diǎn):1.和session實(shí)例關(guān)聯(lián);

2.在數(shù)據(jù)庫(kù)中有與之關(guān)聯(lián)的記錄。

脫管態(tài):

當(dāng)與某持久對(duì)象關(guān)聯(lián)的session被關(guān)閉后,該持久對(duì)象轉(zhuǎn)變?yōu)槊摴軐?duì)象。當(dāng)脫管對(duì)象被重新關(guān)聯(lián)到session上時(shí),并再次轉(zhuǎn)變成持久對(duì)象。

脫管對(duì)象擁有數(shù)據(jù)庫(kù)的識(shí)別值,可通過(guò)update()、saveOrUpdate()等方法,轉(zhuǎn)變成持久對(duì)象。

脫管對(duì)象具有如下特點(diǎn):1.本質(zhì)上與瞬時(shí)對(duì)象相同,在沒(méi)有任何變量引用它時(shí),JVM會(huì)在適當(dāng)?shù)臅r(shí)候?qū)⑺厥眨?/p>

2.比瞬時(shí)對(duì)象多了一個(gè)數(shù)據(jù)庫(kù)記錄標(biāo)識(shí)值。

1.在數(shù)據(jù)庫(kù)中條件查詢(xún)速度很慢的時(shí)候,如何優(yōu)化?

1.建索引;

2.減少表之間的關(guān)聯(lián);

3.優(yōu)化sql,盡量讓sql很快定位數(shù)據(jù),不要讓sql做全表查詢(xún),應(yīng)該走索引,把數(shù)據(jù)量大的表排在前面;

4.簡(jiǎn)化查詢(xún)字段,沒(méi)用的字段不要,已經(jīng)對(duì)返回結(jié)果的控制,盡量返回少量數(shù)據(jù);

===============================

spring面試題

1、簡(jiǎn)述你對(duì)IoC(Inversion?of?Control)的理解,描述一下Spring中實(shí)現(xiàn)DI(Dependency?Injection)的幾種方式。

spring的IOC有三種注入方式:

第一是根據(jù)屬性注入也叫set方法注入;

第二種是根據(jù)構(gòu)造方法進(jìn)行注入;

第三種是根據(jù)注解進(jìn)行注入,這種方式我認(rèn)為比較好,方便,要是bean多的話(huà),使用前兩種方式會(huì)使得配置文件過(guò)于臃腫。

3、簡(jiǎn)單描述Spring?Framework與Struts的不同之處,整合Spring與Struts有哪些方法,哪種最好,為什么?

答、Spring是完整的一站式框架,而Struts僅是MVC框架,且著重于MVC中的C。

Spring有三種方式整合

Struts:使用Spring的ActionSupport類(lèi)整合Struts;

使用Spring的DelegatingRequestProcessor覆蓋Struts的RequestProcessor;

將Struts Action 管理委托給Spring框架,動(dòng)作委托最好。

4、Hibernate中的update()和saveOrUpdate()的區(qū)別?

答、saveOrUpdate()方法可以實(shí)現(xiàn)update()的功能,但會(huì)多些步驟,具體如下:

1. 如果對(duì)象在該session中已經(jīng)被持久化,不進(jìn)行操作;

2. 對(duì)象的標(biāo)識(shí)符屬性(identifier?property)在數(shù)據(jù)庫(kù)中不存在或者是個(gè)暫時(shí)的值,調(diào)用save()方法保存它;

3.如果session中的另一個(gè)對(duì)象有相同的標(biāo)識(shí)符拋出一個(gè)異常;?以上皆不符合則調(diào)用update()更新之。

struts2的原理

一 工作原理:

在Struts2框架中的處理大概分為以下幾個(gè)步驟 :

1.?客戶(hù)端初始化一個(gè)指向Servlet容器(例如Tomcat)的請(qǐng)求

2.這個(gè)請(qǐng)求經(jīng)過(guò)一系列的過(guò)濾器(Filter)(這些過(guò)濾器中有一個(gè)叫做ActionContextCleanUp的可選過(guò)濾器,這個(gè)過(guò)濾器對(duì)于Struts2和其他框架的集成很有幫助,iteMesh Plugin)

3.接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢(xún)問(wèn)ActionMapper來(lái)決定這個(gè)請(qǐng)是否需要調(diào)用某個(gè)Action

4.如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy(潑若科c)

5?.ActionProxy通過(guò)Configuration Manager(康飛科潤(rùn)熊Manager)詢(xún)問(wèn)框架的配置文件,找到需要調(diào)用的Action類(lèi)

.ActionProxy創(chuàng)建一個(gè)ActionInvocation(Action印則k熊)的實(shí)例。

7?.ActionInvocation實(shí)例使用命名模式來(lái)調(diào)用,在調(diào)用Action的過(guò)程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。

8?.一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可 能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過(guò)程中可以使用Struts2 框架中繼承的標(biāo)簽。在這個(gè)過(guò)程中需要涉及到ActionMapper

struts2工作流程:

1、客戶(hù)端瀏覽器發(fā)出HTTP請(qǐng)求.

2、根據(jù)web.xml配置,該請(qǐng)求被FilterDispatcher接收

3、根據(jù)struts.xml配置,找到需要調(diào)用的Action類(lèi)和方法, 并通過(guò)IoC方式,將值注入給Aciton

4、Action調(diào)用業(yè)務(wù)邏輯組件處理業(yè)務(wù)邏輯,這一步包含表單驗(yàn)證。

5、Action執(zhí)行完畢,根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果result,并跳轉(zhuǎn)到相應(yīng)頁(yè)面

6、返回HTTP響應(yīng)到客戶(hù)端瀏覽器

JSP的運(yùn)行原理

小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 六五零,五五四,六零七 】,無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開(kāi)發(fā)工具,很多干貨和技術(shù)資料分享!

WEB容器(Servlet引擎)接收到以.jsp為擴(kuò)展名的URL的訪(fǎng)問(wèn)請(qǐng)求時(shí),它將把該訪(fǎng)問(wèn)請(qǐng)求交給JSP引擎去處理。Tomcat中的JSP引擎就是一個(gè)Servlet程序,它負(fù)責(zé)解釋和執(zhí)行JSP頁(yè)面。

每個(gè)JSP 頁(yè)面在第一次被訪(fǎng)問(wèn)時(shí),JSP引擎將它翻譯成一個(gè)Servlet源程序,接著再把這個(gè)Servlet源程序編譯成Servlet的class類(lèi)文件,然后再由WEB容器(Servlet引擎)像調(diào)用普通Servlet程序一樣的方式來(lái)裝載和解釋執(zhí)行這個(gè)由JSP頁(yè)面翻譯成的Servlet程序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,196評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,688評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,654評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,456評(píng)論 6 406
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,955評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,195評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,725評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,608評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,802評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,048評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,422評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,673評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,424評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,762評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容