struts的工作流程?spring的工作流程
- 夕逆IT
- 軟件開(kāi)發(fā)
- 2023-08-13
- 259
今天給各位分享struts的工作流程的知識(shí),其中也會(huì)對(duì)spring的工作流程進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!mvc操作流程Spri...
今天給各位分享struts的工作流程的知識(shí),其中也會(huì)對(duì)spring的工作流程進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!
mvc操作流程
SpringMVC工作流程描述:
1.用戶向服務(wù)器發(fā)送請(qǐng)求,請(qǐng)求被Spring前端控制ServeltDispatcherServlet捕獲;
2.DispatcherServlet對(duì)請(qǐng)求URL進(jìn)行解析,得到請(qǐng)求資源標(biāo)識(shí)符(URI)。然后根據(jù)該URI,調(diào)用HandlerMapping獲得該Handler配置的所有相關(guān)的對(duì)象(包括Handler對(duì)象以及Handler對(duì)象對(duì)應(yīng)的攔截器),最后以HandlerExecutionChain對(duì)象的形式返回;
3.DispatcherServlet根據(jù)獲得的Handler,選擇一個(gè)合適的HandlerAdapter;
4.提取Request中的模型數(shù)據(jù),填充Handler入?yún)?,開(kāi)始執(zhí)行Handler(Controller)。
在填充Handler的入?yún)⑦^(guò)程中,根據(jù)你的配置,Spring將幫你做一些額外的工作:
HttpMessageConveter:將請(qǐng)求消息(如Json、xml等數(shù)據(jù))轉(zhuǎn)換成一個(gè)對(duì)象,將對(duì)象轉(zhuǎn)換為指定的響應(yīng)信息。
數(shù)據(jù)轉(zhuǎn)換:對(duì)請(qǐng)求消息進(jìn)行數(shù)據(jù)轉(zhuǎn)換。如String轉(zhuǎn)換成Integer、Double等。
數(shù)據(jù)根式化:對(duì)請(qǐng)求消息進(jìn)行數(shù)據(jù)格式化。如將字符串轉(zhuǎn)換成格式化數(shù)字或格式化日期等。
數(shù)據(jù)驗(yàn)證:驗(yàn)證數(shù)據(jù)的有效性(長(zhǎng)度、格式等),驗(yàn)證結(jié)果存儲(chǔ)到BindingResult或Error中。
5.Handler執(zhí)行完成后,向DispatcherServlet返回一個(gè)ModelAndView對(duì)象;
6.根據(jù)返回的ModelAndView,選擇一個(gè)適合的ViewResolver(必須是已經(jīng)注冊(cè)到Spring容器中的ViewResolver)返回給DispatcherServlet;
7.ViewResolver結(jié)合Model和View,來(lái)渲染視圖;
8.將渲染結(jié)果返回給客戶端。
springmvc 多步流程
工作流程(12步)
1.DispatcherServlet(前端控制器)接收用戶的請(qǐng)求;
2.DispatcherServlet調(diào)用HandlerMapping(處理器映射器),找到合適的Handler;
3.HandlerMapping(處理器映射器)返回HandlerExecutionChain(合適的Handler的位置)給DispatcherServlet;
4.發(fā)送請(qǐng)求到HandlerAdapter(處理器適配器)(打一個(gè)比方:家用電的電壓為220V,我們的電腦或手機(jī)所需要的電壓各不相同,所以就需要有電源適配器來(lái)起到橋梁作用,這里的處理器適配器也是同樣的作用);
5.HandlerAdapter(處理器適配器)將請(qǐng)求交給Handler(處理器)去執(zhí)行;
6.Handler(處理器)執(zhí)行請(qǐng)求,并將處理后的結(jié)果封裝成為一個(gè)ModelAndView對(duì)象,返回給HandlerAdapter(處理器適配器);
7.HandlerAdapter(處理器適配器)將ModelAndView對(duì)象返回給DispatcherServlet;
8.DispatcherServlet調(diào)用InternalResourceViewResolver(視圖解析器)請(qǐng)求視圖解析;
9.InternalResourceViewResolver(視圖解析器)解析視圖后返回給DispatcherServlet;
10.DispatcherServlet請(qǐng)求渲染視圖;
11.View(視圖)將渲染好的視圖返回給DispatcherServlet;
12.DispatcherServlet響應(yīng)用戶的請(qǐng)求。
spring加載流程
初始化環(huán)境—>加載配置文件—>實(shí)例化Bean—>調(diào)用Bean顯示信息
spring filter請(qǐng)求流程
Filter的原理
JavaServletAPI中提供了Filter接口,編寫Filter的實(shí)現(xiàn)類,從而實(shí)現(xiàn)自定義過(guò)濾器。Filter的請(qǐng)求流程為:
1.客戶端發(fā)起請(qǐng)求
2.服務(wù)容器判斷當(dāng)前請(qǐng)求資源是否有過(guò)濾器,有則執(zhí)行過(guò)濾器
3.過(guò)濾器過(guò)濾通過(guò)后請(qǐng)求到Servlet服務(wù)器
4.返回結(jié)果通過(guò)過(guò)濾器返回給請(qǐng)求方
spring開(kāi)發(fā)流程
1.新建工程,構(gòu)建package包結(jié)構(gòu)
2.導(dǎo)入spring的核心包和依賴關(guān)系包(或根據(jù)提示進(jìn)行導(dǎo)入)
導(dǎo)入log4j和junit測(cè)試環(huán)境
3.編寫spring上下文配置文件
配置spring上下文環(huán)境時(shí)需要注意xsd的引用,spring包含了很多功能模塊,不同的功能模塊需要使用不同的xsd;
4.把需要有springbean工廠實(shí)例化的類交給spring進(jìn)行管理(在spring配置文件中,配置一個(gè)bean關(guān)聯(lián)類)
5.編寫測(cè)試程序或在業(yè)務(wù)程序中進(jìn)行spring實(shí)例化對(duì)象,spring實(shí)例化對(duì)象時(shí),可以使用spring的核心IOC/DI
JAVA架構(gòu)之線程池是怎樣工作的
謝謝邀請(qǐng)!下面介紹一下線程池是怎樣工作的?
ThreadPoolExecutor的類關(guān)系如下:
Executor是一個(gè)接口,它是Executor框架的基礎(chǔ),它將任務(wù)的提交與任務(wù)的執(zhí)行分離開(kāi)來(lái)。
ExecutorService接口繼承了Executor,在其上做了一些shutdown()、submit()的擴(kuò)展,可以說(shuō)是真正的線程池接口;
AbstractExecutorService抽象類實(shí)現(xiàn)了ExecutorService接口中的大部分方法;
threadPoolExecutor是線程池的核心實(shí)現(xiàn)類,用來(lái)執(zhí)行被提交的任務(wù)。
ScheduledExecutorService接口繼承了ExecutorService接口,提供了帶"周期執(zhí)行"功能ExecutorService;
ScheduledThreadPoolExecutor是一個(gè)實(shí)現(xiàn)類,可以在給定的延遲后運(yùn)行命令,或者定期執(zhí)行命令。ScheduledThreadPoolExecutor比Timer更靈活,功能更強(qiáng)大。
定義線程池
線程池的創(chuàng)建各個(gè)參數(shù)含義及流程如下:
1、corePoolSize
①線程池中的核心線程數(shù),當(dāng)提交一個(gè)任務(wù)時(shí),線程池創(chuàng)建一個(gè)新線程執(zhí)行任務(wù),直到當(dāng)前線程數(shù)等于corePoolSize;
②如果當(dāng)前線程數(shù)為corePoolSize,繼續(xù)提交的任務(wù)被保存到阻塞隊(duì)列中,等待被執(zhí)行;
③如果執(zhí)行了線程池的prestartAllCoreThreads()方法,線程池會(huì)提前創(chuàng)建并啟動(dòng)所有核心線程。
2、maximumPoolSize
線程池中允許的最大線程數(shù)。如果當(dāng)前阻塞隊(duì)列滿了,且繼續(xù)提交任務(wù),
則創(chuàng)建新的線程執(zhí)行任務(wù),前提是當(dāng)前線程數(shù)小于maximumPoolSize
3、keepAliveTime
線程空閑的存活時(shí)間,即當(dāng)線程沒(méi)有任務(wù)執(zhí)行時(shí),繼續(xù)存活的時(shí)間。
默認(rèn)情況下,該參數(shù)只在線程數(shù)大于corePoolSize時(shí)才有用。
4、TimeUnit
keepAliveTime的時(shí)間單位。
5、WorkQueue
用于保存等待執(zhí)行的任務(wù)的阻塞隊(duì)列,一般來(lái)說(shuō),我們應(yīng)該盡量使用有界隊(duì)列,因?yàn)槭褂脽o(wú)界隊(duì)列作為工作隊(duì)列會(huì)對(duì)線程池做如下影響。
①當(dāng)線程池中的線程數(shù)達(dá)到corePoolSize后,新任務(wù)將在無(wú)界隊(duì)列中等待,因此線程池中的線程數(shù)不會(huì)超過(guò)corePoolSize。
②由于1,使用無(wú)界隊(duì)列時(shí)maximumPoolSize將是一個(gè)無(wú)效參數(shù)。
③由于1和2,使用無(wú)界隊(duì)列時(shí)keepAliveTime將是一個(gè)無(wú)效參數(shù)。
④更重要的,使用無(wú)界queue可能會(huì)耗盡系統(tǒng)資源,有界隊(duì)列則有助于防止資源耗盡,同時(shí)即使使用有界隊(duì)列,也要盡量控制隊(duì)列的大小在一個(gè)合適的范圍。
所以我們一般會(huì)使用,ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue。
6、threadfactory
創(chuàng)建線程的工廠,通過(guò)自定義的線程工廠可以給每個(gè)新建的線程設(shè)置一個(gè)具有識(shí)別度的線程名,
當(dāng)然還可以更加自由的對(duì)線程做更多的設(shè)置,比如設(shè)置所有的線程為守護(hù)線程。
Executors靜態(tài)工廠里默認(rèn)的threadfactory,線程的命令規(guī)則時(shí)"pool-數(shù)字-thread-數(shù)字"
7、RejectedExecutionHandler拒絕策略
線程池的飽和策略,當(dāng)阻塞隊(duì)列滿了,且沒(méi)有空閑的工作線程,如果繼續(xù)提交任務(wù),必須采取一種策略處理該任務(wù),線程池提供了4種策略:
①AbortPolicy:直接拋出異常,默認(rèn)策略
②CallerRunsPolicy:用調(diào)用者所在的線程來(lái)執(zhí)行任務(wù)
③DiscardOldestPolicy:丟棄阻塞隊(duì)列中靠最前的任務(wù),并執(zhí)行當(dāng)前任務(wù)
④Discardpolicy:直接丟棄任務(wù)
當(dāng)然也可以根據(jù)應(yīng)用場(chǎng)景實(shí)現(xiàn)RejectedExecutionHandler接口,自定義飽和策略,如記錄日志或持久化存儲(chǔ)不能處理的任務(wù)。
線程池的工作機(jī)制
①如果當(dāng)前運(yùn)行的線程少于corePoolSize,則創(chuàng)建新線程來(lái)執(zhí)行任務(wù)
②如果運(yùn)行的線程等于或多于corePoolSize,則將任務(wù)加入BlockingQueue
③如果無(wú)法將任務(wù)加入BlockingQueue(隊(duì)列已滿),則創(chuàng)建新的線程來(lái)處理任務(wù)。
④如果創(chuàng)建新線程將使當(dāng)前運(yùn)行的線程超出maximumPoolSize,任務(wù)將被拒絕,
并調(diào)用RejectedExecutionHandler.rejectedExecution()方法。
好了,關(guān)于struts的工作流程和spring的工作流程的問(wèn)題到這里結(jié)束啦,希望可以解決您的問(wèn)題哈!
本文鏈接:http://xinin56.com/ruanjian/286.html