SSM面试题
框架面試題
一、Mybatis
1、談?wù)勀銓蚣艿睦斫?#xff0c;框架有什么好處?
1、啥是框架框架就是一個(gè)架子,表演節(jié)目,舞臺(tái)已經(jīng)搭建好,表演什么節(jié)目,看自己的需求了。框架是一個(gè)半成品,對于Java語言來說,框架就是封裝了別人的代碼。在框架的基礎(chǔ)上我們在進(jìn)一步開發(fā),拿來主義。(你想啊,在二階段我們都手動(dòng)去用request.getParameter()獲取參數(shù)、在dao手動(dòng)去寫sql,不管啥業(yè)務(wù),這些東西都是一樣的,框架就將這些給你封裝好啦) 2、解決的問題解決的是技術(shù)整合問題。軟件開發(fā)環(huán)境和規(guī)模都很大,不可能任何一個(gè)項(xiàng)目的代碼都從零開始,此時(shí)就需要一個(gè)非常優(yōu)秀的框架把基礎(chǔ)技術(shù)整合完畢,我們在他的基礎(chǔ)上進(jìn)一步開發(fā)。提高性能,易擴(kuò)展,易維護(hù),最終提高整個(gè)團(tuán)隊(duì)的開發(fā)效率 3、怎么用框架呢?(1) 導(dǎo)入相關(guān)坐標(biāo)(jar包)(2) 框架運(yùn)行細(xì)節(jié)定義,編寫配置文件(每個(gè)框架都有自己的配置文件呀)(3) 調(diào)用框架中的API2、Mybatis框架的好處
1、原先使用jdbc時(shí)每次CRUD都要寫那六大步驟,太冗余了吧 而且:(1)頻繁連接,釋放數(shù)據(jù)庫資源,降低系統(tǒng)性能(2)SQL語句硬編碼,難以維護(hù)(sql都寫到.java里了)(3)參數(shù)和占位符對應(yīng)問題(4)結(jié)果集解析復(fù)雜,列名硬編碼 2、mybatis框架是一個(gè)very優(yōu)秀的持久層(dao)框架,對JDBC進(jìn)行了封裝,使得開發(fā)者只需要關(guān)注Sql語句(業(yè)務(wù))本身即可,無需開發(fā)者處理加載驅(qū)動(dòng)、獲取連接、創(chuàng)建Statement等繁瑣的過程。實(shí)現(xiàn)了ORM思想3、如何理解ORM思想呢?
對象關(guān)系映射
將數(shù)據(jù)庫中的關(guān)系數(shù)據(jù)表映射為JAVA中的對象,把對數(shù)據(jù)表的操作轉(zhuǎn)換為對對象的操作,實(shí)現(xiàn)面向?qū)ο缶幊獭R虼薕RM的目的是使得開發(fā)人員以面向?qū)ο蟮乃枷雭聿僮鲾?shù)據(jù)庫。Mybatis框架是一個(gè)半自動(dòng)的ORM持久層框架,也可以在Java中實(shí)現(xiàn)類似 insert(User)的操作最終操作數(shù)據(jù)庫,但是需要我們自己寫Sql語句。Mybatis是目前比較流行的Dao層框架。4、Mybatis的編程步驟
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-FzpbauxZ-1639100484220)(img/2.png)]
//1、加載核心配置文件 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //2、創(chuàng)建構(gòu)建器 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3、構(gòu)建SqlSession工廠 SqlSessionFactory sqlSessionFactory = builder.build(inputStream); //4、生產(chǎn)SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //5、執(zhí)行業(yè)務(wù)User user = sqlSession.selectOne("test.queryUserById",2);System.out.println(user); //6、釋放資源sqlSession.close();5、#{} 和 ${} 的區(qū)別
1. #{}是預(yù)編譯處理,${}是字符串替換。2. Mybatis在處理#{}時(shí),會(huì)將sql中的#{}替換為?號(hào),調(diào)用PreparedStatement的set方法來賦值;3. Mybatis在處理${}時(shí),就是把${}替換成變量的值,相當(dāng)于字符串拼接4. 使用#{}可以有效的防止SQL注入,提高系統(tǒng)安全性。6、動(dòng)態(tài)代理開發(fā)方式的好處以及規(guī)范是什么
定義一個(gè)Mapper接口,這個(gè)接口其實(shí)和我們UserDao接口是一樣的,從Mybatis框架中拿到一個(gè)代理對象(代理的是這個(gè)Mapper接口),通過代理對象調(diào)用接口當(dāng)中的方法完成業(yè)務(wù)。四大規(guī)范: 1、sql映射文件的namespace必須和mapper接口的全限定類名保持一致 2、mapper接口的接口方法名必須和xml中的sql語句id保持一致 3、mapper接口的接口方法形參類型必須和sql語句的輸入?yún)?shù)類型保持一致 4、mapper接口的接口方法返回類型必須和sql語句的resultType保持一致7、mybatis的配置文件有哪些?作用是啥
-
SqlMapperConfig.xml:
主配置文件
-
寫sql的配置文件
比如:<select>、<update>、<insert>、<delete>
8、MyBatis應(yīng)用動(dòng)態(tài)SQL解決了什么問題?
有時(shí)候,固定的sql語句不能夠滿足我們的應(yīng)用需求。這個(gè)時(shí)候需要在 標(biāo)準(zhǔn)的基礎(chǔ)上建立動(dòng)態(tài)的查詢語句。 Mybatis提供了多種注解,可以提供動(dòng)態(tài)查詢語言。比如說在開發(fā)的時(shí)候,遇到這樣的場景,界面提供了多種查詢,但是都是非必填寫,在選擇查詢條件時(shí)可以選中任意幾種組合作為查詢條件,如果在使用jdbc的時(shí)候,需要判斷參數(shù)為空,自己組裝sql,但是mybatis提供動(dòng)態(tài)sql機(jī)制,依靠標(biāo)簽。應(yīng)用場景:比如模塊的多條件查詢時(shí)9、Mybatis的緩存
緩存作用:提升查詢效率
1.mybatis 一級(jí)緩存是 SqlSession 級(jí)別的緩存,默認(rèn)支持一級(jí)緩存,不需要在配置文件去配 置。 2.mybaits 的二級(jí)緩存是 mapper 范圍級(jí)別,除了在 SqlMapConfig.xml 設(shè)置二級(jí)緩存的總開關(guān) <settingname='cacheEnabled'value='true'/>,還要在具體的 mapper.xml 中開啟二級(jí)緩存:<mappernamespace='cn.hpu.mybatis.mapper.UserMapper'>10、Mybatis如何處理多對多關(guān)系?舉一個(gè)多對多的例子
比如說學(xué)生表和課程表,一個(gè)學(xué)生可以選擇多門課程, 一門課程都能被多個(gè)學(xué)生選擇,這 樣兩張表的關(guān)系就是多對多的關(guān)系, 怎么處理多對多的情況? 遇到這種情況我們得創(chuàng)建一 張中間的橋表,關(guān)聯(lián)后就是 課程表對橋表就是一對多,學(xué)生表對橋表也是一對多,就可以了11、Mybatis是否支持延遲加載?如果支持,它的實(shí)現(xiàn)原理是什么?
(1)Mybatis僅支持association關(guān)聯(lián)對象和collection關(guān)聯(lián)集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false。(2)它的原理是,使用CGLIB創(chuàng)建目標(biāo)對象的代理對象,當(dāng)調(diào)用目標(biāo)方法時(shí),進(jìn)入攔截器方法,比如調(diào)用a.getB().getName(),攔截器invoke()方法發(fā)現(xiàn)a.getB()是null值,那么就會(huì)單獨(dú)發(fā)送事先保存好的查詢關(guān)聯(lián)B對象的sql,把B查詢上來,然后調(diào)用a.setB(b),于是a的對象b屬性就有值了,接著完成a.getB().getName()方法的調(diào)用。這就是延遲加載的基本原理。12、Mybatis是如何將sql執(zhí)行結(jié)果封裝為目標(biāo)對象并返回的?都有哪些映射形式?
第一種是使用<resultMap>標(biāo)簽,逐一定義列名和對象屬性名之間的映射關(guān)系。第二種是使用sql列的別名功能,將列別名書寫為對象屬性名,比如T_NAME AS NAME,對象屬性名一般是name,小寫,但是列名不區(qū)分大小寫,Mybatis會(huì)忽略列名大小寫,智能找到與之對應(yīng)對象屬性名,你甚至可以寫成T_NAME AS NaMe,Mybatis一樣可以正常工作。13、Mybatis都有哪些Executor執(zhí)行器?它們之間的區(qū)別是什么?
Mybatis有三種基本的Executor執(zhí)行器,SimpleExecutor、ReuseExecutor、BatchExecutor。 1.SimpleExecutor:每執(zhí)行一次update或select,就開啟一個(gè)Statement對象,用完立刻關(guān)閉Statement對象。 2.ReuseExecutor:執(zhí)行update或select,以sql作為key查找Statement對象,存在就使用,不存在就創(chuàng)建,用完后,不關(guān)閉Statement對象,而是放置于Map<String, Statement>內(nèi),供下一次使用。簡言之,就是重復(fù)使用Statement對象。 3.BatchExecutor:執(zhí)行update(沒有select,JDBC批處理不支持select),將所有sql都添加到批處理中(addBatch()),等待統(tǒng)一執(zhí)行(executeBatch()),它緩存了多個(gè)Statement對象,每個(gè)Statement對象都是addBatch()完畢后,等待逐一執(zhí)行executeBatch()批處理。與JDBC批處理相同。 作用范圍:Executor的這些特點(diǎn),都嚴(yán)格限制在SqlSession生命周期范圍內(nèi)。二、Spring
1、你覺得Spring框架有什么優(yōu)勢?
-
方便解耦,簡化開發(fā)
通過 Spring 提供的 IoC 容器,可以將對象間的依賴關(guān)系交由 Spring 進(jìn)行控制,避免硬編碼所造成的過度程序耦合。用戶也不必再為單例模式類、屬性文件解析等這些很底層的需求編寫代碼,可以更專注于上層的應(yīng)用。 UserService{//硬編碼private UserDao userDao = new UserDaoImpl(); } -
AOP編程的支持
-
聲明式事務(wù)的支持
可以將我們從單調(diào)煩悶的事務(wù)管理代碼中解脫出來,通過聲明式方式靈活的進(jìn)行事務(wù)的管理,提高開發(fā)效率和質(zhì)量。 -
方便程序的測試
- 方便集成各種優(yōu)秀框架
- 降低 JavaEE API 的使用難度
- Java 源碼是經(jīng)典學(xué)習(xí)范例
2、如何理解Spring的IOC思想
1、想了解IOC,先看下該概念 解耦合 軟件設(shè)計(jì)原則:高內(nèi)聚,低耦合 內(nèi)聚:一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度,描述的是模塊內(nèi)的功能聯(lián)系 耦合:是軟件結(jié)構(gòu)中各模塊之間相互連接的一種度量 簡而言之:高內(nèi)聚,低耦合,其實(shí)就是同一個(gè)模塊內(nèi)的各個(gè)元素之間要高度緊密,但是各個(gè)模塊之間的相互依存度卻不要那么緊密 2、IOC 全稱是Inversion Of Control,意為控制反轉(zhuǎn),不是一個(gè)技術(shù),而是一種思想 其作用是用于削減代碼間的耦合。它的實(shí)現(xiàn)思想就是利用了工廠設(shè)計(jì)模式,把創(chuàng)建對象代碼從具體類中剝離出去,交由工廠來完成,從而降低代碼間的依賴關(guān)系。作用:它是用于降低我們代碼間的依賴關(guān)系,削減程序中的耦合。3、如何理解Spring中的依賴注入(DI)
1、什么是依賴注入就是讓spring框架給Bean對象的屬性進(jìn)行賦值. 它是 spring 框架核心 ioc 的具體實(shí)現(xiàn)我們的程序在編寫時(shí), 通過控制反轉(zhuǎn),把對象的創(chuàng)建交給了 spring,但是代碼中不可能出現(xiàn)沒有依賴的情況。ioc 解耦只是降低他們的依賴關(guān)系,但不會(huì)消除。 例如:我們的業(yè)務(wù)層仍會(huì)調(diào)用持久層的方法。那這種業(yè)務(wù)層和持久層的依賴關(guān)系, 在使用 spring 之后, 就讓 spring 來維護(hù)了。簡單的說,依賴注入(DI)就是坐等框架把持久層對象傳入業(yè)務(wù)層,而不用我們自己去獲取 2、依賴注入的幾種方式 (1)使用構(gòu)造函數(shù)方式注入 (2)使用set方法方式注入 p名稱空間 (3)靜態(tài)工廠的方法注入 (4)實(shí)例工廠的方法注入4、Spring框架的常用注解有哪些?
1、@Component :將普通pojo實(shí)例化到spring容器中,相當(dāng)于配置文件中的 <bean id="" class=""> 以及三個(gè)衍生注解@Controller:控制器層用@Service:服務(wù)層用@Repository:dao層用 2、依賴注入注解@Autowired注解:按類型注入@Qualifier("id") 注解 按照id注入@Resource注解 3、@Configuration標(biāo)識(shí)當(dāng)前類是Spring的一個(gè)配置類@ComponentScan替代xml中的`<context:component-scan/>`@Import引入其他配置類,被引入的配置類可以不加@Configuration注解 @PropertySource:引入外部properties文件,注意加classpath: @Value對成員變量賦值 @Bean將一個(gè)方法的返回值對象加入到Spring的容器當(dāng)中管理 @Qualifier可以使用在方法參數(shù)上,表明對應(yīng)的形參引入/注入的對象類型5、你們公司使用SSM框架采用的注解方式還是XML方式開發(fā)?
企業(yè)主流的開發(fā)方式:半注解半xml開發(fā)
往往第三方j(luò)ar中的對象我們使用xml配置(比如druid數(shù)據(jù)庫連接池、Mybatis的SQLSessionFactory),類似于service層和dao層的實(shí)現(xiàn)類,這屬于我們自己寫的代碼,往往會(huì)使用注解,這就是半xml半注解的模式6、你對Spring的AOP如何理解?
1、AOP:面向切面編程它是一種編程思想,一種設(shè)計(jì)理念,是OOP的一種延續(xù)。運(yùn)用AOP編程思想,可以提高代碼的可重用性,使編碼更加簡潔,更易于維護(hù)。簡單的說它就是把我們程序重復(fù)的代碼抽取出來,在需要執(zhí)行的時(shí)候,使用動(dòng)態(tài)代理的技術(shù),在不修改源碼的基礎(chǔ)上,對我們的已有方法進(jìn)行增強(qiáng)。 2、應(yīng)用場景:事務(wù)和日志、統(tǒng)計(jì)方法執(zhí)行效率7、簡述一下Spring支持的事物管理有哪些?
1.聲明式事務(wù)管理:設(shè)置配置文件與先前比照簡化了許多。我們把這類設(shè)置配置文件格式稱為 Spring 經(jīng)典的聲明式事務(wù)治理。 2.編程式事務(wù)管理:為了不損壞代碼原有的條理性,避免出現(xiàn)每一個(gè)方法中都包括相同的啟動(dòng)事物、提交、回滾事物樣板代碼的現(xiàn)象,spring 提供了 transactionTemplate 模板來實(shí)現(xiàn)編程式事務(wù)管理。這種方式意味著你可以將事務(wù)管理和業(yè)務(wù)代碼分離。你只需要通過注解或者XML配置管理事務(wù)。 3.區(qū)別(1)編程式事務(wù)是自己寫事務(wù)處理的類,然后調(diào)用。(2)聲明式事務(wù)是在配置文件中配置,一般搭配在框架里面使用。8、事物的四大特性有哪些(ACID)?
1.原子性:事務(wù)是最小的執(zhí)行單位,不允許分割。事務(wù)的原子性確保動(dòng)作要么全部完成,要么完全不起作用; 2.一致性:執(zhí)行事務(wù)前后,數(shù)據(jù)保持一致,多個(gè)事務(wù)對同一個(gè)數(shù)據(jù)讀取的結(jié)果是相同的; 3.隔離性:并發(fā)訪問數(shù)據(jù)庫時(shí),一個(gè)用戶的事務(wù)不被其他事務(wù)所干擾,各并發(fā)事務(wù)之間數(shù)據(jù)庫是獨(dú)立的; 4.持久性:一個(gè)事務(wù)被提交之后。它對數(shù)據(jù)庫中數(shù)據(jù)的改變是持久的,即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。9、Spring的事物管理機(jī)制實(shí)現(xiàn)原理?
Spring的事務(wù)管理機(jī)制實(shí)現(xiàn)的原理,就是通過這樣一個(gè)動(dòng)態(tài)代理對所有需要事務(wù)管理的Bean進(jìn)行加載,并根據(jù)配置在invoke方法中對當(dāng)前調(diào)用的 方法名進(jìn)行判定,并在method.invoke方法前后為其加上合適的事務(wù)管理代碼,這樣就實(shí)現(xiàn)了Spring式的事務(wù)管理。Spring中的AOP實(shí) 現(xiàn)更為復(fù)雜和靈活,不過基本原理是一致的。10、請解釋Spring Bean的生命周期?
1.Spring Bean的生命周期簡單易懂。在一個(gè)bean實(shí)例被初始化時(shí),需要執(zhí)行一系列的初始化操作以達(dá)到可用的狀態(tài)。同樣,當(dāng)一個(gè)bean不在被調(diào)用時(shí)需要進(jìn)行相關(guān)的析構(gòu)操作,并從bean容器中移除。 2.Spring bean factory 負(fù)責(zé)管理在spring容器中被創(chuàng)建的bean的生命周期。Bean的生命周期由兩組回調(diào)(call back)方法組成。 初始化之后調(diào)用的回調(diào)方法。 銷毀之前調(diào)用的回調(diào)方法。 Spring框架提供了以下四種方式來管理bean的生命周期事件:(1)InitializingBean和DisposableBean回調(diào)接口(2)針對特殊行為的其他Aware接口(3)Bean配置文件中的Custom init()方法和destroy()方法w(4)@PostConstruct和@PreDestroy注解方式實(shí)例化 Instantiation 屬性賦值 Populate 初始化 Initialization 銷毀 Destruction11、Spring 中@Autowired 和@Resource 的區(qū)別
1.@Autowired 默認(rèn)的是按照類型進(jìn)行注入, 如果沒有類型會(huì)按照名稱進(jìn)行注入. 如果想直接按照名稱注入需要加入@Qualifier("gatheringDao") @Autowired @Qualifier("gatheringDao") private GatheringDao gatheringDao; 2.@Resource 默認(rèn)的會(huì)按照名稱注入,名稱找不著會(huì)按照類型來找,如果這里寫了名稱,就直接 按照名稱找了不會(huì)按類型找@Resource(name = "aaa") @Resource private GatheringDao gatheringDao;12、Spring 中用到了那些設(shè)計(jì)模式?
Spring框架中使用到了大量的設(shè)計(jì)模式,下面列舉了比較有代表性的: 1.代理模式—在AOP和remoting中被用的比較多。 2.單例模式—在spring配置文件中定義的bean默認(rèn)為單例模式。 3.模板方法—用來解決代碼重復(fù)的問題。比如. RestTemplate, JmsTemplate, JpaTemplate。 4.工廠模式—BeanFactory用來創(chuàng)建對象的實(shí)例。 適配器–spring aop 裝飾器–spring data hashmapper 觀察者– spring 時(shí)間驅(qū)動(dòng)模型 回調(diào)–Spring ResourceLoaderAware回調(diào)接口13、Spring 如何保證 Controller 并發(fā)的安全
Spring 多線程請求過來調(diào)用的Controller對象都是一個(gè),而不是一個(gè)請求過來就創(chuàng)建一個(gè)Controller對象。并發(fā)的安全? 原因就在于Controller對象是單例的,那么如果不小心在類中定義了類變量,那么這個(gè)類變量是被所有請求共享的,這可能會(huì)造成多個(gè)請求修改該變量的值,出現(xiàn)與預(yù)期結(jié)果不符合的異常那有沒有辦法讓Controller不以單例而以每次請求都重新創(chuàng)建的形式存在呢?答案是當(dāng)然可以,只需要在類上添加注解@Scope(“prototype”)即可,這樣每次請求調(diào)用的類都是重新生成的(每次生成會(huì)影響效率)雖然這樣可以解決問題,但增加了時(shí)間成本,總讓人不爽,還有其他方法么?答案是肯定的!使用ThreadLocal來保存類變量,將類變量保存在線程的變量域中,讓不同的請求隔離開來14、什么是基于Java的Spring注解配置? 給一些注解的例子?
基于Java的配置,允許你在少量的Java注解的幫助下,進(jìn)行你的大部分Spring配置而非通過XML文件。以@Configuration 注解為例,它用來標(biāo)記類可以當(dāng)做一個(gè)bean的定義,被Spring IOC容器使用。另一個(gè)例子是@Bean注解,它表示此方法將要返回一個(gè)對象,作為一個(gè)bean注冊進(jìn)Spring應(yīng)用上下文。15、Spring如何解決循環(huán)依賴問題
spring提供的兩種注入方式,構(gòu)造注入和setter,那其實(shí)構(gòu)造注入時(shí)如果發(fā)現(xiàn)循環(huán)依賴會(huì)直接初始化容器失敗,setter注入是采用三級(jí)緩存,發(fā)現(xiàn)循環(huán)依賴會(huì)有一個(gè)半初始化狀態(tài)進(jìn)行流轉(zhuǎn)。 1.架構(gòu)問題,優(yōu)先架構(gòu)重構(gòu) 2.@lazy懶加載 3.不用構(gòu)造器注入改用set,Spring已經(jīng)幫忙解決16、Spring如何處理線程并發(fā)問題?
在一般情況下,只有無狀態(tài)的Bean才可以在多線程環(huán)境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域,因?yàn)镾pring對一些Bean中非線程安全狀態(tài)采用ThreadLocal進(jìn)行處理,解決線程安全問題。ThreadLocal和線程同步機(jī)制都是為了解決多線程中相同變量的訪問沖突問題。同步機(jī)制采用了“時(shí)間換空間”的方式,僅提供一份變量,不同的線程在訪問前需要獲取鎖,沒獲得鎖的線程則需要排隊(duì)。而ThreadLocal采用了“空間換時(shí)間”的方式。ThreadLocal會(huì)為每一個(gè)線程提供一個(gè)獨(dú)立的變量副本,從而隔離了多個(gè)線程對數(shù)據(jù)的訪問沖突。因?yàn)槊恳粋€(gè)線程都擁有自己的變量副本,從而也就沒有必要對該變量進(jìn)行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時(shí),可以把不安全的變量封裝進(jìn)ThreadLocal。三、SpringMvc
1、簡單描述一下你對SpringMVC的理解
SpringMVC是一個(gè)輕量級(jí)的Web表現(xiàn)層框架,用來寫Controller接收請求跳轉(zhuǎn)頁面的,它是Spring框架的一部分。SpringMVC是對Servlet的封裝和增強(qiáng),簡化了servlet的操作。它已經(jīng)超越了Struts2,成為目前最優(yōu)秀的表現(xiàn)層框架。 1、本質(zhì)web表現(xiàn)層的一個(gè)框架,主要用來接收請求、轉(zhuǎn)發(fā)請求、跳轉(zhuǎn)頁面 2、優(yōu)勢操作特簡單,性能特別高,靈活性特別強(qiáng)2、描述springmvc的處理流程吧
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-8Nh8YjAr-1639100484225)(img/1.png)]
- 第一步:用戶發(fā)送請求至前端控制器DispatcherServlet - 第二步:DispatcherServlet收到請求調(diào)用HandlerMapping處理器映射器 - 第三步:處理器映射器根據(jù)請求Url找到,具體的Handler(后端控制器),生成處理器對象及處理器攔截器(如果有則生成)一并返回DispatcherServlet - 第四步:DispatcherServlet調(diào)用HandlerAdapter處理器適配器去調(diào)用Handler - 第五步:處理器適配器執(zhí)行Handler - 第六步:Handler執(zhí)行完成給處理器適配器返回ModelAndView - 第七步:處理器適配器向前端控制器返回 ModelAndView,ModelAndView 是SpringMVC 框架的一個(gè)底層對象,包括 Model 和 View - 第八步:前端控制器請求視圖解析器去進(jìn)行視圖解析,根據(jù)邏輯視圖名來解析真正的視圖。 - 第九步:視圖解析器向前端控制器返回View - 第十步:前端控制器進(jìn)行視圖渲染,就是將模型數(shù)據(jù)(在 ModelAndView 對象中)填充到 request 域 - 第十一步:前端控制器向用戶響應(yīng)結(jié)果3、介紹一下SpringMvc中的組件以及作用
1、DispatcherServlet:前端控制器接收用戶請求,響應(yīng)結(jié)果,相當(dāng)于中央處理器,DispatcherServlet是整個(gè)流程控制的中心,由它調(diào)用其它組件完成用戶請求的處理。DispatcherServlet的存在降低了組件之間的耦合性 2、HandlerMapping:處理器映射器理解為一個(gè)Map<url,Hanlder>,HandlerMapping負(fù)責(zé)根據(jù)用戶請求的Url找到Handler即處理器,SpringMVC提供了不同的映射器來實(shí)現(xiàn)不同的映射方式,例如:實(shí)現(xiàn)接口方式,注解方式等。 3、Handler:處理器在SpringMVC當(dāng)中有兩層意思:Controller或者Controller當(dāng)中的方法,Handler相對于前端控制器DispatcherServlet來說是后端控制器,執(zhí)行具體業(yè)務(wù)處理的,它在DispatcherServlet的控制下處理用戶的具體請求。 4、HandlAdapter:處理器適配器不同的接口類型轉(zhuǎn)換成usb,體現(xiàn)了萬物歸一的思想,通過HandlerAdapter對Handler處理器進(jìn)行執(zhí)行,這是適配器模式的應(yīng)用 5、ViewResolver:視圖解析器ViewResolver進(jìn)行視圖解析,首先根據(jù)邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象。4、SpringMVC 的 controller 里可不可以寫成員變量?
可以寫啊,注入的 service 不就是成員變量么,你是不想問 struts2 里的獲取參數(shù)的方式啊? Struts2 早就不用了,他那種用成員變量獲取參數(shù)的方式,在高并發(fā)下會(huì)造成線程不安全, springmvc 是使用的形參接收前臺(tái)數(shù)據(jù)的,線程比較安全。5、如何開啟注解處理器和適配器?
我們在項(xiàng)目中一般會(huì)在 springmvc.xml 中通過開啟 <mvc:annotation-driven> 來實(shí)現(xiàn)注解處理器和適配器的開啟.6、SpringMVC如何與Ajax相互調(diào)用
通過Jackson框架把Java對象轉(zhuǎn)換成js可以識(shí)別的json對象
步驟: 1、加入Jackson.jar 2、配置json的映射 3、在接收Ajax方法里直接返回Object、List等,方法前要加@RequestBody注解7、簡述web.xml的作用?
web中可以沒有web.xml文件,也就是說,web.xml文件并不是web工程必須的。 web.xml文件是用來初始化配置信息:比如Welcome頁面、servlet、servlet-mapping、filter、listener、啟動(dòng)加載級(jí)別等。 當(dāng)你的web工程沒用到這些時(shí),你可以不用web.xml文件來配置你的Application。注解處理器和適配器?
我們在項(xiàng)目中一般會(huì)在 springmvc.xml 中通過開啟 <mvc:annotation-driven> 來實(shí)現(xiàn)注解處理器和適配器的開啟.6、SpringMVC如何與Ajax相互調(diào)用
通過Jackson框架把Java對象轉(zhuǎn)換成js可以識(shí)別的json對象
步驟: 1、加入Jackson.jar 2、配置json的映射 3、在接收Ajax方法里直接返回Object、List等,方法前要加@RequestBody注解7、簡述web.xml的作用?
web中可以沒有web.xml文件,也就是說,web.xml文件并不是web工程必須的。 web.xml文件是用來初始化配置信息:比如Welcome頁面、servlet、servlet-mapping、filter、listener、啟動(dòng)加載級(jí)別等。 當(dāng)你的web工程沒用到這些時(shí),你可以不用web.xml文件來配置你的Application。總結(jié)
- 上一篇: java正则表达 w_正则表达式[\s\
- 下一篇: 怎么让wegame适应屏幕大小_iOS的