框架系統(tǒng)

IOC 控制反轉容器控制程序對象之間的關系,而不是傳統(tǒng)實現(xiàn)中,有程序代碼之間控制,又名依賴注入。All 類的創(chuàng)建,銷毀都由Spring 來控制,也就是說控制對象生命周期的不是引用他的對象,而是Spring。對于某個對象而言,以前是他控制其他對象,現(xiàn)在是all 對象都被spring 控制,這就叫控制反轉。

依賴注入的思想時通過反射機制實現(xiàn)的。在實例化一個類時,它通過反射調用類中的set

方法將事先保存在hashmap 中的類屬性注入到類中。

Spring 實現(xiàn)aop:JDK 動態(tài)代理,cglib 動態(tài)代理。

JDK 動態(tài)代理:其代理對象必須是某個接口的實現(xiàn),他是通過在運行期間創(chuàng)建一個接口的實現(xiàn)類來完成對目標對象的代理。核心類有:InnovactionHandler,Proxy。

Cgib 動態(tài)代理:實現(xiàn)原理類似于jdk 動態(tài)代理,只是他在運行期間生成的代理對象是針對目標類擴展的子類。MethodInterceptor。


Get、post、head、delete、put、options、trace、connect。

MVC M:model entity 業(yè)務邏輯V:view 視圖,用戶看到并與之交互的界面C:controller 根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示和更新model 對象狀態(tài)功能模塊和顯示模塊分離,提高可維護性,可復用性,可擴展性。

Hibernat?可以理解為一個中間件,他負責把java?程序的sql?語句接受過來并發(fā)送到數(shù)據(jù)庫,而數(shù)據(jù)庫返回來的信息由hibernate?接收后直接生成一個對象傳給java。Hibernate?有1)一個配置文件cfg.xml,包括基本配置信息,比如數(shù)據(jù)庫的操作,username,password,url,

driver 和format sql 和方言;2)還有一個映射文件hbm.xml 對數(shù)據(jù)控中表的映射。

Hibernate?一級緩存是必要的,位于session?部分,二級緩存則不是必須的,是由

sessionfactory???????控制的進程級緩存,由開發(fā)人員自行指定。二級緩存可指定使用何種開源的

cache 工具。Hibernate3 以后的默認版本為Ehcache。查詢時間緩存的過程1)查詢一級緩存中是否有需要的額數(shù)據(jù)2)若沒有,則查二級緩存3)若二級緩存中也沒有,此時再執(zhí)行查詢數(shù)據(jù)庫的操作。速度:一級>二級>數(shù)據(jù)庫。

Hibernate?也會自行維護緩存中的數(shù)據(jù),以保證緩存中的數(shù)據(jù)和數(shù)據(jù)庫中的真實數(shù)據(jù)的一致性。無論如何,當你調用方法or?獲取一個對象時,該對象都將被加入到session?的內部緩存中,當flush()方法最后被調用時,對象的狀態(tài)會和數(shù)據(jù)庫同步。也就是說。刪除、更新、增加數(shù)據(jù)的時候,同時更新緩存。

Session 接口:復制執(zhí)行被持久化對象的CRUD 操作(CRUD 的任務是完成與數(shù)據(jù)庫的交流,包含很多的sql 語句)session 對象是非線程安全的。

Sessionfactory 接口:復制初始化hibernate,復制創(chuàng)建session 對象,他并不是輕量級的。通常一個項目,一個sessionfactory 對象。當需要操作多個數(shù)據(jù)庫時,一個數(shù)據(jù)庫,一個

sessionfactory。

Transaction 接口:與事務有關。

Query,criteria 接口:復制執(zhí)行各種數(shù)據(jù)庫查詢,可使用sql 和hql。


Hibernate 的主鍵1)assign:由程序生成主鍵,且要在save()之前,否則拋出異常,特點是主鍵的生成值,完全由用戶決定,與底層數(shù)據(jù)庫無關。用戶需要維護主鍵值,在調用

session.save()之前指定主鍵值。2)hilo:使用高低算法生成主鍵值,該方法需要額外的數(shù)據(jù)表和字段提供高位值來源,默認,使用表hibernate-unique-key。默認字段為next-hilo。特點:能保證同一個數(shù)據(jù)庫主鍵的唯一性,但不能保證多個數(shù)據(jù)庫中主鍵的唯一性。Hilo?與底層數(shù)據(jù)庫無關,由hibernate?維護。3)increament:由hibernate?從數(shù)據(jù)庫中取出主鍵的最大值,以該值為基礎,每次增量為1,在內存中生成主鍵,不依賴于DB。4)sequence:采用數(shù)據(jù)庫提供的sequence?機制生成主鍵,需要數(shù)據(jù)庫支sequence,比如oracle,db2。Mysql?不支持。5)identity:由底層數(shù)據(jù)庫生成標識符,identity?是有數(shù)據(jù)庫自己生成的,但這個主鍵必須設置為自增長。使用identity?前提是數(shù)據(jù)庫支持自動類型增長字段類型。比如:db2,mysql,sql?server。Oracle?不支持。6)native:由hibernate?根據(jù)使用的數(shù)據(jù)庫,自行判斷采用hilo,

sequence,identity,其中一種作為主鍵生成方式。比如mysql?是identity,oracle?是sequence。


Hibernate???查詢數(shù)據(jù)的方式:sql;query、criteria,以對象的方式添加查詢條件;sql,直接使用sql 語句操作數(shù)據(jù)庫。


JDBC?中,鏈接操作是是由Driver?Manager?管理,JDBC?建立和關閉時及其耗資源的,

connection??接口實現(xiàn)鏈接數(shù)據(jù)庫。JDBC??鏈接數(shù)據(jù)庫分為4??部:1?)加載驅動?

Class.forName(“con.mysql.jdbc.Driver”);2 ?????)創(chuàng)建連接Connection

con=DriverManager.getConnection(url,username,password) ;3 )創(chuàng)建statement staticment s=con.createStatement() 4)執(zhí)行sql s.executeQuery();


prepareStatement 是預先編譯的語句,statement 不是防止sql 注入性能提高,

callableStatement:存儲過程調用DatabaseMetaDate 類的很多方法都可以知道數(shù)據(jù)庫中存儲過程的詳情。


servlet:是用于java 編寫的服務器端程序,其使用java servlet API,當客戶機發(fā)送請求到服務器時,服務器可以將請求信息發(fā)送給servlet,并讓servlet 建立起服務器返回給客戶機的響應。當啟動web 服務器or 客戶機第一次請求服務時,可以自動裝入servlet,裝入后,

servlet 繼續(xù)運行直到其他客戶機發(fā)出請求。


