SpringMVC中的@Controller和@RequestMapping到底什麼鬼?

來源:互聯網
上載者:User

標籤:nested   java   ram   name   做事   ima   ack   params   meta   

 

1.1 @Controller是什麼
首先看個例子:

@Controller@RequestMapping("/blog")public class BlogController {     @RequestMapping("/index")    public ModelAndView index(HttpServletRequest request){        ModelAndView mav = new ModelAndView("/index");        String ctx = request.getContextPath();        System.out.println(ctx);        mav.addObject("ctx", ctx);        return mav;    }    }

@Controller表示在tomcat啟動的時候,把這個類作為一個控制器載入到Spring的Bean工廠,如果不加,就是一個普通的類,和Spring沒有半毛錢關係。

以下是兩個常見的配置:

<!-- 開啟註解模式驅動 --><mvc:annotation-driven></mvc:annotation-driven><!-- 掃包 --><context:component-scan base-package=*"com.blogMgr.*"*></context:component-scan>

 

其中,base-package表示會掃描com.blogMgr目錄下所有的包,一旦發現有個類上面加了類似於@Controller的註解,在容器啟動的時候系統就會把它載入到Spring的Bean工廠,並且對其執行個體化。

 

這也是為什麼,我們只是寫了Controller,但是從來沒有在一個地方new這個Controller的原因,因為在Web容器啟動的時候,這個Controller已經被Spring載入到自己的Bean工廠裡面去了。

 

這也就是所謂的Spring掃包機制。@Controller就是一個註解,當tomcat啟動,我們會看到一些JAVA類揮舞著印有@Controller的旗子大喊:" Hey,SpringMVC,I‘m  here,please take me to your bean factory!"

 

1.2 @RequestMapping是什麼

在Controller中,總是會看到RequestMapping這個註解,看起來像是路徑的跳轉,以下列舉了一個方便我們記憶的比喻。

 

比如,有一天,我發現一部電影挺好看的,就在D盤建了一個檔案夾,叫“電影”。裡面放了兩部電影,各自用一個檔案夾來存放。

 

 

在中,我們可以看它的路徑是“D:\電影”,該路徑下又有一個檔案夾【瘋狂動物城 2016】,裡面是這樣的

 

那麼,該檔案的具體路徑就是“D:\電影\瘋狂動物城 2016”,現在我要訪問這個資源,除了雙擊之外,是不是只需要在地址欄裡面輸入:“D:\電影\瘋狂動物城 2016\瘋狂動物城 2016.mp4”也可以呢?

 

是的,當然可以。

 

成功了,我們通過url的方式得到了我們想要的資源檔!

 

現在我們把這個檔案複製一份,拷貝到相同路徑下

 

如果我嘗試將第一個MP4檔案的名字也改為“瘋狂動物城 2016.mp4”,則會彈出提示如下

 

可見,在同一個路徑下,不能有兩個重名的檔案。

 

同理,如果我在同一個Controller裡面設定兩個相同的RequestMapping

 

 

編譯是可以通過的,但是當我啟動tomcat後,

我通過url “http://localhost:8088/BlogMgr/blog/index”來訪問,就會報錯:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0‘: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map ‘blogController‘ bean method

 

Ambiguous mapping found表示有一個路徑模稜兩可,也就是路徑重名了,系統無法進行映射,所以報錯了。這個和無法在同一個檔案夾下面建立兩個同名檔案,是一個道理。

 

那麼,如果我一定要再建立一個“瘋狂動物城 2016.mp4”的檔案該怎麼辦呢

 

 

 

然後,我把這個檔案放在另一個檔案夾裡面就可以了。

 

同理,我也可以另外建一個Controller,Controller類上面的RequestMapping叫“/blog2”,再在裡面寫一個一模一樣的RequestMapping就肯定沒有問題了。

 

小結

一個web項目本身就是一個系統,和作業系統一樣,可以把項目當做一個系統,一個應用程式。人為什麼要使用電腦,因為電腦可以

 

1.給我們想要的資源(比如.avi)

2.幫我們做事。

 

在一個系統中,如果沒有圖形介面,我們要訪問一個資源,必然是通過一個黑視窗來訪問的,就是通過路徑來訪問的。一個B/S架構的web項目,就是一個類似於命令列一樣的應用程式,我們唯有通過url,也就是路徑去獲得我們想要的資源和服務。

 

再來看RequestMapping,最終對應的必然是一個方法,方法的功能無非就是進行一些業務的操作,或者返回一個什麼東西。

 

比如

 

 

我們就是通過這個方法獲得了想要的jsp頁面,RequestMapping的作用就是提供了一個控制代碼,讓我們可以訪問到對應的方法,最終獲得我們想要的東西。綜上所述,RequestMapping就是一個映射路徑。

  

1.3 @ResponseBody的作用
在Controller裡面,我們經常可以看到@ResponseBody這個註解,它的意思很簡單,就是說明這個方法返回的東西會通過IO流的方式寫入到瀏覽器。

比如我們寫一個方法:

@RequestMapping("/testResponseBody")@ResponseBodypublic String testResponseBody(HttpServletRequest request){    return "<h1 style=‘color:lightGreen‘>Hello Web!</h1>";}

最終在瀏覽器獲得的效果是這樣的:

SpringMVC中的@Controller和@RequestMapping到底什麼鬼?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.