從一個簡單案例上手Spring MVC,同時分析Spring MVC面試問題


    很多公司都會用Spring MVC,而且初級程序員在面試時,一定會被問到這方面的問題,所以這里我們來通過一個簡單的案例來分析Spring MVC,事實上,我們在培訓中就用這個舉例,很多零基礎的程序員能很快用這個上手。

   本文的文字和案例根據java web輕量級開發面試教程改編。

1 Spring MVC代碼的講解

    步驟一,創建Web項目,編寫web.xml,在其中指定使用Spring的MVC,主要的代碼如下。    

1	<servlet>
2	<servlet-name>spring</servlet-name>	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
3	<load-on-startup>1</load-on-startup>
4	</servlet>
5	<servlet-mapping>
6		<servlet-name>spring</servlet-name>
7		<url-pattern>/</url-pattern>
8	</servlet-mapping>

    這里定義了一個Servlet和servlet-mapping,它們一般是成對出現的。在第1行到第4行的servlet元素里,還定義了一個名為Spring的Servlet,並在第2行指定了它的處理類是Spring的DispatcherServlet。也就是說,在這個項目里是用到了Spring的MVC處理類,在第3行里通過load-on-startup來指定這個Servlet在Spring容器加載時就會被加載。

    而在第5行到第8行的servlet-mapping里,通過第7行的url-pattern來指定任何請求都將被Spring這個Servlet來處理。

    通常用localhost:8080/項目名/index.jsp(IP地址:端口號/項目名/目錄名/JSP文件名)這種方式來運行Web程序,這里的url-pattern是/。也就是說,IP地址:端口號/項目名里的任何URL請求都將被Spring這個Servlet來處理。   

    步驟二,開發承擔控制器角色的RestController類。

1	package com.mvc.rest;
2	import javax.servlet.http.HttpServletRequest;
3	import javax.servlet.http.HttpServletResponse;
4	import org.springframework.stereotype.Controller;
5	import org.springframework.ui.ModelMap;
6	import org.springframework.web.bind.annotation.PathVariable;
7	import org.springframework.web.bind.annotation.RequestMapping;
8	import org.springframework.web.bind.annotation.RequestMethod;
9	import org.springframework.web.servlet.ModelAndView;
10	
11	@Controller
12	public class RestController {
13	    public RestController(){   }
14	
15	    @RequestMapping(value = "/login/{userName}", method = RequestMethod.GET)   
16	    public ModelAndView myMethod(HttpServletRequest request, HttpServletResponse response,             @PathVariable("userName") String userName, ModelMap modelMap) throws Exception {  
17	        modelMap.put("loginUser", userName);
18	        return new ModelAndView("/login/hello", modelMap);
19	    }   
20	//通過注解說明該方法用Get的方式來處理/welcome的請求
21	@RequestMapping(value = "/welcome", method = RequestMethod.GET)  
22	        public String registPost() {  
23	         return "/welcome";
24	    }  
25	}

    在第11行,通過@Controller這個注解來說明RestController類承擔了控制器的角色。其中在第16行和第21行分別定義了兩個處理函數。先來看個比較簡單的registPost方法。

    第21行的@RequestMapping這個注解,通過method來說明用Get方法來處理請求,一旦遇到了比如localhost:8080/SpringMVCDemo/welcome的請求時,將用這個registPost方法來處理。另外的myMethod方法就比較復雜了。