servlet?生命周期?Servlet?生命周期分為3?個階段1)初始化階段:調用init()方法2)響應客戶請求:調用service()3)終止:調用destory().1)初始化階段:在下列時刻servlet?容器裝載servlet?1.servlet?容器啟動時,自動裝載某些servlet2. 在servlet?容器啟動后,客戶首次向?servlet?發(fā)送請求?3.servlet?類文件被更新以后,重新裝載?servlet。Servlet?被裝載后,servlet容器創(chuàng)建一個servlet?對象并調用servlet?的init?方法。在servlet?生命周期內,init()方法只被調用過一次。Servlet?工作原理:客戶端發(fā)起一個請求,servlet?調用service()方法時請求進行響應,service?對請求的方式進行了匹配,選擇調用dopost?或者doget?等這些方法,然后進入對應方法中調用邏輯層上的方法,實現(xiàn)對客戶的響應。2)響應客戶請求:對于用戶到達

servlet?的請求,servlet?容器會創(chuàng)建特定于該請求的servletRequest?和servletresponse?對象,然后調用servlet?的service?方法,service?方法從servletrequest?對象中獲得客戶請求的信息,處理該請求,并通過servletresponse?對象向客戶返回響應消息。3)終止:當web?應用終止或者servlet?容器終止或servlet?容器重新裝載servlet?新實例時,servlet?容器會調用servlet 對象的第destory?方法,在destory?方法中可釋放servlet?占用的資源。


tomcat?就是servlet?容器,servlet?容器為javaweb?應用提供運行時環(huán)境,它復制管理servlet

和jsp 的生命周期,以及管理他們的共享數(shù)據(jù)。


Servlet 生命周期以下方法:以下方法都由servlet 容器調用。1)構造函數(shù):只有第一次請求servlet 時,創(chuàng)建servlet 實例,調用構造器,這說明servlet 是單例的,所以又線程安全問題,只被調用一次。2)init:只被調用一次,在創(chuàng)建好實例后,立即被調用,用來初始化

servlet3)service:被多次調用,每次請求都會調用service,實際響應請求。4)destory:只被調用一次,在當前servlet 所在的web 應用被卸載前調用,用于釋放當前servlet 所占用的資源。


MVC1)m:model。Dao。與數(shù)據(jù)庫打交道2)V:view, jsp 在頁面上填寫java 代碼,實現(xiàn)顯示3)C,controller,servlet 受理請求,獲取請求參數(shù),調用dao 方法,轉發(fā)or 重定向頁面。

Cookie 和session http 都是無狀態(tài)的協(xié)議,web 服務器不能識別出哪些請求是同一個瀏覽器發(fā)的,瀏覽器的每一次請求都是完全獨立的。

Cookie 放在瀏覽器端,瀏覽器第一次范圍服務器時,沒有cookie,then 服務器給瀏覽器一個cookie,以后每次瀏覽器訪問服務器都要帶上這個cookie。Jsp 是服務端

<% 1.創(chuàng)建一個cookie 對象Cookie cookie =new Cookie(“name”,”jhb”);

2.調用response 的一個方法把cookie 傳輸給客戶端

Response.addCookie(cookie);

%>


默認情況下cookie 是會話級別,存儲在瀏覽器內存中,用戶退出瀏覽器之后被刪除,若希望瀏覽器將cookie 存在磁盤上,則要使用maxage,并給一個以秒為單位的時間,表示

cookie 的存活時間。

Cookie 作用范圍:可以作用當前目錄和當前目錄的子目錄,但不能作用與當前目錄的上一級。

Cookie:在客戶端保持http 狀態(tài)信息的方案,會話跟蹤。

Session:在服務器端保持http 狀態(tài)信息。


當瀏覽器第一次范圍服務器時,沒有cookie,服務器也就得不到JSession_id,then 服務器創(chuàng)建一個session 對象,并返回一個JSession_id 給瀏覽器,通過cookie 返回,下次瀏覽器再訪問服務器時就帶上cookie(其中有JSession_id),服務器就能找到對應的session 對象。JSession_id 可以通過cookie 傳輸,也可以通過url 傳送。


一個session,對應一個sessionID。


Session:瀏覽器和服務器的一次會話,若瀏覽器不關,至始至終都是一個session,因為用cookie 傳送。


URL 重寫:response 的encodeURL(String URL) 方法和encoderedirectURL(String URL)兩個都一樣。


當程序需要為某給客戶端的請求創(chuàng)建衣蛾session?時,服務器首先檢查這個客戶端的請求是否包含一個session??標識,即JSession_id,如果包含,則說明以前已經為此客戶創(chuàng)建過

JSession_id,服務器就按照這個JSession_id?檢索出來(若檢索不到,可能會新建一個,這種情況下可能會出現(xiàn)在服務器已經刪除了該用戶對應的session?對象。但用戶人為的在請求的

URL?上附加衣蛾JSession_id?的參數(shù)。)如不包含則創(chuàng)建一個session,并生成與這個session

有關的JSession_id,這個JSession_id 將在本次響應中返回給客戶端。

默認session 用cookie。


若第一次訪問某web 應用程序的一個jsp 頁面,且該jsp 頁面的page 指定session=true,服務器會創(chuàng)建一個httpsession 對象。


注:關閉瀏覽器只是使存儲在瀏覽器內存中的session cookie 失效,不會使服務器端的

session 對象失效。


依賴注入:在運行期間由容器將依賴關系注入到組件中,就是在運行期,由spring?根據(jù)配置文件將其他對象的引用通過組將提供的setter?方法進行設定??刂品崔D:對組件對象控制權的轉移,從程序代碼本身轉移到了外部容器,通過容器來實現(xiàn)對象組件的裝配和管理。

SpringMVC

使用DispatcherServlet??進行分發(fā),到達合適的額controller?。每個請求來到

dispatcherServlet,dispatcherServlet?來決定到哪個controller,通過handlermapping。先要在

web.xml?中配置dispatcherServlet?的和,在Servlet?中需要一個xml

文件,自己創(chuàng)建,里面來配置SpringMVC 的屬性。

應用服務器:1)Tomcat:應用十分廣泛的?web?服務器,支持部分?j2ee,免費,支持?servlet、

jsp。2)JBoss:開源應用服務器。3)Weblogic、webSphere:業(yè)界第一的appserver。4)Apache:全球應用最廣泛的http 服務器,但只支持靜態(tài)網頁,比如asp、PHP 等動態(tài)網頁不支持。


Memcached:是高性能分布式內存緩存服務器,本質是一個內存key-value 數(shù)據(jù)庫,但不支持數(shù)據(jù)持久化,服務器關閉后,數(shù)據(jù)全丟失。只支持key-value 結構。

Redis:將大部分數(shù)據(jù)放在內存中,支持的數(shù)據(jù)類型有:字符串、hash???表、鏈表、集合、有序集合以及基于這些數(shù)據(jù)類型的相關操作。Redis 內部使用一個redisobject 對象來表示all

key 和value。

