1. 程式人生 > >javaEE之------SpringMVC中ParameterMethodNameResolver應用

javaEE之------SpringMVC中ParameterMethodNameResolver應用

介紹

方法動態呼叫核心類
org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver

正在學習SpringMVC,感覺這個很重要。

前臺訪問後臺會根據spring的配置檔案轉到Controller

Controller類有兩種方法

1,implements Controller(實現Controller介面)

2,extends MultiActionController(繼承 MultiActionController

但是實現介面有缺陷,只能寫一種方法(handleRequest),不太好利於外面使用,

所以一般都會採用第二種方法

操作導包

核心類都是spring的,所以需要導包

配置檔案編寫

核心程式碼

在配置檔案中,當需要實現訪問controller裡面的多個函式時,就需要將這個核心類注入

<!-- 為多個方法呼叫時,進行解析 -->
		<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>
當然完整的配置檔案需要多個核心了的,如:載入配置檔案核心類,處理url影射核心類,ResourceBundleViewResolver等

具體的配置檔案如下:

<!-- 單個方法,實現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的訪問路徑圖