2020年SpringMVC最新面試題,看這篇就足夠了

1. 什麼是SpringMVC?

  1. SpringMVC是一種基於 Java 的實現MVC設計模型的請求驅動類型的輕量級Web框架,屬於Spring框架的一個模塊。
  2. 它通過一套註解,讓一個簡單的Java類成爲處理請求的控制器,而無須實現任何接口。同時它還支持RESTful編程風格的請求。

2.什麼是MVC模式?

在這裏插入圖片描述

  1. MVC的全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,是一種軟件設計典範。它是用一種業務邏輯、數據與界面顯示分離的方法來組織代碼,將衆多的業務邏輯聚集到一個部件裏面,在需要改進和個性化定製界面及用戶交互的同時,不需要重新編寫業務邏輯,達到減少編碼的時間。
  2. V即View視圖是指用戶看到並與之交互的界面。比如由html元素組成的網頁界面,或者軟件的客戶端界面。MVC的好處之一在於它能爲應用程序處理很多不同的視圖。在視圖中其實沒有真正的處理髮生,它只是作爲一種輸出數據並允許用戶操縱的方式。
  3. M即model模型是指模型表示業務規則。在MVC的三個部件中,模型擁有最多的處理任務。被模型返回的數據是中立的,模型與數據格式無關,這樣一個模型能爲多個視圖提供數據,由於應用於模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重複性。
  4. C即controller控制器是指控制器接受用戶的輸入並調用模型和視圖去完成用戶的需求,控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定調用哪個模型構件去處理請求,然後再確定用哪個視圖來顯示返回的數據。

3.SpringMVC的執行流程?

在這裏插入圖片描述

  1. 用戶點擊某個請求路徑,發起一個request請求,此請求會被前端控制器處理。
  2. 前端控制器請求處理器映射器去查找Handler。可以依據註解或者XML配置去查找。
  3. 處理器映射器根據配置找到相應的Handler(可能包含若干個Interceptor攔截器),返回給前端控制器。
  4. 前端控制器請求處理器適配器去執行相應的Handler處理器(常稱爲Controller)。
  5. 處理器適配器執行Handler處理器。
  6. Handler處理器執行完畢之後會返回給處理器適配器一個ModelAndView對象(SpringMVC底層對象,包括Model數據模型和View視圖信息)。
  7. 處理器適配器接收到Handler處理器返回的ModelAndView後,將其返回給前端控制器。
  8. 前端控制器接收到ModelAndView後,會請求視圖解析器(ViewResolver)對視圖進行解析。
  9. 視圖解析器根據View信息匹配到相應的視圖結果,反饋給前端控制器。
  10. 前端控制器收到View具體視圖後,進行視圖渲染,將Model中的模型數據填充到View視圖中的request域,生成最終的視圖(View)。
  11. 前端控制器向用戶返回請求結果。

4.SpringMVC有哪些優點?

  1. SpringMVC本身是與Spring框架結合而成的,它同時擁有Spring的優點(例如依賴注入DI和切面編程AOP等)。
  2. SpringMVc提供強大的約定大於配置的契約式編程支持,即提供一種軟件設計範式,減少軟件開發人員做決定的次數,開發人員僅需規定應用中不符合約定的部分。
  3. 支持靈活的URL到頁面控制器的映射。
  4. 可以方便地與其他視圖技術(JSP、FreeMarker等)進行整合。由於SpringMVC的模型數據往往是放置在Map數據結構中的,因此其可以很方便地被其他框架引用。
  5. 擁有十分簡潔的異常處理機制。
  6. 可以十分靈活地實現數據驗證、格式化和數據綁定機制,可以使用任意對象進行數據綁定操作。
  7. 支持RestFul風格。

5.Spring MVC的主要組件?

  1. 前端控制器:其作用是接收用戶請求,然後給用戶反饋結果。它的作用相當於一個轉發器或中央處理器,控制整個流程的執行,對各個組件進行統一調度,以降低組件之間的耦合性,有利於組件之間的拓展。
  2. 處理器映射器:其作用是根據請求的URL路徑,通過註解或者XML配置,尋找匹配的處理器信息。
  3. 處理器適配器:其作用是根據映射器處理器找到的處理器信息,按照特定規則執行相關的處理器(Handler)。
  4. 處理器:其作用是執行相關的請求處理邏輯,並返回相應的數據和視圖信息,將其封裝至ModelAndView對象中。
  5. 視圖解析器:其作用是進行解析操作,通過ModelAndView對象中的View信息將邏輯視圖名解析成真正的視圖View(如通過一個JSP路徑返回一個真正的JSP頁面)。
  6. 視圖:View是一個接口,實現類支持不同的View類型(JSP、FreeMarker、Excel等)。

