1. 程式人生 > >卜若的程式碼筆記系列-Web系列-MVC框架-如何在mvc中使用@RequestMapping-3001

卜若的程式碼筆記系列-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個小時??)