Spring與SpringMVC 常見面試問題
1、 什麼是Spring
Spring是一個開源框架,為簡化企業級開發而生,同時Spring是一個IOC(DI)和AOP容器框架。
Spring的優點:
非侵入式:基於Spring開發的應用中的物件可以不依賴於Spring的API
依賴注入:DI——Dependency Injection,反轉控制(IOC)最經典的實現。
面向切面程式設計:Aspect Oriented Programming——AOP
容器:Spring是一個容器,因為它包含並且管理應用物件的生命週期
元件化:Spring實現了使用簡單的元件配置組合成一個複雜的應用。在 Spring 中可以 使用XML和Java註解組合這些物件。
一站式:在IOC和AOP的基礎上可以整合各種企業應用的開源框架和優秀的第三方類庫(實際上Spring 自身也提供了表述層的SpringMVC和持久層的Spring JDBC)。
2、 什麼是ioc 什麼是依賴注入
Ioc:inversion of control 控制反轉 我們不再手動建立物件 而是將物件的建立權交給IOC容器,需要獲取物件時直接從IOC容器中獲取
DI:dependency injection 依賴注入 IOC的另一種表述方式:即元件以一些預先定義好的方式(例如:setter 方法)接受來自於容器的資源注入。
3、 IOC開發中怎麼實現?兩種方式:xml 註解
通過配置Spring.xml檔案 或者使用註解
4、 ioc XML檔案實現方式,註解實現方式
1>在spring.xml檔案裡 寫一個元件<bean>併為其賦值 然後在需要的地方 通過例項化IOC容器 根據元件對應的型別或id值 從容器中提取 ClassPathXmlApplicationContext
2>使用註解,需要先在web.xml檔案中配置監聽器ContextLoaderListener 再在dao層使用註解@Reponsitory service層加註解@Service WEB層加註解@Controller 需要使用物件的時候 使用@Autowired註解 這樣IOC容器就會自動建立好這個物件
5、@AutoWired註解查詢規則
會按照型別在IOC容器中查詢
找到一個符合要求的就會自動裝配
沒有找到會報錯
找到多個: 使用變數名作為id進行查詢,找到就自動裝配;或者使用註解@qualifier根據指定id進行查詢,找不到就會報錯。
6、掃包標籤
context:component-scan
7、引入外部檔案(控制資料來源)
context:property-placeholder location="classpath:db.properties"
8、IOC怎麼建立多例項
在bean標籤中加入屬性scope(“prototype”)
9、什麼是SpringMVC
是一種輕量級的、基於mvc的web層應用框架。
SpringMVC的優點:
1>天生與Spring框架整合,如:(IOC,AOP)
2>支援Restful風格
3>進行更簡潔的Web層開發
4>支援靈活的URL到頁面控制器的對映
5>非常容易與其他檢視技術整合,如:Velocity、FreeMarker等等。
6>因為模型資料不存放在特定的API裡,而是放在一個Model裡(Map資料結構實現,因 此很容易被其他框架使用)
7>非常靈活的資料驗證、格式化和資料繫結機制、能使用任何物件進行資料繫結,不必實現特定框架的API
8>更加簡單、強大的異常處理
9>對靜態資源的支援
10>支援靈活的本地化、主題等解析
10、SpringMVC怎麼用
1>在POM檔案中新增依賴 引入spring-web和spring-webmvc兩個jar包
2>在web.xml中新增前端控制器:dispatcharServlet
3>在類上加@Controller註解 標明該類為控制器
4>類中的一個方法對應一個請求配置請求路徑的對映:@RequestMapping
11、SpringMVC的執行流程
1>頁面傳送請求
2>前端控制器接收到這個請求
3>去容器中觀察所有的@Controller元件,哪個元件能處理這個請求
4>看方法上的@RequestMapping標註是否和請求地址一樣
5>按照頁面地址 轉發到這個路徑下的方法
12、@RequestMapping註解什麼意思,寫在哪,分別表示什麼意思,屬性設定
該註解表示請求路徑對映方法名
可以寫在方法上,表示跳轉路徑(對映)
也可以寫在類上,表示根目錄
可以包含的屬性有:value 請求路徑的對映,作為處理請求的方法
Method 設定請求方式
Params 限定攜帶引數
Heads 設定請求頭
13、入參處理 單個變數,多個變數 @requestparam註解的屬性設定 傳入原生api
單個變數:獲取超連結中的引數
當超連結中的變數名與方法引數的變數名一致時,可以直接獲取
當超連結中的變數名與方法引數的變數名不一致是,通過註解@RequestParam獲取超連結中的引數 但這就要求超連結中必須攜帶該引數
傳遞給實體類,可以通過form表單,input輸入框向實體類傳值 但是要求name值與實體類屬性名一致
@RequestParam要求超連結中必須存在所標明的引數 如果沒有 就會報錯 如果不希望報錯並且如果超連結中未攜帶指定引數 就給它指定一個預設值,可以設定required=”false”(不在出現異常) dufaultValue=””(超連結未攜帶指定引數將用此值作為預設值)
原生API 在方法引數列表傳入HttpServletRequest request 然後在方法裡request.getParameter(“超連結中引數名”)
14、出參處理
在方法引數列表中傳入隱藏物件模型:Model model、 Map<String,Object> map ModelMap modelmap 將資料存入物件模型中(其實是存入了request域中) 前臺可以通過EL表示式獲取
或者使用servlet原生API 存入域中(request,response,session.......),前臺同樣使用EL表示式獲取
15、如何處理時間型別
在pojo類中使用Date的屬性上添加註解,form表單中提交的資料格式 與 註解中宣告的格式統一即可
接收到資料後在Student 物件中 ,傳入dao層 存入資料庫時,需要java.util.Date 轉為java.sql.Date 裝填佔位符:
new java.sql.Date(stu.getBirth().getTime());
#$#$$$#$(這裡的截圖不知原因上不去就省略了)%#$%$#
16、在springmvc中如何使用ajax,ajax請求的語法格式
匯入jackson json處理工具包
在需要使用ajax傳送資料至前臺頁面的方法上加上註解@ResponseBody
如果要獲取ajax從前臺傳到後臺的資料,在需要注入該資料的引數前加上註解@RequestBody
Ajax語法格式:
$(function(){
$.ajax({
type:”提交方式get/post”,
dataType:”資料傳輸格式json”,
data:{前臺向後臺傳輸的資料 a:a},
success:function(data){
成功回撥函式
}
})
})
17、檔案上傳的步驟
1> 在本地tomcat中設定真實上傳路徑以及虛擬路徑
2> 導包:commons-fileupload
3> springmvc 配置檔案上傳解析器CommonsMultipartResolver
4> jsp頁面 使用表單新增屬性enctype="multipart/form-data" 新增輸入框<input type="file" name="picurl">
5>controller控制器 獲取檔案 方法引數使用MutilpartFile picurl
呼叫picurl.getOriginalFilename();獲取檔名
然後呼叫picurl.transferTo(new File("檔案上傳路徑"+檔名))開始上傳檔案
18、springmvc如何處理異常
三種方法
1>在本類中:在方法上使用@ExceptionHandler 宣告屬性value={具體的異常類.class}如果不知道是什麼型別的 可以寫成Exception e 因為Exception是所有異常類的父類,但是如果有精確處理,會優先走精確處理
2>外部處理類來處理異常
關鍵註解:@ControllerAdvice
在方法上使用@ExceptionHandler 宣告屬性value={具體的異常類.class}
3>在springmvc中配置異常處理解析器
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArithmeticException">error2</prop>
<prop key="java.lang.NullPointerException">error2</prop>
</props>
</property>
</bean>
若想將錯誤資訊顯示在頁面上 可以使用ModelAndView模型物件 將錯誤資訊存入其中
異常處理的優先級別:本類>外部處理類>配置檔案
19、soringmvc攔截器
定義:Spring Web MVC 的處理器攔截器類似於Servlet 開發中的過濾器Filter,用於對處理器進行預處理和後處理。
如何使用:宣告一個類 實現HandlerInterceptor介面 重寫裡面的方法,在springmvc.xml檔案中使用mvc名稱空間配置攔截器:
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置商品被攔截器攔截 -->
<mvc:mapping path="/bill/**" /> 要攔截的方法
<!-- 配置具體的攔截器 -->
<bean class="com.buba.lanjie.Lanjieqi" /> 宣告的異常類的物件建立
</mvc:interceptor>
</mvc:interceptors>
20、頁面發起請求的方式,controller怎麼接收引數
頁面發起請求向後臺傳輸資料的方式:超連結、ajax、form表單
Controller接收時,如果引數名相同,直接接收;
如果引數名不同,使用註解@RequestParam(“請求中攜帶的引數名”),將引數注入到方法的引數中
21、Controller層怎麼傳遞資料給頁面,頁面怎麼獲取
可以將資料傳入隱藏模型物件Model、Map、ModelMap、ModelAndView ,前臺使用EL表示式從request域中獲取資料;
可以使用servlet原生api 將資料存入指定的域中,前臺通過EL表示式從對應的域中獲取
可以通過ajax傳遞資料,前臺通過ajax的成功回撥函式,獲取後臺傳過來的資料。