卜若的程式碼筆記系列-Web系列-MVC框架-如何在mvc中使用@RequestMapping-3001
[email protected]來對映請求,可以通過控制器處理 一些URL請求。相當於Servlet在web.xml中 的配置的對映作用一致
像我在這裡寫的 <servlet>
<servlet-name>test</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
</servlet> <servlet-mapping> <!-- 將servlet的請求對映到某個url --> <servlet-name>test</servlet-name> <url-pattern>*.test</url-pattern> </servlet-mapping>
我在這裡其實是建立了一個servlet,然後將 url(帶.test)動作的對映給了這個servlet
然後,web.xml其實是一個web伺服器程式的 入口,在這裡啟動之後,它會根據你建立 的servlet: <servlet>
<servlet-name>test</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
</servlet> 會裝載一個test-servlet.xml的檔案並啟動
在這個test-servlet.xml裡面,我們觀測一下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
<!-- 我們需要定義一個對映器 --> <bean class = "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name = "mappings"> <props> <prop key = "Start.test">startController</prop> <prop key = "Login.test">startLogin</prop> <prop key = "login_success.test">login_success</prop> </props> </property> </bean> <bean class = "org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value = "/WEB-INF/jsp/"/> <property name="suffix" value = ".jsp"/> </bean> <!-- 我們在這裡定義了控制器 --> <bean id = "startController" class = "test.testControoler"> </bean> <bean id = "startLogin" class = "org.springframework.web.servlet.mvc.ParameterizableViewController"> <property name="viewName" value = "login"></property> </bean> <bean id = "login_success" class = "test.CommondControllerTest"> </bean> </beans> 在這裡使用了bean的方式注入了控制器 比如,這裡建立了一個 <bean id = "startController" class = "test.testControoler"> </bean> 控制器,接著,我們可以對映一些請求 全部放在這裡 <property name = "mappings"> <props> <prop key = "Start.test">startController</prop> <prop key = "Login.test">startLogin</prop> <prop key = "login_success.test">login_success</prop> </props> </property> 然後,我們那個控制器其實是實現了一個控制器基類 裡面的有個 public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { System.out.println("2333333333333"); return new ModelAndView("main"); } 這個函式就直接的實現了使用對映的方式完成的url請求 好了,瞭解這個,我們現在有一個需求,就是在一個控制器 裡面對映多於一個的請求,於是我們開始引入了@RequestMapping來對映請求。
接著,我需要貼出@RequestMapping的原始碼 public @interface RequestMapping { String name() default ""; String[] value() default {}; String[] path() default {}; RequestMethod[] method() default {}; String[] params() default {}; String[] headers() default {}; String[] consumes() default {}; String[] produces() default {}; }
單純的看這個,我特麼也看不懂,所以,我們還是 來屢一下整個過程好了。 首先,我們的html發一個請求過來的時候, 它是如何提交請求的(一個url)
標記在action裡面 像這種的 action="user/login"
<form action="user/login" method="post"> <input type="submit" value="使用Post傳送請求"/> </form> 這個請求,提交給伺服器之後,就會轉接到控制器? 注意,我們回顧下上面最簡單的serlvlet 我們是在web.xml裡面定義了一個servlet,並將所有 的.test的請求全部分給了這個servlet,在servlet裡面 詳細的定義了具體的控制器。
而看起來使用@RequestMapping方法似乎是直接 跳過了這個過程,直接將url請求對映到java 程式碼裡面去了?? 不,總感覺不對,因為你沒有例項化你的控制器 沒有例項,你什麼都做不了! 哦,對了,我查了下資料,尊重每一個人的勞動成果是我們程式設計師的 第一守則!像我,查的資料在哪我都會貼出來,大家引用資料的時候 也要貼出來哇!
https://my.oschina.net/kolbe/blog/509686
所以總結下來,你還需要自己定義一下這個servlet
<servlet> <servlet-name> mappingTest</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>mappingTest</servlet-name> <!-- 可以應答所有請求,也就是將所有的請求都交給mappingTest這個servlet來處理 --> <url-pattern>/</url-pattern> </servlet-mapping>
ok,我們定義了一個servlet,接著,我們需要 回憶一下,你定義了servlet,你需要一個xx-servlet.xml 去初始化你的servlet是吧
所以我們需要在src根目錄建立一個
mappingTest-servlet.xml 的檔案 並且在裡面初始化這個servlet為對映型servlet
...在研究中!!!!!!!!!!!!!!!!!!!!!!!
哈哈,經過我一番研究,終於研究出來了 首先,你要定義一下這個xx-servlet.xml的檔案路徑哈 在web裡面寫 <servlet> <servlet-name> mappingTest</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!-- classpath表示類(src根目錄)路徑下的mappingTest-servlet.xml檔案 --> <param-value>classpath:mappingTest-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
這個<init-param>標籤就可以定義初始化路徑
接著,你需要初始化這個mappingTest-servlet.xml檔案的內容
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <!-- 自動掃描 cn.kolbe.spring.mvc 下的帶有Spring元件註解的類 --> <context:component-scan base-package="mapping.test.controller"/>
<!-- 配置檢視解析器:將控制器方法返回值解析為實際物理檢視 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 假設控制器返回 success 字串,該檢視解析器將自動進行裝配,具體的檢視將為: prefix + 返回的字串 + suffix = /WEB-INF/views/success.jsp --> <!-- prefix表示字首 --> <property name="prefix" value="/WEB-INF/jsp/"></property> <!-- suffix表示字尾 --> <property name="suffix" value=".jsp"></property> </bean> </beans>
ok,我來解釋下 <context:component-scan base-package="mapping.test.controller"/> 這一句話配置了這個控制器所在的包,ok,這樣我們就解決了控制器 的例項化問題。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 假設控制器返回 success 字串,該檢視解析器將自動進行裝配,具體的檢視將為: prefix + 返回的字串 + suffix = /WEB-INF/views/success.jsp --> <!-- prefix表示字首 --> <property name="prefix" value="/WEB-INF/jsp/"></property> <!-- suffix表示字尾 --> <property name="suffix" value=".jsp"></property> </bean> 用來描述你的請求的分包,也就是說,任意請求來了之後,它就會轉到 <context:component-scan base-package="mapping.test.controller"/> 定義的包裡面的控制器 這些控制器裡面(一個類例項)會存在這樣 @RequestMapping(url) 的url請求對映,通過這個對映你就能夠轉接url請求! 是吧,超級簡單!!!!(mmp?花了我2個小時??)