1	@RequestMapping(value = "/login/{userName}", method = RequestMethod.GET)
2	public ModelAndView myMethod(HttpServletRequest request, HttpServletResponse response,             @PathVariable("userName") String userName, ModelMap modelMap) throws Exception {  
3	        modelMap.put("loginUser", userName);
4	        return new ModelAndView("/login/hello", modelMap);
5	}

    一旦用戶輸入localhost:8080/SpringMVCDemo/login/登錄名時,該方法將用Get的方式來處理。這里value的寫法是"/login/{userName},也就是說,假如輸入了localhost:8080/SpringMVCDemo/login/Java,那么對應的userName值是Java。

    在第3行通過modelMap的put方法,將userName放到loginUser這個屬性里,modelMap對象一般用來傳遞數據到其它頁面。在第4行,通過ModelAndView對象,攜帶包含loginUser參數的modelMap對象跳轉到/login/hello頁面。

    步驟三 編寫針對Spring MVC處理的配置文件。這個配置文件名字可以隨便起,一般是放在和web.xml相同的目錄里,該配置文件的關鍵代碼如下。   

1	<!-- 自動掃描bean,把作了注解的類轉換為bean -->
2	<context:component-scan base-package="com.mvc.rest" />
3	<!—打開Spring MVC的注解功能-->
4	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
5	<!-- 對模型視圖名稱的解析,在其中為模型視圖的名稱添加前后綴 -->
6	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
7	<property name = "prefix" value="/"></property>
8	<property name = "suffix" value = ".jsp"></property>
9	</bean>

    其中,第4行的代碼可以開啟注解模式,這樣諸如@Controller之類的注解就能生效了。第6行到第9行的代碼給請求加上前綴和后綴。

    步驟四 編寫兩個jsp文件,請注意hello.jsp是放在Webroot/login目錄下。先來看hello.jsp代碼。    

1	<html>
2	<head>
3	<meta http-equiv="Content-Type" content="text/html; charset=GBK">
4	<title></title>
5	</head>
6	<body>
7	hello:<%=request.getAttribute("loginUser") %>
8	</body>
9	</html>

    在第7行能顯示loginUser的值。welcome.jsp代碼就比較簡單,就是在第7行固定顯示welcome文字。    

1	<html>
2	<head>
3	<meta http-equiv="Content-Type" content="text/html; charset=GBK">
4	<title></title>
5	</head>
6	<body>
7	welcome
8	</body>
9	</html>

    把Spring MVC和Struts部分的代碼對比一下,發現Spring里不需要專門的配置文件來定義頁面的跳轉,而且控制器類的代碼也比較隨意,從中看不出明顯的Spring痕跡。

    下面通過運行來說明它的執行流程。

    方式一,啟動Tomcat服務器后,通過http://localhost:8080/SpringMVCDemo/welcome的方式來訪問。

①向服務器發送URL請求后,根據web.xml的配置,該請求會由Spring的DispatcherServlet來處理。

②根據@Controller注解,可知RestController類承擔着控制器的角色。然后逐一去匹配各方法前的@RequestMapping。

③ /welcome能和registPost方法對上,所以執行其中的return "/welcome";代碼,根據配置文件,會在其后加上.jsp的后綴,也就是說,會返回到welcome.jsp頁面上。

④展示welcome.jsp頁面,顯示welcome的文字。

    方式二,通過http://localhost:8080/SpringMVCDemo/login/java的方式來訪問。 

    這里同樣需要在RestController類里去逐一匹配@RequestMapping,匹配后知道應該由myMethod方法處理。

    根據@RequestMapping的value值,可知userName的值是java,在第4行把java這個值設置到loginUser里,然后跳轉到/login/hello這個頁面上。

    同樣這里需加上后綴.jsp,跳轉到/login/hello.jsp頁面上,最后將顯示hello:java的字樣。

    剛才是針對具體項目描述Spring MVC的流程,現在抽象地看一下它的運行流程。

    第一,URL請求首先會被DispatcherServlet處理。

    第二,請求會通過DispatcherServlet來進行轉發,然后通過HandlerMapping接口的映射來訪問具體的Controller。

    這里提到的HandlerMapping接口是用於處理請求的映射,它有兩個實現類。

    對於SimpleUrlHandlerMapping,可以通過編寫配置文件,把URL映射到Controller上。

    對於DefaultAnnotationHandlerMapping,可以通過編寫注解,把一個URL映射到具體的Controller類上。

    第三,不同的URL請求到達HandlerMapping時,HandlerMapping會根據實際情況訪問不同Controller類來進行進行處理。

    第四,Controller處理完成后,可以通過ModelAndView類來封裝要返回的數據以及要跳轉的目標頁面。

