今天总结一下在一个Spring的项目中使用MultiActionController的应用小结。
在项目开发过程中,面对一个需要对一个域对象进行查询明细,查询列表和查询该域对象的关联对象的案例,这里不包括对域对象进行更新的工作,这样如果采用实现Controller接口的话,每个实现类执行handleRequest返回ModelAndView来达到目的,很自然的将会产生3个实现类,这样项目的类文件数量增多,而且在以后维护工作中,虽然在一个用例中,仍然不得不从配置文件下手,一个一个根据映射找出对应的相应的Controller,这添加了维护的难度,所以这里我们很自然的采用了MultiActionController做实现。代码基本类似如下:
public class BookMultiController extends MultiActionController{
//(1)
public ModelAndView getBook(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView("book/book_detail");
Book book = bookManager.getBook(request.getParameter("bookId"));
mv.addObject("book", book);
return mv;
}
//(2)
public ModelAndView getBookList(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView("book/book_list");
Book book = new Book();
BeanUtils.populate(book, request.getParameterMap());
List list = bookManager.getBooks(book);
mv.addObject("bookList", list);
return mv;
}
//(3)
public ModelAndView getAuthorByBook(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView("author/author_detail");
Author author = authorManager.getAuthorByBookId(request.getParameter("bookId"));
mv.addObject("author", author);
return mv;
}
}
在Url配置映射方面,我们使用了org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver,所以上述代码
的访问是:
book.do?method=getBook&bookId=123;
book.do?method=getBookList&bookName=JavaDesign&price=100;
book.do?method=getAuthorByBook&bookId=123;
这样实现下来似乎很不错了。但是在开发过程中,这样情况还会出现很多,当我们碰到一个综合查询的时候,往往会有一颗树,点击树的每一个节点,通过传递一些参数,我们需要看到想要的结果显示在正确的页面。如果采用实现Controller的方法,那么每一个节点的点击将具体的对应到一个相应,通过处理返回ModelAndView。如果考虑这颗树的节点很多,那么是否应该随着节点的不断增加,controller也不断的增加,配置文件的不断增加呢?如果不这样,是否还是考虑使用MultiActionController呢?在这里我们的选择还是使用MultiActionController来实现,不过带来的后果就是有多少个节点,就意味着MultiActionController有多少个对应的方法执行来返回ModelAndView。在这里已经假设节点有很多的情况,那么就意味着这个Controller随着执行方法的增加,代码也会会很冗长。如果有30个节点的话,上面的方法将会有30个,代码一多,这时仔细看看,其实他们都很薄,也都很相似。这里薄和相似是他们
都没有像SimpleFormController那样需要绑定对象,对对象进行验证,保存和更新的动作,他们都是从用户请求那里拿到参数,然后返回给用户希望得到的东西,这就足够了。所以我们在这个基础上加了一些东西,让这些事情做起来更容易一些,在MultiActionController注入了一个IRequestHandler,由它来完成上述的需求,这样30个方法的查询,实现起来至多也就是2个。拿一开始的用例来举例,代码:
public ModelAndView query(HttpServletRequest request,
HttpServletResponse response) {
requestHandler.dynamicInvocate(request);
Solution solution = requestHandler.getSolution();
return new ModelAndView(solution.getPage(),solution.getModelName(),solution.getModel());
}
public ModelAndView queryBook(HttpServletRequest request,
HttpServletResponse response) {
Book book = new Book();
BeanUtils.populate(book, request.getParameterMap());
Map<String,Object> map = new HashMap<String,Object>();
map.put("book", book);
requestHandler.dynamicInvocate(request, map);
Solution solution = requestHandler.getSolution();
return new ModelAndView(solution.getPage(),solution.getModelName(),solution.getModel());
}
对应的访问变成:
query.do?method=query&purpose=getBook&bookId=123;
query.do?method=queryBook&purpose=getBookList&bookName=JavaDesign&price=100;
query.do?method=query&purpose=getAuthorByBook&bookId=123;
这里IRequestHandler有两个版本的dynamicInvocate,第一个最为简单,就是从请求控制域获取参数然后执行调用,并最终返回一个Solution对象,这里面封装了模型和视图。而第二个版本,则可以实现更多的参数传递的调用。如一开始的代码清单(2)中,是没有办法直接从请求中获取Book对象的,这样构建一个Map传递给调用,也能成功的得到模型和视图。完成了这些,回过头来再次考虑刚才那个拥有30个节点的树,如果足够幸运,所有的查询都是从request,或者session中获取的参数,那么只有一个MultiActionController类文件,并且只有一个方法。值得一提的是这个requestHandler我们是使用方法注入的,也就是他始终是以原型的形式出现,不会造成一些负面的影响,在我们系统测试运行期间,他运作的很好,效果还算满意。
大家对这样的设计有何看法,欢迎大家讨论。
分享到:
相关推荐
在这个最简化教程中,我们将深入理解如何使用MultiActionController以及其在实际应用中的优缺点。 首先,了解SpringMVC的基本架构是必要的。它主要由DispatcherServlet、Controllers、Models、Views和Handlers等...
要使用`MultiActionController`,你需要创建一个子类并实现处理特定请求的方法。 1. **配置步骤**: - 创建一个类,继承`MultiActionController`。 - 在子类中定义处理请求的方法,方法名应与URL路径匹配。例如,...
Spring MVC MultiActionController---多动作控制器 博客介绍: http://blog.csdn.net/sunshine_love/article/details/8842261 更换web.xml中web-config.xml即可尝试不同方法解析器,如有问题,请博客回复。欢迎交流...
springMVC3学习(五)--MultiActionController(源码) 文章地址:http://blog.csdn.net/itmyhome1990/article/details/25988091
MultiActionController是Spring MVC中的一个抽象类,它是Controller接口的实现,设计用于处理多个请求映射。它通过方法名映射HTTP请求,即每个处理特定请求的方法名对应URL路径。例如,一个名为"handleRequest"的...
4 使用MultiActionController 5 所有service利用spring注入到controller中,利用注解 6 数据库连接串单独在properties文件配置 7 在spring中配置数据源,属性使用properties文件中的配置 8 利用JdbcTemplate操作...
在这个主题“spring mvc_03”中,我们将深入探讨`MultiActionController`的工作原理、使用场景以及与现代Spring MVC实践的对比。 `MultiActionController`是Spring MVC中的一个抽象类,它继承自`AbstractController...
本案例将带你了解如何在Web项目中简单集成并使用Log4j,以便更好地进行调试、监控和故障排查。 1. **Log4j介绍**: Log4j是一个开源的Java日志框架,它允许开发者自定义日志级别,控制日志输出的位置、格式和内容...
然后,为每个功能(查询、保存、上传文件)添加对应的方法,使用`@ActionMapping`注解(如果使用的是`MultiActionController`,则使用`handleRequest`方法并根据请求参数调用相应的方法)。 4. **文件上传处理**:...
与Struts相比,Spring Web MVC的控制器接口更简单,允许开发者根据需求选择不同类型的控制器,如AbstractController、AbstractCommandController、MultiActionController等,无需强制使用特定的FormController。...
自己写的spring表单绑定的小例子,分别使用SimpleFormController,MultiActionController,spring的form tag和validator。 还在MultiActionController里面实现了表单的绑定
10.5.4 多动作控制器(MultiActionController) 10.6 Spring的视图映射机制 10.6.1 分发器(DispatcherServlet) 10.6.2 视图映射 10.7 Spring的模型(Model) 10.7.1 模型简介 10.7.2 模型封装 10.8 小结 第十一章 ...
10.5.4 多动作控制器(MultiActionController) 10.6 Spring的视图映射机制 10.6.1 分发器(DispatcherServlet) 10.6.2 视图映射 10.7 Spring的模型(Model) 10.7.1 模型简介 10.7.2 模型封装 10.8 小结 第十一章 ...
10.5.4 多动作控制器(MultiActionController) 10.6 Spring的视图映射机制 10.6.1 分发器(DispatcherServlet) 10.6.2 视图映射 10.7 Spring的模型(Model) 10.7.1 模型简介 10.7.2 模型封装 10.8 小结 第十一章 ...
10.5.4 多动作控制器(MultiActionController) 10.6 Spring的视图映射机制 10.6.1 分发器(DispatcherServlet) 10.6.2 视图映射 10.7 Spring的模型(Model) 10.7.1 模型简介 10.7.2 模型封装 10.8 小结 第十一章 ...
学习这个示例,你可以了解如何将Spring MVC和MyBatis集成,以及如何使用`SimpleFormController`和`MultiActionController`处理Web请求。这有助于提升你在Java Web开发中的技能,特别是在大型企业级应用的场景下,...
2. **可选性与解耦**:Spring的核心设计允许开发者在不使用整个框架的情况下,只利用其特定部分,如只使用IoC容器管理bean,或者只使用AOP进行横切关注点的处理。这种设计有助于实现业务逻辑和Web层的分离,提高了...
Spring提供了多种控制器基类,如`AbstractController`、`AbstractCommandController`、`MultiActionController`、`SimpleFormController`和`AbstractWizardFormController`,以适应不同层次的控制需求。与Struts不同...
它提供了多种控制器类型,如AbstractController、AbstractCommandController、MultiActionController、SimpleFormController等,满足不同层次的控制需求。与Struts不同,SpringMVC允许直接使用任意对象作为命令或...
Spring提供了多种类型的控制器,如`AbstractController`、`AbstractCommandController`、`MultiActionController`等,以满足不同的应用场景。 3. **视图**:负责将模型数据转化为用户界面。Spring支持多种视图技术,...