他們的區(qū)別:1)redis?中并不是all?數(shù)據(jù)都一直存儲在內存中,這是和memcached?相比一個最大的區(qū)別。2)redis?不僅僅支持簡單的key-value?類型的數(shù)據(jù),同時還支持字符串、hash 表、鏈表、集合、有序集合。3)redis?支持數(shù)據(jù)備份,即master-slave?模式的備份。4)redis 支持數(shù)據(jù)的持久化,可以將內存中的數(shù)據(jù)保存在磁盤上,重啟的時候可以再次加載進內存使用。Memcached?服務器關閉后,數(shù)據(jù)丟失。5)memcached?掛掉后,數(shù)據(jù)不可以恢復,redis 數(shù)據(jù)丟失后可通過AOF?恢復(災難恢復)。

Spring1)ioc?容器——BeanFactory?是最原始的ioc?容器,有以下方法1.getBean2.判斷是否有Bean,containsBean3.判斷是否單例isSingleton。BeanFactory?只是對ioc?容器最基本行為作了定義,而不關心Bean?是怎樣定義和加載的。如果我們想要知道一個工廠具體產生對象的過程,則要看這個接口的實現(xiàn)類。在spring?中實現(xiàn)這個接口有很多類,其中一個

xmlBeanFactory。xmlBeanFactory?的功能是建立在DefaultListablexmlBeanFactory?這個基本容器的基礎上的,并在這個基本容器的基礎上實行了其他諸如xml?讀取的附加功能。xmlBeanFactory(Resource?resource)構造函數(shù),resource?是spring?中對與外部資源的抽象,最常見的是文件的抽象,特別是xml?文件,而且resource?里面通常是保存了spring?使用者的

Bean?定義,eg.applicationContext.xml?在被加載時,就會被抽象為resource?處理[我自己理解,

resource 就是定義Bean 的xml 文件]。

loc?容器建立過程:1)創(chuàng)建?ioc?配置文件的抽象資源,這個抽象資源包含了?BeanDefinition的定義信息。2)創(chuàng)建一個BeanFactory,這里使用的是DefaultListablexmlBeanFactory。3)創(chuàng)建一個載入BeanDefinition?的讀取器,這里使用xmlBeanDefinitionReader?來載入xml?文件形式的BeanDefinition。4)然后將上面定義好的resource?通過一個回調配置給BeanFactory。

5)從資源里讀入配置信息,具體解析過程由xmlBeanDefinitionReader 完成。6)ioc 容器建立起來。

BeanDefinition 類似于resource 接口的功能,起到的作用就是對所有的Bean 進行一層抽象的統(tǒng)一,把形式各樣的對象統(tǒng)一封裝為一個便于spring 內部進行協(xié)調管理和調度的數(shù)據(jù)結構。BeanDefinition 屏蔽了不同對象對于spring 框架的差異。

Resource 里有inputStrea。

解析xml,獲得document 對象,接下來只要再對document 結構進行分析便可知道Bean

在xml 中是怎么定義的,也就可以將其轉化為BeanDefinition 對象。我們配置的Bean 的信息經過解析,在spring 內部已經轉換為BeanDefinition 這種統(tǒng)一的結構,但這些數(shù)據(jù)還不能供ioc 容器直接使用,需要在ioc 容器中對這些BeanDefinition 數(shù)據(jù)進行注冊,注冊完成的BeanDefinition,都會以BeanName 為Key,BeanDefinition 為value,交由map 管理。注冊完之后,一個ioc 容器就可以用了。

自己理解的,xml 文件抽象為resource 對象,Bean 抽象為BeanDefinition 對象。

2)依賴注入——依賴注入發(fā)生在getBean?方法中,getBean?又調用dogetBean?方法。

getBean?是依賴注入的起點,之后調用createBean?方法,創(chuàng)建過程又委托給了docreateBean

方法。在docreateBean?中有兩個方法:1)createBeanInstance,生成Bean?包含的java?對象

2)populateBean?完成注入。在創(chuàng)建Bean?的實例中,getInstantiationstrategy?方法挺重要,該方法作用是獲得實例化策略對象,也就是指通過哪種方案進行實例化的過程。spring?當中提供兩種方案進行實例化:BeanUtils?和cglib。BeanUtils?實現(xiàn)機制是java?反射,cglib?是一個第三方類庫,采用的是一種字節(jié)碼加強方式。Spring?中默認實例化策略為cglib。populateBean 進行依賴注入,獲得BeanDefinition?中設置的property?信息,簡單理解依賴注入的過程就是對這些property?進行賦值的過程,在配置Bean?的屬性時,屬性可能有多種類型,我們在進行注入的時候,不同類型的屬性我們不能一概而論地進行處理。集合類型屬性和非集合類型屬性差別很大,對不同的類型應該有不同的處理過程。所以要先判斷value?類型,再調用具體方法。

3)aop——將那些與業(yè)務無關,卻為業(yè)務模塊所公共調用的邏輯或責任封裝起來,稱其

為aspect,便于減少系統(tǒng)的重復代碼。使用模塊技術,aop?把軟件系統(tǒng)分為兩個部分:核心關注點和橫切關注點。業(yè)務處理的主要流程是核心關注點,與之關系不大的部分是橫切關注點。實現(xiàn)aop?的兩大技術:1)采用動態(tài)代理,利用截取消息的方式,對該消息進行裝飾,以獲取原有對象行為的執(zhí)行。2)采用靜態(tài)織入,引入特定的語法創(chuàng)建切面,從而可以使編譯器可在編譯期間織入有關切面的代碼。

spring?提供兩種方式生成代理對象,jdkProxy?和cglib。默認的策略是,若目標類是接口則用jdk??動態(tài)代理技術,否則使用cglib??生成代理。在jdk??動態(tài)代理中使用?

Proxy.newProxyInstance() 生成代理對象(?JdkDynamicAopProxy??類的getProxy??方法),

JdkDynamicAopProxy?也實現(xiàn)了invocationhandler?接口,有invoke?方法,就是在該方法中實現(xiàn)了切片織入。主流程可以簡述為:獲取可應用到此方法上的通知鏈(Interceptor?chain),若有,則應用通知,并執(zhí)行joinpoint,若沒有,則直接反射執(zhí)行joinpoint。

Introduction 是指給一個已有類添加方法或字段屬性,Introduction 還可以在不改變現(xiàn)有類代碼的情況下,讓現(xiàn)有java 類實現(xiàn)新的接口,或為其指定一個父類實現(xiàn)多繼承,相對于

advice 可以動態(tài)改變程序的功能或流程來說,Introduction 用來改變類的靜態(tài)結構。

攔截器,是對連接點進行攔截,從而在連接點前后加入自定義的切面模塊功能。作用于同一個連接點的多個攔截器組成一個攔截器鏈,攔截器鏈上的每一個攔截器,通常會調用下一個攔截器。

連接點,程序執(zhí)行過程中的行為,比如方法調用或特定異常被拋出。

切入點,指定一個advice 將被引發(fā)的一系列的連接點的集合。aop 框架必須允許開發(fā)者指定切入點。

通知(advice):在特定的連接點,aop?框架執(zhí)行的動作。Spring?以攔截器作通知模型,維護一個圍繞連接點的攔截器鏈。

攔截器(advisor),自己理解,在invoke?前后加入的方法就是通知。使用spring?的