6.SpringMVC和Struts2的區別有哪些?

  1. SpringMVC的入口是一個Servlet,也就是前端控制器(DispatcherServlet),而Struts2的入口是一個Filter (StrutsPrepareAndExecuteFilter)。
  2. SpringMVC是基於方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計爲單例或多例(建議單例)。struts2是基於類開發,請求參數傳遞到類的成員屬性,只能設計爲多例。
  3. SpringMVC通過參數解析器將request請求內容解析,並給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最後又將ModelAndView中的模型數據通過reques域傳輸到頁面。Jsp視圖解析器默認使用JSTL。Struts2採用值棧存儲請求和響應的數據,通過OGNL存取數據。

7.SpringMVC怎麼樣設定重定向和請求轉發?

我們先說說請求轉發與重定向的區別:

請求轉發與重定向的區別

  1. 請求轉發在服務器端完成的;重定向是在客戶端完成的。
  2. 請求轉發的速度快;重定向速度慢。
  3. 請求轉發的是同一次請求;重定向是兩次不同請求。
  4. 請求轉發不會執行轉發後的代碼;重定向會執行重定向之後的代碼。
  5. 請求轉發地址欄沒有變化;重定向地址欄有變化。
  6. 請求轉發必須是在同一臺服務器下完成;重定向可以在不同的服務器下完成。

SpringMVC設定請求轉發

在返回值前面加"forward:"。

@RequestParam("/login")
public String redirect(User user){
    if{
        //登錄成功...
    }else{
        //登錄失敗,轉發到登錄頁面
        return "forward:tologin";
    }
}

SpringMVC設定重定向

在返回值前面加"redirect:"。例如我們在登錄的時候,登錄失敗會重定向到登錄頁面。

@RequestParam("/login")
public String redirect(User user){
    if{
        //登錄成功...
    }else{
        //登錄失敗,重定向到登錄頁面
        return "redirect:tologin";
    }
}

8.當一個方法向AJAX返回特殊對象,譬如Object,List等,需要做什麼處理?

  1. 在方法上加@ResponseBody註解,表示該方法的返回值不管是什麼類型,都會返回JSON格式的數據。
  2. 把原來Controller類上的@Controller註解替換爲@RestController註解。@RestController = @Controller + @ResponseBody,表明該Controller類所有的方法都返回JSON格式的數據(沒有加@RequestMapping註解的方法除外)。
  3. 加入@ResponseBody註解就能返回JSON格式數據的原因是:SpringMVC提供的HttpMessageConverter自動轉爲JSON ,如果使用了Jackson或者Gson,不需要額外配置就可以自動返回JSON了,因爲框架幫我們提供了對應的HttpMessageConverter ,如果使用了Alibaba的Fastjson的話,則需要自己手動提供一個相應的 HttpMessageConverter的實例。

9.如何解決POST請求中文亂碼問題,GET的又如何處理呢?

JavaWeb亂碼問題一般是客戶端(瀏覽器)與服務器端字符集不一致產生的,如果兩者字符集一致就不會出現亂碼問題。

解決post請求亂碼

SpringMVC默認提供一個解決post請求亂碼的過濾器,在web.xml中配置即可

<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

解決get請求亂碼

  1. 修改tomcat配置文件添加編碼與工程編碼一致。
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
  1. 對請求參數進行重新編碼,ISO8859-1是tomcat默認編碼,需要將tomcat編碼後的內容按utf-8編碼。
String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8");

10.Spring MVC的異常處理?

爲了減少文章篇幅,單獨把這這個問題的答案寫成一篇博客。
項目中出現異常怎麼辦?是時候瞭解SpringBoot全局異常處理機制

11.SpringMvc的控制器是不是單例模式,如果是,有什麼問題,怎麼解決?

  1. Controller是單例模式,在多線程訪問的時候可能產生線程安全問題,不要使用同步,會影響程序性能。
  2. 解決方案是在控制器裏面不能編寫成員屬性。

12.SpringMVC常用的註解有哪些?