2 Spring MVC部分的面試講解

    Java的優勢主要集中在Web層面,如果你通過看JD(職務介紹)發現面試的公司對Spring這塊有要求,那么你就得好好准備Spring的Web方面的經驗了,而我們面試的職位大多是Web方面的,所以也見過不少用過Spring的程序員。

    假如目前某公司需要一個Java初級程序員(3年左右工作經驗),而且需要有Spring方面的經驗,以這種需求我們面試過不少人,下面就通過下表來歸納下我們見過的情況。

簡歷描述

面試表現

可能的后果

工作經驗小於1年半(工作經驗可以包括畢業前的實習經驗),或者簡歷上沒寫Spring方面的經驗,或者沒有類似Web方面的經驗

 

如果簡歷上沒有其他出彩的地方(比如名校,有海外工作經驗或者有其他我們各項目關注的條件等)無法通過簡歷初選的概率是7成

工作經驗2到3年,但最近半年的項目和Spring或者Java Web開發項目無關

 

如果簡歷上沒有數據庫優化或,Java性能調優之類的加分項,也有可能通不過初選,即使通過考官的技術面試,也會加上“最近沒有相關項目經驗”的評語

工作經驗2到3年,最近在做Spring相關項目,如果簡歷上的項目和考官的項目的技術匹配度很高,工作年限可以降低到1年半左右

無法結合項目說出是怎么用Spring技術的,或者通過考官的詢問說出以前只在學習上用過,或者Spring項目是培訓機構給的

如果Spring技術確實可以,而且其他綜合能力也不差,考官會讓他通過,然后加上“沒有Spring商業項目的經驗”,如果有其他更好的候選人,考官不會錄用沒有商業項目的候選人

能結合項目告訴考官IoC和AOP的用途,能結合項目敘述Spring MVC的流程,而且技術問題也能大致說上,但無法說出對技術的觀點,比如用注解有什么優缺點。

至少Spring方面過關了,但考官會加上如下評語:能用Spring做項目,但對相關技術把握程度不深

這種候選人純粹是僅僅能跟在項目經理后面做項目,一般很少有自己的發揮,離升級到高級程序員還有一定的距離

不僅能說出一些只有用過才知道的技術或者調試方式,而且能說出自己的觀點,比如我僅僅在xxx情況下URL里帶參數的方式傳值,原因是xxx,或者我們項目綜合考慮還是用到注解,原因是xxx對框架有自己的觀點。能結合自己的項目說出具體框架的局限性,或者能說出用Spring框架

由於考官的要求是初級程序員,所以觀點只要別太離譜就行

是否有自己的想法是一個重要的衡量標准。項目經理有時候沒法顧及到細節,這時候就需要程序員自己發揮,所以考官遇到這類的候選人,一般是優先考慮的

很少有人能達到這種水准,這種候選人基本上可以升級到高級程序員了

 

解決哪些項目里的重大問題,或者架構師在搭建項目架構時,你參與了

 

 

針對某個項目的具體問題,能自己搭建基於Spring的框架

沒見過,這屬於高級程序員的能力范圍了,寫在這里是給大家一個努力的方向

 

 

 

 

 

    這里的商業項目經驗是說你參與的項目是否是用來掙錢的,所以兼職項目也算商業項目。如果沒有畢業后的商業項目經驗,那么讀書階段的實習項目也算聊勝於無,我們也錄用過工作經驗才1年但讀書階段在外面打工2年的候選人。

    從上面的歸納情況來看,大家除了要關注“結合項目說明技術點”外,還得培養對Spring的綜合意識,說具體點就是對某個技術的認識,它有哪些優缺點,適用於哪些場景,哪些場景下一定不能用xxx技術。

    

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM