Spring中org.springframework.web.portlet.mvc 包有10种controller :
Spring中org.springframework.web.servlet.mvc包有13种controller :
一 :Controller接口
Spring中最基本的是org.springframework.mvc.Controller接口。
ModelAndView handleRequest( HttpServletRequest request, HttpServletResponse response) throws Exception;
}
这个接口非常的简单,只有一个可以返回适当Model和View的请求处理方法。除了这个接口Spring还提供了一些该接口的实现,包括了一些常用的功能方法。
二 :抽象类 AbstractController
.
protected abstract ModelAndView handleRequestInternal (HttpServletRequest request, HttpServletResponse response) throws Exception;
}
AbstractController提供了一个构建Controller的基础。AbstractController继承了WebContentGenerator并实现了Controller接口。这样,在AbstractController中就具备了以下的功能。
如果你使用AbstractController来做为一个基类的话(不推荐),你需要override一下handleRequestInternal方法,填充你的代码,返回一个ModelAndView对象。例如:
public ModelAndView handleRequestInternal( HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView( " foo " , new HashMap());
return mav;
}
}
< property name = " cacheSeconds " >< value > 120 </ value </ property >
</ bean >
三 :类 ParameterizableViewController
ParameterizableViewController,根据指定的View名称,返回View。
return new ModelAndView( this .viewName);
}
四 :类 UrlFilenameViewController
UrlFilenameViewController,从请求URL中得到FileName。
String uri = request.getRequestURI();
int begin = uri.lastIndexOf( ' / ' );
if (begin == - 1 ) {
begin = 0 ;
} else {
begin ++ ;
}
int end;
if (uri.indexOf( " ; " ) != - 1 ) {
end = uri.indexOf( " ; " );
} else if (uri.indexOf( " ? " ) != - 1 ) {
end = uri.indexOf( " ? " );
} else {
end = uri.length();
}
String fileName = uri.substring(begin, end);
if (fileName.indexOf( " . " ) != - 1 ) {
fileName = fileName.substring( 0 , fileName.lastIndexOf( " . " ));
}
return new ModelAndView(fileName);
}
五 :类 MultiActionController
这个Controller在一个独立的包中,org.springframework.web.mvc.multiaction。
}
你可以把多个动作集中到这个Controller中。当你需要大量公用的功能在一个Controller中时,这个Controller是很好的选择。你可以子类化MultiActionController,也可以使用MethodNameResolver。
MethodNameResolver :
当接受请求的时候MultiActionController需要调用一个处理该请求的方法,你可以自己定义个解决方法,通过配置文件中指定的参数名称找到这个方法,方法定义必需使用以下格式:
此外你也可以自己定义一个异常类来处理异常,格式为:
Spring提供了MethodNameResolver的三种方式:
1 : ParameterMethodNameResolver,这个可以根据请求的参数来确定一个需要调用的方法。
例如,http://www.sf.net/index.view?testParam=testIt,这个请求会调用名称为testIt的处理方法。
2 : InternalPathMethodNameResolver,这个可以根据请求的路径名称来调用相应的方法。
例如,http://www.sf.net/testing.view,这个请求会调用testing方法。
3 : PropertiesMethodNameResolver,这个可以根据一个URLs 映射列表来调用相应的方法。
例如,如果定义了/index/welcome.html=doIt,那么当请求为/index/welcome.html时,会调用doIt方法。在定义URLs时可以使用通配符。/**/welcom?.html
< property name = " methodNameResolver " >< ref bean = " paramResolver " /></ property >
< property name = " delegate " >< ref bean = " sampleDelegate " />
</ bean >
< bean id = " paramResolver " class = " org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver " >
< property name = " paramName " >< value > method </ value ></ property >
</ bean >
< bean id = " sampleDelegate " class = " samples.SampleDelegate " />
SampleDelegate.java 代码
public ModelAndView retrieveIndex( HttpServletRequest req, HttpServletResponse resp) {
rerurn new ModelAndView("index", "date", new Long(System.currentTimeMillis()));
}
}
例3 :
< property name = " methodNameResolver " >< ref bean = " propsResolver " /></ property >
< property name = " delegate " >< ref bean = " sampleDelegate " />
</ bean >
< bean id = " propsResolver " class = " org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver " >
< property name = " mappings " >
< props >
< prop key = " /index/welcome.html " > retrieveIndex </ prop >
< prop key = " /**/notwelcome.html " > retrieveIndex </ prop >
< prop key = " /*/user?.html " > retrieveIndex </ prop >
</ props >
</ property >
</ bean >
六 :抽象类 BaseCommandController
这个控制器简化了struts中的操作,可以直接和数据对象进行交互。例如把HttpServletRequest得到的参数动态绑定到dataobject上。
AbstractCommandController,通过这个可以创建你自己的Command Comtroller。它继承了BaseCommandController,可以设置commandObject来保存数据,可以指定验证类。