PointCutadvisor,只攔截特定的方法,一個advisor?定義訂一個PointCut?和一個advice,滿足PointCut(指定哪些方面需要攔截),則執(zhí)行相應的advice?(定義了增強的功能)。PointCutadvisor ???有兩個常用實現(xiàn)類:NameMatchMethodPointCutadvisor???和

regexMethodPointCutadvisor。前者需要注入mappedname??和advice??屬性,后者需要注入

pattern?和advice?屬性。mappedname?指明要攔截的方法名,pattern?按照正則表達式的方法指明了要攔截的方法名,advice?定義一個增強,即要加入的操作(需要自己實現(xiàn)MethodBeforeAdvice、MethodafterAdvice、throwAdvice、Methodinterceptor?接口之一),然后在ProxyBeanFactory?的攔截器中注入這個PointCutadvisor。注:一個ProxyFactoryBean?只能指定一個代理目標。

在spring??中配置aop??很麻煩,首先需要編寫xxxadvice??類(需要自己實現(xiàn)

MethodBeforeAdvice、MethodafterAdvice、throwAdvice、Methodinterceptor?接口之一),然后在xml?配置advisor。還要在advisor?中注入advice,然后將advisor?加入ProxyFactoryBean 中。而在spring2.x?以后引入了aspect?J?注解,只需要定義一個aspect?類,在aspect?中聲明

advice 類(可同時聲明多個),然后在xml 配置這個aspect 類,最后添加一行就可以搞定。

通知類型接口描述

前置通知MethodBeforeAdvice在目標方法調用前調用

后置通知MethodafterAdvice在目標方法調用后調用

異常通知throwAdvice在目標方法拋出異常時調用

環(huán)繞通知Methodinterceptor攔截對目標方法調用

還有一類是引入通知,用來定義切入點的。

@RestController??注解相當于@RequestBody+@controller??合在一起的作用。1)若只使用

@RestController?注解,則controller?中的方法無法返回jsp?,頁面配置的視圖解析器

viewResolver?不起作用,返回的內容就是return?里的內容。比如:本來應該到success.jsp?頁面的,但其顯示為success。2)若需要返回指定頁面,則要使用@controller?和viewResolver

結合。3)若要返回Json,則要在方法上加@RequestBody。

都用過哪些注解:@controller、@service、@Requsetmapping、@transactional、@?RequestBody、

@compnent、@autowired、@cookievalue????、@repository、@RestController。其中@controller、

@service 負責注冊一個bean 到spring 上下文中,bean 的id 默認為類名稱開頭字母小寫。

@autowired 根據(jù)bean 的類型從spring 上下文進行查找,注冊類型必須唯一。@pathvariable 一個函數(shù)里有一個輸入?yún)?shù),就是{seckillId}的值就用pathvariable。


Nginx:可以根據(jù)客戶端的ip?進行負載均衡,在upstream?里設置ip_path,負載均衡五種配置:1)輪詢(默認),每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down?掉,能自動剔除;2)指定權重,指定輪詢幾率。權重越大,輪詢幾率越大,用于后端服務器性能不均的情況。3)ip?綁定ip_path,每個請求按訪問ip?的哈希結果分配,這樣每個客戶固定訪問一個服務器,可以解決session?問題。4)fair(第三方)按后端服務器的響應時間來分配請求,響應時間短的優(yōu)先分配。5)url_hash?按訪問的url?結果來分配請求,使每個url?定位到同一個后端服務器。后端服務器為緩存時比較有效。具體的配置自己網上百度。

Spring 用事務管理器來管理事務,有一套統(tǒng)一的api,對于不同持久化方式有不同實現(xiàn),

比如jdbc、hibernate。

TransactionDefinition 類用來定義事務的屬性。

1)傳播行為,有7 種。propgation_required:支持當前事務,若當前沒有事務,則創(chuàng)建一個事務;propgation_supports:支持當前事務,若當前沒有事務,則以非事務方式執(zhí)行;

propgation_mandatory:支持當前事務,若當前沒有事務,則拋異常;propgation_required_new:新建事務,若存在當前事務,把當前事務掛起;propgation_not_supported:以非事務的方式執(zhí)行,若存在當前事務,則把當前事務掛起;propgation_never:以非事務的方式運行,若存在當前事務,則拋異常;propgation_nexted:若當前事物存在,則嵌套事務執(zhí)行。

2)隔離級別

3)它是否為只讀事務。

4)事務超時:為了使應用程序很好的運行,事務不能運行太長時間,因為事務可能涉及對后端數(shù)據(jù)庫的鎖定,所以長時間的事務會不必要的占用數(shù)據(jù)庫資源,事務超時就是事務的一個定時器,在特定時間內事務沒有完成,那么就會自動回滾,而不是一直等待其結束。

5)回滾規(guī)則:默認情況下,事務只會遇到RuntimeException 才回滾。

聲明式事務基于aop,配置事務:@transaction+事務管理器。

Java web1)前端(html、css、js、bootStrap、jquery);2)java web 核心(servlet、tomcat、

cookie);3)redis。

get 請求在url 中發(fā)送,post 請求在http 消息主體中發(fā)送。

Session:可以放在服務器內存、文件或數(shù)據(jù)庫中。如何實現(xiàn)session?共享:1)通過組播的方式進行集群間共享,當一臺機器上的session?變更后會將變更的數(shù)據(jù)以組播的方式分發(fā)給集群中所有其他節(jié)點。2)利用NFS?等共享存儲來共享session,用一臺nfs?服務器或數(shù)據(jù)庫來放session,缺點:nfs?down?掉。3)利用memcached?或redis?來共享,所有web?服務器

都把session?寫入memcached?或redis,也都從memcached?或redis?來取。優(yōu)點:網絡開銷小,幾乎沒有io;缺點:受限于memcached?容量。memcached?本來就是分布式。


每定義一個servlet,都必須實現(xiàn)servlet?接口。genericservlet?實現(xiàn)了該接口,不限于任何協(xié)議,httpservlet?受限于http?協(xié)議。


Filter——1)目的:調用目標資源前讓一段代碼執(zhí)行,是否允許用戶調用目標資源,調用目標資源之后讓一段代碼執(zhí)行。2)編寫java 類,實現(xiàn)filter 接口,配置filter-mapping,說明對哪些資源進行攔截。3)每次攔截時,都調用filter 的dofilter 方法。4)filter 創(chuàng)建和銷毀由servlet 容器,在web 應用啟動時,創(chuàng)建實例,并調用init 方法,filter 對象只創(chuàng)建一次,init 只執(zhí)行一次。Destory,容器卸載filter 對象前被調用。5)用戶在配置filter 時,可以使用為filter 配置一些初始化參數(shù),當web 容器實例化filter 對象時,調用其

init 方法,會把封裝了filter 初始化參數(shù)的filter config 對象初始化,所以開發(fā)人員在寫filter 時,可以用filter config 對象的方法來獲得初始化對象。6)應用:統(tǒng)一全站的字符編碼;禁止瀏覽器緩存;實現(xiàn)url 級別的權限認證。


jsp 引擎就是servlet 程序。

Jsp?轉譯為servlet?源文件,然后編譯為servlet?的class?文件。動態(tài):先編譯后包含;靜態(tài):先包含后編譯。

Hibernate 持久化對象的生命周期1)臨時狀態(tài)(transient),也稱為自由狀態(tài),他只存在于內存中,且在數(shù)據(jù)庫中無相應的數(shù)據(jù)。2)持久化狀態(tài)(Persist),與session??關聯(lián),且在數(shù)據(jù)庫中有對應數(shù)據(jù)。3)游離狀態(tài)(detached),已經持久化,但不在session 緩存中。

?持久化游離暫時

是否處于 session 緩存中有無無

數(shù)據(jù)庫中是否有記錄有有無

最小生成樹不唯一。???

Hibernate.cfg.xml 和Hibernate.hbm.xml


Hibernate 一級緩存(session 緩存)是事務級別的,每個事務(session)都有單獨的一級緩存。這一級別的緩存是由hibernate 進行管理。一般情況下無須進行干預。每個事務都有單獨的一級緩存,不會出現(xiàn)并發(fā)問題,因此無須提供并發(fā)訪問策略。

一級或二級緩存,若查詢的是對象的屬性,則不會把對象加入緩存中。


雙親委派模型是通過loadclass 方法實現(xiàn):先檢查類是否被加載過,若沒有,則調用父類加載器的loadclass 方法,若父類加載器為空,則使用啟動類加載器為父類加載器。若父類加載器加載失敗,先拋出classNotFoundException,然后調用自己findclass 方法進行加載。

要實現(xiàn)自定義類加載器:只需要繼承java.lang.classLoader。

sprigMVC 運行原理1)客戶端請求提交到DispatcherServlet。2)由DispatcherServlet 控制器查查詢一個or 多個handlermapping,找到處理請求的controller。3)DispatcherServlet 將請求提交給controller。4)controller 調用邏輯處理完后,返回methodAndView。5)

DispatcherServlet 查詢一個or 多個ViewResolver 視圖解析器,找到modleAndView 指定的視圖。6)視圖負責將結果顯示到客戶端。

Spring 實例中的成員注入:1)若改變量有set 方法,用property。2)若改變量沒有set

方法,用constructior-args。

Redis 是Nosql 數(shù)據(jù)庫系統(tǒng),高并發(fā),高性能面向key/value。

系統(tǒng)架構師是一個既需要控制整體,又需要洞悉局部瓶頸,并依據(jù)具體的應用場景給出解決方案的人。確定和評估需求,給出開發(fā)規(guī)范。在需求階段,負責理解和管理非功能性需求(可維護性、可復用性),還需要確定客戶及市場人員所提出的需求,確定開發(fā)團隊所提出的設計。在軟件設計階段,負責對軟件體系結構關鍵構件、接口。在編碼階段,詳細設計者和編碼者的顧問,并且經常舉行技術研討會。隨著集成和測試,集成和測試支持將成為軟件架構師的工作重點。

web?service?技術:1)XML+XSD:web?service?采用http?協(xié)議傳輸數(shù)據(jù),采用xml?格式封裝數(shù)據(jù)(xml?中說明調用遠程服務對象的哪個方法,傳遞的參數(shù)是什么,以及服務對象的返回結果是什么).xml?易建立、易分析、與平臺無關。Xsd:sml?schema:定義了一套標準的數(shù)據(jù)類型,當你用某種語言(java、c++等)來構造一個web?service?時,為了符合web?service?標準,所有你使用的數(shù)據(jù)類型都必須被轉換為xsd?類型(你用的功能可能已經幫你自動完成了這個轉換);2)soap,soap?協(xié)議=http?協(xié)議+xml?數(shù)據(jù)格式;3)wsdl:比如我們去商店買東西,首先要知道商店里有什么東西可買,然后再買,商店的做法是貼張海報。web?service?也一樣,web?service?客戶端要調用一個web?service?服務,首先要知道這個服務的地址在哪里,以及服務里有什么方法可調用,所以web?service?服務器首先要通過一個wsdl?文件說明自己家里有什么服務可以對外調用,服務是什么(服務中有哪些方法、參數(shù))。wsdl?就是一個基于

xml 語言,用于描述web service 及其函數(shù)、參數(shù)和返回值。

Hibernate——1)一級緩存session:hibernate??內置,不能卸除。緩存范圍:緩存只能被當前session?對象訪問,緩存的生命周期依賴于當前session?的生命周期,session?關閉后,緩存也就沒有了。2)二級緩存sessionfactory:使用第三方插件。緩存范圍:被應用內所有

session 共享,緩存生命周期依賴于應用的生命周期。

xml 解析技術?答案:1)dom:必須在解析之前把整個文檔裝入內存,處理大型文件時,性能低,適合xml 隨機訪問。2)sax:事件驅動,它順序讀取xml 文件,不需要一次全部載入整個文件。當遇到文件開頭,文檔結束or 標簽開頭or 標簽結束時,他會觸發(fā)一個事件,用戶通過在其回調事件中寫入處理代碼來處理xml 文件,適合順序訪問。

聚集索引:返回適用于某范圍內的數(shù)據(jù)。接口:定義與實現(xiàn)分離。

面向接口編程優(yōu)點:1)接口經過合理設計之后,有助于程序設計的規(guī)范化,可以并行開發(fā),提高工作效率;2)實現(xiàn)了程序的可插拔性,降低耦合度。

forword?VS?redirect?區(qū)別1)forward?是服務器請求資源,服務器直接訪問目標地址的url,把url?的響應內容讀取出來,然后把這些內容發(fā)送給瀏覽器,瀏覽器根本不知道服務器發(fā)送的內容是從哪取出來,所以他的地址欄中還是原來的地址。Redirect?服務器根據(jù)邏輯發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求事先訪問過的那個地址,一般來說,瀏覽器會用剛才請求的all?參數(shù)重新請求,所以session,request?參數(shù)都可以獲取。地址欄顯示的是新的url。用redirect?等于客戶端向服務器端發(fā)兩次request,同時也接受兩次response。2)forward:轉發(fā)頁面和轉發(fā)到的頁面可以共享request?的數(shù)據(jù);redirect?不能共享數(shù)據(jù)3)forward:只能在同一個web?應用程序之間轉發(fā)請求;redirect:不僅可以重定向到當前應用程序的其他資源,還可以重定向到同一個站點上的其他應用程序中的資源,甚至使用絕對url?重定向到其他站點的資源。4)forward:/代表當前web?應用根目錄redirect:/代表當前web?站點的根目錄。

JSP 內置對象。1)request:用戶端的請求,此請求會包含來著get or post 請求的參數(shù)。

