MultiActionController 详解
Spring提供了一个多动作控制器,用于支持在一个控制器里添加多种功能处理方法,即在一个控制器中存放多个功能处理方法,例如
public interface BaseInterface {
/**
* 展示信息列表视图
*/
public ModelAndView list(HttpServletRequest request,HttpServletResponse response) throws Exception;
/**
* 增加对象视图
*/
public ModelAndView add(HttpServletRequest request,HttpServletResponse response) throws Exception;
/**
* 编辑对象视图
*/
public ModelAndView edit(HttpServletRequest request,HttpServletResponse response) throws Exception;
/**
* 只读对象视图
*/
public ModelAndView read(HttpServletRequest request,HttpServletResponse response) throws Exception;
/**
* 保存对象功能视图
*/
public void save(HttpServletRequest request,HttpServletResponse response) throws Exception;
/**
* 更新对象功能视图
*/
public void update(HttpServletRequest request,HttpServletResponse response) throws Exception;
}
控制器可以实现此接口。
MultiActionController 的两个重要属性:
delegate :功能处理的委托对象,即我们要调用请求处理方法所在对象。
methodNameResolver:功能处理方法名解析器,根据请求的url信息来解析它将调用的方法,需要在配置文件中定义此解析器 。
MultiActionController 如何将不同的请求发送到控制器里的那些对应的方法呢?MultiActionController 提供了2种使用方式 即extends MultiActionController 并在子类指定由MethodNameResolver解析的方法,第二种 定义一个代理对象,由它调用Resolver解析的方法,此方式需需要定义delegate。
methodNameResolver提供了三种方式:
org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver
org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver
org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver
1.InternalPathMethodNameResolver
MultiActionController的默认实现,提供从请求URL路径解析功能方法的方法名,从请求的最后一个路径(/)开始,并忽略扩展名;如请求URL是“/user/list.html”,则解析的功能处理方法名为“list”,即调用list方法。该解析器还可以指定前缀和后缀,通过prefix和suffix属性,如指定prefix=”test_”,则功能方法名将变为test_list;
2. PropertiesMethodNameResolver
提供自定义的从请求URL解析功能方法的方法名,使用一组用户自定义的模式到功能方法名的映射,映射使用Properties对象存放,
3.ParameterMethodNameResolver(推荐使用)
提供从请求参数解析功能处理方法的方法名。
举例
doTest
当methodNameResolver分别设置为
aResolver访问方式为:
http://127.0.0.1:8899/SpringMVC/spring/abc/doTest
bResolver访问方式为:
http://127.0.0.1:8899/SpringMVC/spring/abc/test.do
cResolver访问方式为:
http://127.0.0.1:8899/SpringMVC/spring/abc.do?action=doTest
功能处理方法的格式:
public (ModelAndView | Map | String | void) actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession session] [,AnyObject]);
在4个形式参数中,request和response是必须的,session和object是可选的
实现方式一:
public class WebController extends MultiActionController implements BaseInterface{
@Override
public ModelAndView list(HttpServletRequest request,
HttpServletResponse response) throws Exception {
Map
model=HttpUtil.convertModel(request);
Page page=HttpUtil.getPage(request);
DetachedCriteria criteria = HttpUtil.convertCriteria(request,ClientCate.class);
List list= baseDomain.queryByCriteria(criteria, page);
model.put("list", list);
model.put("page", page);
return new ModelAndView(this.getListPage(),model);
}
public ModelAndView catelist(HttpServletRequest request,
HttpServletResponse response) throws Exception {
Map
model=HttpUtil.convertModel(request);
String clientCateId=HttpUtil.getString(request, "clientCateId", "");
ClientCate clientCate=(ClientCate)baseDomain.query(ClientCate.class, clientCateId);
Page page=HttpUtil.getPage(request);
DetachedCriteria criteria = HttpUtil.convertCriteria(request,Client.class);
if(clientCate!=null){
criteria.add(Restrictions.eq("clientCateId", clientCateId));
}
List list= baseDomain.queryByCriteria(criteria, page);
model.put("list", list);
model.put("page", page);
model.put("clientCate", clientCate);
return new ModelAndView(this.getCustomPage("catelist"),model);
}
}
java 代码
public class WebController implements BaseInterface{
@Override
public ModelAndView list(HttpServletRequest request,
HttpServletResponse response) throws Exception {
Map
model=HttpUtil.convertModel(request);
Page page=HttpUtil.getPage(request);
DetachedCriteria criteria = HttpUtil.convertCriteria(request,ClientCate.class);
List list= baseDomain.queryByCriteria(criteria, page);
model.put("list", list);
model.put("page", page);
return new ModelAndView(this.getListPage(),model);
}
public ModelAndView catelist(HttpServletRequest request,
HttpServletResponse response) throws Exception {
Map
model=HttpUtil.convertModel(request);
String clientCateId=HttpUtil.getString(request, "clientCateId", "");
ClientCate clientCate=(ClientCate)baseDomain.query(ClientCate.class, clientCateId);
Page page=HttpUtil.getPage(request);
DetachedCriteria criteria = HttpUtil.convertCriteria(request,Client.class);
if(clientCate!=null){
criteria.add(Restrictions.eq("clientCateId", clientCateId));
}
List list= baseDomain.queryByCriteria(criteria, page);
model.put("list", list);
model.put("page", page);
model.put("clientCate", clientCate);
return new ModelAndView(this.getCustomPage("catelist"),model);
}
}