@Controller

@Controller用於標記在一個類上,使用它標記的類就是一個SpringMVC Controller對象。處理器適配器將會掃描使用了該註解的類的方法,並檢測該方法是否使用了@RequestMapping註解。@Controller 只是定義了一個控制器類,而使用@RequestMapping 註解的方法纔是真正處理請求的處理器。

@RequsestMapping

@RequestMapping是一個用來處理請求地址映射的註解,可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作爲父路徑。返回值會通過視圖解析器解析爲實際的物理視圖,對於 InternalResourceViewResolver 視圖解析器,通過 prefix + returnValue + suffix 這樣的方式得到實際的物理視圖,然後做轉發操作。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

@RequsestMapping有如下6個屬性

  1. value:指定請求的實際地址。
  2. method:指定請求的method類型, GET、POST、PUT、DELETE等。
  3. consumes:指定處理請求的提交內容類型(Content-Type),例如application/json, text/html。
  4. produces:指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回;
  5. params:指定request中必須包含某些參數值是,才讓該方法處理。
  6. headers:指定request中必須包含某些指定的header值,才能讓該方法處理請求。

@ResponseBody

@ResponseBody把Java對象轉化爲json對象,這種方式用於Ajax異步請求,返回的不是一個頁面而是JSON格式的數據。

@Valid

標誌參數被Hibernate-Validator校驗框架校驗。

@PathVariable

  1. @PathVariable用於接收uri地址傳過來的參數,Url中可以通過一個或多個{Xxx}佔位符映射,通過@PathVariable可以綁定佔位符參數到方法參數中,在RestFul接口風格中經常使用。
  2. 例如:請求URL:http://localhost/user/21/張三/query
    (Long類型可以根據需求改變爲String或int,SpringMVC會自動做轉換)
@RequestMapping("/user/{userId}/{userName}/query")
public User query(@PathVariable("userId") Long userId, @PathVariable("userName") String userName){

}

@RequestParam

@RequestParam用於將請求參數映射到控制器方法的形參上,有如下三個屬性

  1. value:參數名。
  2. required:是否必需,默認爲true,表示請求參數中必須包含該參數,如果不包含拋出異常。
  3. defaultValue:默認參數值,如果設置了該值自動將required設置爲false,如果參數中沒有包含該參數則使用默認值。
  4. 示例:@RequestParam(value = “pageNum”, required = false, defaultValue = “1”)

@ControllerAdvice

@ControllerAdvice標識一個類是全局異常處理類。

@ControllerAdvice
public class ControllerTest {
    //全局異常處理類
}

@ExceptionHandler

@ExceptionHandler標識一個方法爲全局異常處理的方法。

@ExceptionHandler
public void ExceptionHandler(){
    //全局異常處理邏輯...
}

13.SpingMvc中的控制器的註解一般用那個,有沒有別的註解可以替代?

  1. 一般使用@Controller註解標識控制器。
  2. 也可以使用@RestController註解替代@Controller註解,@RestController相當於@ResponseBody+@Controller,表示控制器中所有的方法都返回JSON格式數據,一般不使用其他註解標識控制器。

14.如果在攔截請求中,想攔截get方式提交的方法,怎麼配置?

  1. 可以在@RequestMapping註解裏面加上method=RequestMethod.GET。
@RequestMapping(value="/toLogin",method = RequestMethod.GET)
public ModelAndView toLogin(){}
  1. 可以使用@GetMapping註解。
@GetMapping(value="/toLogin")
public ModelAndView toLogin(){}

15.怎樣在控制器方法裏面得到request或者session?

直接在控制器方法的形參中聲明request,session,SpringMvc就會自動把它們注入。

@RequestMapping("/login")
public ModelAndView login(HttpServletRequest request, HttpSession session){}

16.如果想在攔截的方法裏面得到從前臺傳入的參數,怎麼得到?

直接在控制器方法的形參裏面聲明這個參數就可以,但名字必須和傳過來的參數名稱一樣,否則參數映射失敗。
下面方法形參中的userId,就會接收從前端傳來參數名稱爲userId的值。

@RequestMapping("/deleteUser")
public void deleteUser(Long userId){
	//刪除用戶操作...
}

17.前臺傳入多個參數,並且這些參數都是一個對象的屬性,怎麼進行參數綁定?