2)response:網頁傳回用戶端的響應。3)pageContext:網頁的屬性4)session:與請求有關的會話5)application:servlet 正在執(zhí)行的內容6)out:傳送回應的輸出7)conig:servlet 的部件8)page:gsp 網頁本身9)exception:網頁錯誤

jsp?有哪些動作?6?個1)jsp:include?在頁面被請求時,引入一個文件2)jsp:useBean?尋找or?實例化一個JavaBean3)jsp:setProperty?這只javaBean?的屬性4)jsp:getProperty?輸出某個javaBean?的屬性5)jsp:forword?把請求轉到一個新頁面6)jsp:plugin?根據(jù)瀏覽器類型為

java 插件生成object or embed 標配。

jsp 中動態(tài)include 與靜態(tài)include 區(qū)別?答案:動態(tài)include 用jsp:include 動作實現(xiàn),它總是會檢查所包含文件中的變化,使用于包含動態(tài)頁面;靜態(tài)include 用include 偽碼實現(xiàn),不會檢查所含文件的變化,適用于包含靜態(tài)頁面。

前者頁面不會轉向include?所指向的頁面,只顯示該頁的結果,主頁面還是原來的頁面,指向完以后還會回來,相當于函數(shù)調用,并且可以帶參數(shù)。后者完全轉向新頁面,不會再回來,相當于goto 語句。

servlet?VS?CGI?區(qū)別1)servlet?可移植跨平臺CGI?不行2)在傳統(tǒng)CGI?中每個請求都要啟動一個新進程,若CGI?程序的本身執(zhí)行時間較短,啟動進程所需要的進行所需要的開銷很可能反而超過實際執(zhí)行的時間;servlet,每個請求由輕量級的java?線程處理3)在傳統(tǒng)CGI?中,若有N?個并發(fā)的對同一個CGI?的請求,該CGI?的程序代碼在內存中重載了N?次,對于servlet,處理請求的是N?個線程,只要一份servlet?類代碼。

如何實現(xiàn)servlet 單線程模式?答案:要實現(xiàn)單線程模式,可以在配置文件中修改

isThreadSafe 屬性,比如,<%@page isThreadSafe=”false”%>

servlet 頁面間對象傳遞的方法有幾種?答案:用request,session,application。Cookie

等方法實現(xiàn)頁面間的對象傳遞。

jsp?VS?servlet:jsp?是servlet?技術的擴展,本質上是servlet?的簡單方式,jsp?編譯后是“類

servlet”。他們最主要額不同在于:servlet?的應用邏輯在?java?文件中,并且完全從表示層中的html?分離出來。Jsp?是java?和html?可以組合為一個擴展名為.jsp?的文件。Jsp?側重視圖,

servlet 側重控制邏輯。

J2ee 號稱多層結構,為什么多層比兩層好?答案:多層結構解耦性好,使得維護與擴展方便,靈活。

典型的j2ee 至少劃分為3 層:表現(xiàn)層、業(yè)務邏輯層、持久層。

測試1)語句覆蓋:至少每個語句應該執(zhí)行一次,最弱的邏輯覆蓋標準。2)判定覆蓋:每個判定的每種可能結果都要執(zhí)行一次,建立判定表之后,要保證每種判定的結果中都包含了T?和F。3)條件覆蓋:不但每個語句要執(zhí)行一次,而且判定表達式中的每個條件都要取到可能的結果,建立判定表以后,要保證每種條件的結果中包含了T?和F。4)判定-條件覆蓋:每個判定及每個判定中的每個條件都取到可能的結果,建立判定表后,要保證每個判定結果包含T?和F,而且每個條件的結果包含T?和F,也就是綜合了上面的判定覆蓋和條件覆蓋。5)條件組合覆蓋:每個判定中的條件的各種組合至少出現(xiàn)一次,也就是說,先把程序中的條件列出來,排列組合寫出all?可能性,看有沒有哪些值同時滿足這些排列組合。6)路

徑覆蓋:每條可能的路徑至少執(zhí)行一次。

功能測試:也稱為黑盒測試,只考慮各個功能,不考慮整個軟件的內部結構及代碼。可用性測試:用戶在和系統(tǒng)交互時對用戶體驗質量的度量,由用戶測試。

邊界測試就是找到邊界,then 在邊界附近(兩邊)選點。

3,16,37,?,289 應該填100,因為16-3=7,37-16=21, 100-37=63,289-100=189

2012!末尾有幾個0?答案:乘機會產生0 的就是2 的倍數(shù)與5 的倍數(shù)相乘產生的。

2012/5=402,402/5=80,80/5=16,16/5=33,402+80+16+3=501,所以末尾公有501 個0.

tomcat 服務器默認端口8080,啟動tomcat 用bin 目錄下的startup.bat--用的是catalina.bat.

jsp?中?java?代碼寫在<% %>中。

Load-on-startup:配置在servlet 節(jié)點中,用來指定servlet 實例被創(chuàng)建的時機。若為負數(shù),則在第一次被請求時創(chuàng)建,若為0 或正數(shù),則在當前web 應用被servlet 容器加載時創(chuàng)建實例,且數(shù)值越小則越早被創(chuàng)建。

一個servlet 可以有多個servlet-mapping 對其進行映射。

Servletconfig:init?函數(shù)的參數(shù),他封裝了?servlet?的配置信息,并且可以獲得?servletContext

對象。

Servlet 引擎為每個web 應用創(chuàng)建一個servletcontext 對象,一個web 應用程序中all servlet

都共享一個servletcontext 對象,他對應一個web 應用。

Servletrequest 里封裝了all 有關請求的信息,但要看是get 方式還是post 方式,必須用

httpservletrequest 的getMethod()方法。

Jsp?可以放在web?應用程序中除了web-inf?中。每個jsp?頁面在第一次被訪問時,jsp?引擎將它翻譯為一個servlet?源程序,接著再把這個servlet?源程序編譯成servlet?的class?文件,然后再由web?容器(servlet?引擎)像調用普通servlet?程序一樣來裝載和解釋這個由jsp?頁面譯成的servlet?程序。

Jsp???九個內置對象。1)request:httpservletrequest2)response:httpservletresponse,在

jsp?頁面中幾乎不用response?任何方法3)pagecontext:頁面的上下文,是pagecontext?的一個對象,可以從該對象獲得其他8?個對象及頁面的其他信息。4)session:代表瀏覽器和服務器的一次會話,是httpsession?對象。5)application:代表當前web?應用,是servletcontext 對象。6)config:當前?jsp?對應的?servlet?的?servletconfig?對象,開發(fā)時幾乎不用?7)out:jspWriter對象,調用out.println()可以直接把字符串打印到瀏覽器。8)page:只能調用object?方法,開發(fā)時幾乎不用,指向當前jsp?對應的servlet?對象的引用。9)exception:在聲明了page?指

令的?iserrorpage=“true”時才可以使用。

Jsp?注釋<%-- --%>

和屬性相關的方法1)object getAttribute(String name):獲取指定的屬性2)Enumeration

getAttributenames(): 獲取all 的屬性的名字組成一個enumeration 對象3)removeAttribute(String name):移除指定的屬性4)setAttribute(String name,Object 0):設置屬性。

