如果为每个请求都设计一个controller的话,随着开发的进行,工程也一定会日渐庞大。当然,Spring框架提供了避免这种情况出现的方法,那就是使你的controller继承自org.springframework.web.servlet.mvc.multiaction.MultiActionController。就像Struts里的DispatchAction一样,MultiActionController可以处理多个类似的请求。
使用这种方式,我们访问两个方法的url分别为 action=方法
使用这种方式,我们访问两个方法的url分别为 自定义的url mapp
在Struts里,要使用DispatchAction只需要在其action的定义中加入parameter="method"即可。在Spring中,MultiActionController要配合一个org.springframework.web.servlet.mvc.multiaction.MethodNameResolver的实例使用(MethodNameResolver也是一个接口),但我个人认为这并不说明Spring比struts繁琐,在使用中自会体会到它的好处。
MultiActionController的默认MethodNameResolver是org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver。这个实现类是依据请求的路径来决定执行MultiActionController的那个方法的。例如路径为:getlist.htm,则执行相应controller的getlist方法。在实际开发中,不提倡使用这个MethodNameResolver。
一般情况下,MultiActionController搭配的MethodNameResolver是ParameterMethodNameResolver或PropertiesMethodNameResolver,它们都是根据请求的参数来决定使用那个方法。例如,如果定义这个请求参数为method,则路径为xxx.htm?method=getlist时,就会执行指定controller的getlist方法。
首先定义我们的Controller
其中有两个不同的业务方法courseSortByList和courseSortByName
package
Action;
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 DispathActionController extends MultiActionController {
private String listView;
private String nameView;
public String getListView() {
return listView;
}
public void setListView(String listView) {
this.listView = listView;
}
public String getNameView() {
return nameView;
}
public void setNameView(String nameView) {
this.nameView = nameView;
}
public DispathActionController(){
}
public ModelAndView courseSortByList(HttpServletRequest request,HttpServletResponse response){
return new ModelAndView(this.getListView());
}
public ModelAndView courseSortByName(HttpServletRequest request,HttpServletResponse response){
return new ModelAndView(this.getNameView());
}
}
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 DispathActionController extends MultiActionController {
private String listView;
private String nameView;
public String getListView() {
return listView;
}
public void setListView(String listView) {
this.listView = listView;
}
public String getNameView() {
return nameView;
}
public void setNameView(String nameView) {
this.nameView = nameView;
}
public DispathActionController(){
}
public ModelAndView courseSortByList(HttpServletRequest request,HttpServletResponse response){
return new ModelAndView(this.getListView());
}
public ModelAndView courseSortByName(HttpServletRequest request,HttpServletResponse response){
return new ModelAndView(this.getNameView());
}
}
同时建立sortByList和sortByName两个jsp文件
我们有三种使用方式
(1)使用URL
配置文件如下:
<
bean
id
="simpleUrlMapping"
class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
< property name ="mappings" >
< props >
< prop key ="/home.mvc" > HomeController </ prop >
< prop key ="/register.mvc" > RegisterStudentController </ prop >
< prop key ="/feedback.mvc" > FeedbackController </ prop >
< prop key ="/course*.mvc" > multiactionController </ prop > <!-- -用*代表所有course开头的url path->
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<!-- 使用MuitlActionController控制器及URL方式访问 -->
< bean id ="multiactionController" class ="Action.DispathActionController" >
< property name ="listView" >< value > dispatch/sortByList </ value ></ property >
< property name ="nameView" >< value > dispatch/sortByName </ value ></ property >
</ bean >
class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
< property name ="mappings" >
< props >
< prop key ="/home.mvc" > HomeController </ prop >
< prop key ="/register.mvc" > RegisterStudentController </ prop >
< prop key ="/feedback.mvc" > FeedbackController </ prop >
< prop key ="/course*.mvc" > multiactionController </ prop > <!-- -用*代表所有course开头的url path->
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<!-- 使用MuitlActionController控制器及URL方式访问 -->
< bean id ="multiactionController" class ="Action.DispathActionController" >
< property name ="listView" >< value > dispatch/sortByList </ value ></ property >
< property name ="nameView" >< value > dispatch/sortByName </ value ></ property >
</ bean >
使用这种方式,我们访问两个方法的url分别为 方法名.mvc
http://localhost:81/SpringMVCStudy/courseSortByList.mvc
http://localhost:81/SpringMVCStudy/courseSortByName.mvc
(2)解析方法名的方式
有两种细分,第一是用一个参数(类似struts的dispathAction),第二种是直接配置url mapping
第一种方式配置文件
<
bean
id
="simpleUrlMapping"
class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
< property name ="mappings" >
< props >
< prop key ="/home.mvc" > HomeController </ prop >
< prop key ="/register.mvc" > RegisterStudentController </ prop >
< prop key ="/feedback.mvc" > FeedbackController </ prop >
< prop key ="/course.mvc" > multiactionController </ prop >
</ props >
</ property >
</ bean >
< bean id ="viewResolver"
class ="org.springframework.web.servlet.view.InternalResourceViewResolver" >
< property name ="prefix" >
< value > / </ value >
</ property >
< property name ="suffix" >
< value > .jsp </ value >
</ property >
</ bean >
< bean id ="multiactionController" class ="Action.DispathActionController" >
< property name ="listView" >< value > dispatch/sortByList </ value ></ property >
< property name ="nameView" >< value > dispatch/sortByName </ value ></ property >
< property name ="methodNameResolver" >
< ref bean ="methodNameResolver" />
</ property >
</ bean >
< bean id ="methodNameResolver"
class ="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver" >
< property name ="paramName" >
< value > action </ value >
</ property >
</ bean >
class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
< property name ="mappings" >
< props >
< prop key ="/home.mvc" > HomeController </ prop >
< prop key ="/register.mvc" > RegisterStudentController </ prop >
< prop key ="/feedback.mvc" > FeedbackController </ prop >
< prop key ="/course.mvc" > multiactionController </ prop >
</ props >
</ property >
</ bean >
< bean id ="viewResolver"
class ="org.springframework.web.servlet.view.InternalResourceViewResolver" >
< property name ="prefix" >
< value > / </ value >
</ property >
< property name ="suffix" >
< value > .jsp </ value >
</ property >
</ bean >
< bean id ="multiactionController" class ="Action.DispathActionController" >
< property name ="listView" >< value > dispatch/sortByList </ value ></ property >
< property name ="nameView" >< value > dispatch/sortByName </ value ></ property >
< property name ="methodNameResolver" >
< ref bean ="methodNameResolver" />
</ property >
</ bean >
< bean id ="methodNameResolver"
class ="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver" >
< property name ="paramName" >
< value > action </ value >
</ property >
</ bean >
使用这种方式,我们访问两个方法的url分别为 action=方法
http://localhost:81/SpringMVCStudy/course.mvc?action=courseSortByList
http://localhost:81/SpringMVCStudy/course.mvc?action=courseSortByName
第二种方式配置文件
<
bean
id
="simpleUrlMapping"
class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
< property name ="mappings" >
< props >
< prop key ="/home.mvc" > HomeController </ prop >
< prop key ="/register.mvc" > RegisterStudentController </ prop >
< prop key ="/feedback.mvc" > FeedbackController </ prop >
< prop key ="/course.mvc" > multiactionController </ prop >
</ props >
</ property >
< property name ="defaultHandler" ref ="multiactionController" /> <!-- -这个很重要,把multiactionController配置到
SimpleUrlHandlerMapping-,否则无法识别mapping>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<!-- 使用MuitlActionController控制器及mapping参数方式访问 -->
< bean id ="multiactionController" class ="Action.DispathActionController" >
< property name ="listView" >< value > dispatch/sortByList </ value ></ property >
< property name ="nameView" >< value > dispatch/sortByName </ value ></ property >
< property name ="methodNameResolver" >
< ref bean ="methodNameResolver" />
</ property >
</ bean >
< bean id ="methodNameResolver" class ="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver" >
< property name ="mappings" >
< props >
< prop key ="/courseList.mvc" > courseSortByList </ prop >
< prop key ="/courseName.mvc" > courseSortByName </ prop >
</ props >
</ property >
</ bean >
class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
< property name ="mappings" >
< props >
< prop key ="/home.mvc" > HomeController </ prop >
< prop key ="/register.mvc" > RegisterStudentController </ prop >
< prop key ="/feedback.mvc" > FeedbackController </ prop >
< prop key ="/course.mvc" > multiactionController </ prop >
</ props >
</ property >
< property name ="defaultHandler" ref ="multiactionController" /> <!-- -这个很重要,把multiactionController配置到
SimpleUrlHandlerMapping-,否则无法识别mapping>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<!-- 使用MuitlActionController控制器及mapping参数方式访问 -->
< bean id ="multiactionController" class ="Action.DispathActionController" >
< property name ="listView" >< value > dispatch/sortByList </ value ></ property >
< property name ="nameView" >< value > dispatch/sortByName </ value ></ property >
< property name ="methodNameResolver" >
< ref bean ="methodNameResolver" />
</ property >
</ bean >
< bean id ="methodNameResolver" class ="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver" >
< property name ="mappings" >
< props >
< prop key ="/courseList.mvc" > courseSortByList </ prop >
< prop key ="/courseName.mvc" > courseSortByName </ prop >
</ props >
</ property >
</ bean >
使用这种方式,我们访问两个方法的url分别为 自定义的url mapp
http://localhost:81/SpringMVCStudy/courseList.mvc
http://localhost:81/SpringMVCStudy/courseName.mvc