javaEE之------SpringMVC中ParameterMethodNameResolver應用
阿新 • • 發佈:2019-02-11
介紹
方法動態呼叫核心類
org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver
正在學習SpringMVC,感覺這個很重要。
前臺訪問後臺會根據spring的配置檔案轉到Controller
Controller類有兩種方法
1,implements Controller(實現Controller介面)
2,extends MultiActionController(繼承 MultiActionController)
但是實現介面有缺陷,只能寫一種方法(handleRequest),不太好利於外面使用,
所以一般都會採用第二種方法
操作導包
核心類都是spring的,所以需要導包
配置檔案編寫
核心程式碼
在配置檔案中,當需要實現訪問controller裡面的多個函式時,就需要將這個核心類注入
當然完整的配置檔案需要多個核心了的,如:載入配置檔案核心類,處理url影射核心類,ResourceBundleViewResolver等<!-- 為多個方法呼叫時,進行解析 --> <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="defaultMethodName" value="execute"></property><!-- 不帶method引數時,預設執行execute方法 --> <property name="paramName" value="method"></property> </bean> <bean name="/two" class="cn.hncu.controller2.MyController2"><!-- 在前臺直接請求路徑為攔截路徑+/two 在我的這個裡面攔截的是/sp/*,所以請求路徑是 專案名/sp/two --> <!-- 必須注入這個屬性,在多個方法呼叫時需要解析 --> <property name="methodNameResolver" ref="methodNameResolver"></property> </bean>
具體的配置檔案如下:
<!-- 單個方法,實現Controller --> <bean name="/hello" class="cn.hncu.controller.MyController"></bean> <!-- 當controller沒有配置到相應的servlet中時,我們需要採用對映url地址 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <!-- 轉發的時候我們寫配置檔案properties,一般必須要求 --> <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> <property name="basenames"> <list><!-- 預設查詢屬性檔案為hncu的配置檔案classpath目錄下 --> <value>hncu</value><!-- 這是資源的名字 ,讓controller中返回的值在這個檔案裡面找相應的路徑和型別-> </list> </property> <!-- 寫這個預設之後,我們properties檔案中就不用寫同樣的型別 jstlview 了 --> <property name="defaultParentView" value="abc"></property> </bean> <!-- 為多個方法呼叫時,進行解析 --> <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="defaultMethodName" value="execute"></property><!-- 不帶method引數時,預設執行execute方法 --> <property name="paramName" value="method"></property> </bean> <bean name="/two" class="cn.hncu.controller2.MyController2"><!-- 在前臺直接請求路徑為攔截路徑+/two 在我的這個裡面攔截的是/sp/*,所以請求路徑是 專案名/sp/two --> <!-- 必須注入這個屬性,在多個方法呼叫時需要解析 --> <property name="methodNameResolver" ref="methodNameResolver"></property> </bean>
Controller類裡面編寫
上面的配置只是前臺傳過來,可以訪問多個方法了,但是函式的編寫也是有規則的
/*處理規則:
* 空參方法是不行的,SpringMVC要求必須至少帶以req,resp開始的兩個引數
* 返回值任意,但是會影響相應顯示結果
*/
package cn.hncu.controller2;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public class MyController2 extends MultiActionController{
//這樣就可以指定呼叫我們方法,而不是唯一的
/*處理規則:
* 空參方法是不行的,SpringMVC要求必須至少帶以req,resp開始的兩個引數
* 返回值任意,但是會影響相應顯示結果
*/
//空引數訪問不到的
public void one(){
System.out.println("aa");
}
public void two(HttpServletRequest req,HttpServletResponse reps){
System.out.println("bb");
}
//必須要帶以req和resp開頭的引數,否則404錯誤
public String three(HttpServletRequest req,HttpServletResponse reps){
System.out.println("進來了"+req.getParameter("name"));
return "abc";
}
//在前臺不帶method的方法名時候,就會預設的呼叫這個。這個是在配置檔案裡面配置的
public void execute(HttpServletRequest req,HttpServletResponse reps){
System.out.println("進入默認了");
}
//封裝資訊,返回到前臺。
//一般這種返回都是ModelAndView====》前面是資料,後面是顯示的頁面
public ModelAndView four(HttpServletRequest req,HttpServletResponse reps,User user){
ModelAndView mv =new ModelAndView();
mv.setViewName("xyz");//當返回之後會進入配置檔案(控制器),由ResourceBundleViewResolver進行解析
System.out.println(user);//在這裡,當前臺的封裝資料的屬性名一致,spring就可以自動封裝資料
mv.addObject("user", user);//這樣返回,就可以去前臺讀取,本質是存放在request容器裡面的
return mv;
/*
* 在這裡,我們採用的這種他封裝之後的方法是可以的,但是我們也可以採用最原始的servlet來寫
* 因為有了req和resp(必須要求帶這兩個引數),就可以對底層的servlet進行操作了
* //req.setAttribute("name", user.getName());
//req.setAttribute("user", user);
*/
}
}
請求路徑:在前臺直接請求路徑為攔截路徑+/two 在我的這個裡面攔截的是/sp/*,所以請求路徑是 專案名/sp/two?method=three? name=""&age=""......總結:
要想可以訪問多個函式,就必須要配置ParameterMethodNameResolver到配置檔案中去,注意相應的引數,當然要想能夠訪問controller中的函式,函式必須要求必須至少帶以req,resp開始的兩個引數,返回值可以隨意。
springMVC的訪問路徑圖