pageContext,request,session,application 對象都有這些方法,這4 個對象為域對象。

Pagecontext:屬性的作用范圍僅限于當前jsp 頁面。Request:屬性的作用范圍僅限于同一個請求。Request:屬性的作用范圍限于一次會話。瀏覽器打開直到關閉稱之為一次會話(在此期間會話不失效)。Application:屬性的作用范圍限于當前web 應用,是范圍最大的屬性作用范圍。只要在一處設置屬性,在其他jsp 和servlet 中都可以獲取到。

請求重定向VS?請求轉發(fā)1)請求httpservletrequest?的getrequestDispatcher()方法,獲取

requestDispatcher?對象,調用該方法時,傳入需要轉發(fā)的地址2)調用requestDispatcher?的

forword(request,response)進行請求的轉發(fā)。

請求重定向,兩次請求,直接調用response 的sendredirect(path) 方法。

Resp.sendRedirect(location)。

Jsp?指令<%@ %> <%@include %>靜態(tài)引入嵌入整個源碼,生成一個?servlet?源文件。Jsp?指令是為?jsp?引擎設計的,只是告訴?jsp?引擎如何處理?jsp?頁面中的相關部分。

pageEncoding:指定當前頁面的字符編碼charset:指定返回頁面的字符編碼。

動態(tài)引入生成兩個servlet 源文件。

Java 中中文亂碼問題1 )在jsp 頁面上出入中文,提交頁面后不出現(xiàn)亂碼

pageEncoding,charset?的編碼一致,且都支持中文,建議為?utf-8,還需要保證瀏覽器顯示的字符編碼也和請求的?jap?編碼一樣。2)獲取參數(shù)中的中文,默認參數(shù)在傳輸過程中使用iso-8859-1 1. 對于post 請求:值需要在獲取請求信息之前調?用request.setCharacterEncoding(“utf-8”)?2.?對于?get?請求,?String?username?=new String(val.getBytes(iso-8859-1),”utf-8”),先用?iso-8859-1?解碼,再用?utf-8?編碼。

多個請求映射到同一個jsp?頁面?答案:1)這幾個請求的名字都為xxx.do,all?以.do?結尾的都映射到同一個servlet。2)用request?獲得path,即/xxx.do。3)去掉后面的.do?和前面的”/”,得到方法名,即xxx。4)利用反射調用相關方法。

Httpsession??生命周期:1)什么時候創(chuàng)建httpsession?答案:1.是否瀏覽器訪問服務器的任何一個jsp?或者servlet,服務器都會創(chuàng)建一個httpsession?不一定,設置session=false,若當前jsp?是客戶端訪問的當前web?應用的第一個資源,且page?指定的session=false,則服務器不會為jsp?創(chuàng)建session?對象。若當前jsp?不是客戶端訪問的當前web?應用的第一個資源,且其他頁面已經創(chuàng)建了其他httpsession?對象,則返回一個和當前會話相關的httpsession?對

象,不創(chuàng)建一個新對象。2.session=false?是什么意思?當前jsp?頁面禁用session?隱含變量,但可以使用其他的顯示的httpsession?的對象。3.對于servlet,若servlet?是客戶端訪問的第一個web?應用資源,只有調用request.getSession()或除了1?和2?以外,只要訪問jsp,則要創(chuàng)建session?對象。2)什么時候銷毀session?對象?答案:1.直接調用httpsession?的

invalidate?方法,該方法使httpsession?失效。2.當前web?應用被卸載。3.超出httpsession?的過期時間。

建議使用絕對路徑,在java 中什么是絕對路徑?相對于當前web 應用根路徑的路徑。

JavaBean:就是一個特殊的java 類,用作javaBean 的類必須具有一個公共的無參數(shù)的構造函數(shù),Setter 和getter。javaBean 的屬性名是根據(jù)setter 和getter 來生成,且首字母必須小寫。

EL?表達式?Expression?Language?表達式語言?all?的?EL?都以${ }開始。

EL?隱含對象11?個1)和范圍有關application?scope,session?scope?,request?scope,pagescope?2?)和輸入有關param?,paramValues?3?)其他隱含對象cookie?,header?,

headerValues,initparam,pageContext 。

自定義標簽:1)先寫一個標簽處理器類,實現(xiàn)?simpleTag?接口,或者繼承?SimpleTagSupport類。2)建一個tld?文件,一個描述文件。3)在jsp?中使用自定義標簽。4)在jsp?頁面中使用jsp?標簽<%@?taglib?%>引入。

jspFragment 封裝jsp 標簽體。jspFragment.invoke(writer out)。

若配置的標簽有標簽體,則jsp 引擎會調用setjspBody()方法把jspFragment 傳遞給標簽處理器,我們可以使用SimpleTagSupport 的getjspbody 方法來返回jspFragment。

子標簽作為父標簽的標簽體存在,父標簽無法獲取子標簽引用,但子標簽可以獲取父標簽引用。

El 自定義函數(shù)1)寫一個靜態(tài)函數(shù)實現(xiàn)功能2)tld 文件中配置

JSTL(jsp 標準便簽函數(shù)庫):使頁面上沒有java 代碼,用el 或jstl 或其他自定義標簽。

必須是和的父標簽且在同一個,必須在之前。

為循環(huán)控制,它可以將集合collection ?中的成員循環(huán)瀏覽一遍,運行方式為當前條件符合時,就會持續(xù)重復執(zhí)行的本體內容。

Filter?過濾器filter?的基本功能是對servlet?容器調用servlet?的過程進行攔截,從而在

servlet?進行相應處理的前后實現(xiàn)一些特殊功能。Filter?程序是一個實現(xiàn)了Filter?接口的Java

類,他由?servlet?容器進行調用和執(zhí)行。Servlet?容器?filter servlet。

Filter 1)init()方法類似于servlet 的init 方法,創(chuàng)建filter 對象后,立即被調用,且只被

調用一次。Filter 對象在servlet 容器加載當前web 應用程序時就被創(chuàng)建。Filter 實例是單例的。2)doFilter()方法,邏輯代碼寫在這里面,每次攔截器都會調用的方法。他有3 個參數(shù),servletrequest,servletresponse,filterchain(指filter 鏈,多個filter 可構成一個filter 鏈,

filterchain 只有一個方法doFilter(request,response),把請求傳給filter 鏈的下一個filter,若當前filter 是filter 鏈的最后一個filter,將把請求傳給目標servlet(or jsp))。若有多個filter 滿足要求,則攔截順序與web.xml 中的filter-mapping 的配置順序有關。先配置先調用。3)

destory:釋放當前filter 所占用的資源,filter 銷毀之前被調用,且只被調用一次。

與開發(fā)servlet 不同,F(xiàn)ilter 接口并沒有相應的實現(xiàn)類可以繼承,要開發(fā)過濾器,只能直接實現(xiàn)filter 接口。

多個filter 代碼的執(zhí)行順序