直接在控制器方法的形參裏面聲明這個參數就可以,SpringMvc就會自動會請求參數賦值到這個對象的屬性中。
下面方法形參中的user用來接收從前端傳來的多個參數,參數名稱需要和User實體類屬性名稱一致。

@RequestMapping("/saveUser")
public void saveUser(User user){
	//保存用戶操作...
}
@Data
public class User {
    private Long userId;
    private String username;
    private String password;
    //...
}

18.SpringMVC中函數的返回值是什麼?

爲了減少文章篇幅,單獨把這這個問題的答案寫成一篇博客。
SpringMVC四種返回值類型總結

19.SpringMVC用什麼對象從後臺向前臺傳遞數據的?

  1. 使用Map、Model和ModelMap的方式,這種方式存儲的數據是在request域中
@RequestMapping("/getUser")
public String getUser(Map<String,Object> map,Model model,ModelMap modelMap){
    //1.放在map裏  
    map.put("name", "xq");
    //2.放在model裏,一般是使用這個
    model.addAttribute("habbit", "Play");
    //3.放在modelMap中 
    modelMap.addAttribute("city", "gd");
    modelMap.put("gender", "male");
    return "userDetail";
}
  1. 使用request的方式
@RequestMapping("/getUser")
public String getUser(Map<String,Object> map,Model model,ModelMap modelMap,HttpServletRequest request){
    //放在request裏  
    request.setAttribute("user", userService.getUser());
    return "userDetail";
}
  1. 使用ModelAndView
@RequestMapping("/getUser")  
public ModelAndView getUser(ModelAndView modelAndView) {
    mav.addObject("user", userService.getUser());  
    mav.setViewName("userDetail");  
    return modelAndView;  
}  

20.怎麼樣把ModelMap裏面的數據放入session裏面?

在類上添加@SessionAttributes註解將指定的Model數據存儲到session中。

@SessionAttributes

  1. 默認情況下Spring MVC將模型中的數據存儲到request域中。當一個請求結束後,數據就失效了。如果要跨頁面使用。那麼需要使用到session。而@SessionAttributes註解就可以使得模型中的數據存儲一份到session域中。
  2. @SessionAttributes只能定義在Class,interface enum上,作用是將指定的Model中的鍵值對添加至session中,方便在一個會話中使用。

@SessionAttributes參數

  1. names:這是一個字符串數組。裏面應寫需要存儲到session中數據的名稱。
  2. types:根據指定參數的類型,將模型中對應類型的參數存儲到session中。
  3. value:其實和上面的names是一樣的。
@SessionAttributes(value={"names"},types={Integer.class})
@Controller
public class session{

	@RequestMapping("/session")
	public String session(Model model){
		model.addAttributes("names", Arrays.asList("caoyc","zhh","cjx"));
		model.addAttributes("age", 22);
		return "/session";
	}
}

在上面代碼中,在類上添加@SessionAttributes註解,並指定將names名稱的Model數據存儲到session域中,以及將Integer類型的Model數據存儲到session域中。

21.SpringMvc裏面攔截器是怎麼寫的?

爲了減少文章篇幅,單獨把這這個問題的答案寫成一篇博客。
SpringMVC攔截器實現原理以及登錄攔截器實現(圖文講解)

22.SpringMMV中有個類把視圖和數據都合併的一起的,叫什麼?

它就是ModelAndView。

  1. 使用ModelAndView類存儲處理完後的結果數據,以及顯示該數據的視圖。從名字上看ModelAndView中的Model代表模型,View代表視圖,從名字看就很好地解釋了該類的作用。Controller處理器調用模型層處理完用戶請求後,把結果數據存儲在該類的model屬性中,把要返回的視圖信息存儲在該類的view屬性中,然後把ModelAndView返回給前端控制器。前端控制器通過調用配置文件中定義的視圖解析器,對該對象進行解析,最後把結果數據顯示在指定的頁面上。
  2. 返回指定頁面
    ModelAndView構造方法可以指定返回的頁面名稱。
    也可以通過setViewName()方法跳轉到指定的頁面 。
  3. 返回所需數值
    使用addObject()設置需要返回的值,addObject()有幾個不同參數的方法,可以默認和指定返回對象的名字。

這裏再鏈接MyBatis最新面試題,大家覺得不錯的話,可以👍或者關注一下我。
2020年MyBatis最新面試題,看這篇就足夠了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章