HelloFilter 的doFilter 方法有3 個方法

S.O.P(before hello);

doFilter();//調用的是secondFilter 的doFilter 方法

S.O.P(after hello);

secondFilter 的doFilter 方法有3 個方法

S.O.P(before second);

doFilter();//調用的是jsp 的doFilter 方法

S.O.P(after second);

jsp?的doFilter?方法

<% S.O.P(test jsp);%>

這5 個輸出語句的執(zhí)行順序是:

S.O.P(before hello); S.O.P(before second); S.O.P(test jsp); S.O.P(after second); S.O.P(after hello);

Filter 的dispatcher 節(jié)點(表明攔截哪種方式的頁面)默認為request,還可以的取值有

forward,error,include。Request:直接發(fā)get?或post?請求,當用戶直接訪問頁面時,web 容器將會調用過濾器。Include:若目標資源是通過requestdispatcher?的include?方法訪問,則該過濾器將被調用。Forword:1) 2)requestdispatcher.forword?3)通過?page?指令的errorpage?轉發(fā)頁面。Error:若目標資源是通過聲明式異常處理機制調用時,則該過濾器將被調用。Dispatcher?節(jié)點可以有多個。

Filter 的應用:1)禁用瀏覽器的緩存。2)字符編碼過濾器。若沒有過濾器則在每一個請求頁面中都要寫request.setCharacterEncoding,有了filter,對于all 請求都經過filter,只需要寫一次。3)檢測用戶是否登錄的filter。

Filter 是javaweb 的一個重要組件,可以對發(fā)送到servlet 的請求進行攔截,并對相應也進行攔截。

URL:http://localhost:8080/day_01/login/a.jsp(其中day_01 為工程名字)

URI: day_01/login/a.jsp Servletpath:login/a.jsp

JavaWeb-servlet 監(jiān)聽器

監(jiān)聽器:專門用與對其他對象身上發(fā)生的事件或狀態(tài)的改變進行監(jiān)聽or 相應處理的對象。當被監(jiān)視的對象發(fā)生情況時,立即采取相應的行動。

Servlet 監(jiān)聽器:一種特殊的類,用于箭筒ServletContext,httpsession,Servletrequest 等域對象的創(chuàng)建與銷毀事情,以及監(jiān)聽這些對象中的屬性發(fā)生修改的事件。

一、監(jiān)聽域對象的創(chuàng)建和銷毀

?創(chuàng)建時間銷毀時間

ServletContext(application)

web 應用被加載web 應用被銷

Httpsession(session)

Servletrequest(request)

每次請求開始時創(chuàng)建

每次訪問結束后銷毀

ServletContextListener 最為常用,監(jiān)聽ServletContext 對象創(chuàng)建or 銷毀的Servlet 監(jiān)聽器,可以在當前web 應用被加載時對當前web 應用的相關資源進行初始化,比如:創(chuàng)建數(shù)據(jù)庫連接池。HttpsessionListener:sessioncreated?在?session?被創(chuàng)建后調用,sessionDestoryed?在?session被銷毀前調用。

生命周期:1)request:是一個請求,當一個相應返回時被銷毀,發(fā)一個請求時被創(chuàng)建

[if !supportLists]1.?[endif]forword?只有一個請求,只有一個request?2.response?有兩個request。2)session:當?shù)谝淮卧L問web?應用的一個jsp?或Servlet?時,且該jsp?和Servlet?中還需要創(chuàng)建session?對象,此時服務器會創(chuàng)建一個session?對象。3)application:ServletContext?對象。當前web?應用被加載時創(chuàng)建,web?應用被卸載時銷毀。

二、域對象中屬性的變更的試卷監(jiān)聽器變更:添加,置換,刪除。

要使用監(jiān)視器:寫一個類,實現(xiàn)相對應的接口,在web.xml 中配置。

三、感知session 綁定的事件監(jiān)聽器,不用再web.xml 中配置

1)實現(xiàn)了httpsessionBindingListener 的javabean 可以感知自己是否放入session 屬性中or

被移出,有兩個方法

[if !supportLists]1.?[endif]public?void?valueBound():當前對象被綁定到session?時調用。

[if !supportLists]2.?[endif].public?void?valueUnbound():當前對象從session?中解除綁定時被調用。

2)活化:從硬盤里讀出鈍化:把自己寫入硬盤

實現(xiàn)了httpsessionActivationListener 可感知自己被活化or 鈍化。

關了web?服務器,session?本應該銷毀,但有一個緩存機制,把session?存放在tomcat?服務器的work/catalane/localhost/contextpath?目錄下session,ser。

集群1)伸縮性:系統(tǒng)適應不斷增長的用戶數(shù)的能力。2)高可用性:避免單一服務器的單點失效.3)負載均衡:把請求發(fā)給不同服務器。4)失效轉移:當一個節(jié)點失效后,通過選擇集群中的另一個節(jié)點,處理將會繼續(xù)而不會終止。httpssession 失效轉移,用來保證當某臺服務器失效以后,會話狀態(tài)不會丟失,為了支持會話轉移,web 服務器將在一定的時候把會話對象備份到其他地方,以防丟失。這個其他地方有jdbc 數(shù)據(jù)庫、其他所有服務器、任意選擇其他一臺web server、中央server。

GetVSPost——get 提交的信息顯示在地址欄不安全對大數(shù)據(jù)不行(因為地址欄存儲體積有限)獲取/查詢資源;Post?提交的信息不顯示在地址欄安全對大數(shù)據(jù)可以更改信息

斷言是軟件開發(fā)中一種常用的調試方式,在實現(xiàn)中,assertion?就是在程序中的一條語句,他對一個布爾表達式進行檢查,一個正確的程序必須保證這個boolean 表達式的值為true,若該值為false,則說明程序已經處于不正確的狀態(tài)下,系統(tǒng)將給出警告并退出。

什么時候使用斷言?可以在預計正常情況下不會到達的任何位置上放置斷言,斷言可以用于驗證傳遞給私有方法的參數(shù)。不過,斷言不應應用于驗證傳遞給公有方法的參數(shù)。因為不管是否啟用了斷言,公有方法都必須檢查參數(shù),不過既可以在公有方法中,也可以在非公有方法中利用斷言測試后置條件。另外,斷言不應該以任何方式改變程序的狀態(tài)。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,886評論 11 349
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,853評論 18 399
  • 這部分主要是與Java Web和Web Service相關的面試題。 96、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,507評論 0 10
  • 心里好難受,胸口堵的發(fā)慌,改變從學會對自己好開始,喜歡了就去買,想吃了就去吃,想旅行了就出發(fā),學著不要依賴任何人,...
    此處有危險請遠離閱讀 197評論 0 0
  • 預備 不要害怕發(fā)布一款沒有用到機器學習的產品。 評估指標設計并落實優(yōu)先處理的事情。 在復雜的啟發(fā)式問題上使用機器學...
    geekLiu閱讀 447評論 0 0

友情鏈接更多精彩內容