`
lsy
  • 浏览: 122984 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

设计使用MultiActionController心得

阅读更多
今天总结一下在一个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我们是使用方法注入的,也就是他始终是以原型的形式出现,不会造成一些负面的影响,在我们系统测试运行期间,他运作的很好,效果还算满意。
大家对这样的设计有何看法,欢迎大家讨论。
分享到:
评论
2 楼 lsy 2007-04-23  
应该说requestHandler是直接处理业务请求的,他和handleRequest完成的工作一样,就是获取模型和准备视图,其他的业务逻辑代码还是在serivce
层完成,只不过requestHandler需要从我们自行定义的一个xml开始工作。
刚才可能没有说清楚,我上传一个类图。这里我们主要使用xml,当然也可以是其他载体。上面的三个代码实际上是被写到了xml文件中,而requestHandler
通过反射和WebApplicationContextUtils来完成工作。对应上述的三个方法,xml写成:
	<item name="getBook">
		<operation action="bookManager" method="getBook">
			<parameter match="request">bookId</parameter>	
		</operation>
		<solution page="book/book_detail" modelName="book" />
	</item>	
	<item name="getBookList">
		<operation action="bookManager" method="getBooks">
			<parameter>bookName</parameter>	
			<parameter>price</parameter>
			<parameter match="custom" type="com.test.model.Book">book</parameter>			
		</operation>
		<solution page="book/book_list" modelName="bookList" />
	</item>
	<item name="getAuthorByBook">
		<operation action="authorManager" method="getAuthorByBookId">
			<parameter match="request" type="java.lang.String" >bookId</parameter>	
		</operation>
		<solution page="author/author_detail" modelName="author" />
	</item>

在类图中,XmlParser在容器启动的时候,首先将xml解析成一组<String,Item>静态的映射,然后等待请求的到来。在这一组映射中的每一个Item,都由
Operation和Solution合成,Solution封装了model,view。而Operation封装了执行业务逻辑方法的manager,参数,方法。RequestHelper则根据xml中定
义的东东从request,session或者自定义的map中获取方法执行的参数,并WebApplicationContextUtils获取项目上下文,然后通过getBean获取manager,
那么这样一切准备就绪,requestHandler就可以开始工作了。这样相对一开始给出的那段(1),(2),(3)的代码清单,就变成了这样三段xml片断,以后的增
量不再写实际代码,而是写一段xml代码片断替代,维护工作就是从这一个xml开始,这样我们觉得还是值得的。
1 楼 mazzystar 2007-04-23  
看了半天没太明白,
requestHandler算是业务层吗?
这么做是把controller里的多个方法提取成requestHandler里的一个方法吗??
这样的好处是减少了配置文件的代码量吗?

相关推荐

    SpringMVC - MultiActionController

    在这个最简化教程中,我们将深入理解如何使用MultiActionController以及其在实际应用中的优缺点。 首先,了解SpringMVC的基本架构是必要的。它主要由DispatcherServlet、Controllers、Models、Views和Handlers等...

    spring mvc MultiActionController配置方法源码

    要使用`MultiActionController`,你需要创建一个子类并实现处理特定请求的方法。 1. **配置步骤**: - 创建一个类,继承`MultiActionController`。 - 在子类中定义处理请求的方法,方法名应与URL路径匹配。例如,...

    Spring MVC MultiActionController---多动作控制器

    Spring MVC MultiActionController---多动作控制器 博客介绍: http://blog.csdn.net/sunshine_love/article/details/8842261 更换web.xml中web-config.xml即可尝试不同方法解析器,如有问题,请博客回复。欢迎交流...

    springMVC3学习(五)--MultiActionController(源码)

    springMVC3学习(五)--MultiActionController(源码) 文章地址:http://blog.csdn.net/itmyhome1990/article/details/25988091

    spring mvc_04

    MultiActionController是Spring MVC中的一个抽象类,它是Controller接口的实现,设计用于处理多个请求映射。它通过方法名映射HTTP请求,即每个处理特定请求的方法名对应URL路径。例如,一个名为"handleRequest"的...

    springmvcdemo

    4 使用MultiActionController 5 所有service利用spring注入到controller中,利用注解 6 数据库连接串单独在properties文件配置 7 在spring中配置数据源,属性使用properties文件中的配置 8 利用JdbcTemplate操作...

    spring mvc_03

    在这个主题“spring mvc_03”中,我们将深入探讨`MultiActionController`的工作原理、使用场景以及与现代Spring MVC实践的对比。 `MultiActionController`是Spring MVC中的一个抽象类,它继承自`AbstractController...

    web项目log4j简单案例

    本案例将带你了解如何在Web项目中简单集成并使用Log4j,以便更好地进行调试、监控和故障排查。 1. **Log4j介绍**: Log4j是一个开源的Java日志框架,它允许开发者自定义日志级别,控制日志输出的位置、格式和内容...

    springMVC带上传文件

    然后,为每个功能(查询、保存、上传文件)添加对应的方法,使用`@ActionMapping`注解(如果使用的是`MultiActionController`,则使用`handleRequest`方法并根据请求参数调用相应的方法)。 4. **文件上传处理**:...

    外文翻译-Spring的web-MVC-构架模式讲解学习 (2).pdf

    与Struts相比,Spring Web MVC的控制器接口更简单,允许开发者根据需求选择不同类型的控制器,如AbstractController、AbstractCommandController、MultiActionController等,无需强制使用特定的FormController。...

    spring 2.0表单绑定实例

    自己写的spring表单绑定的小例子,分别使用SimpleFormController,MultiActionController,spring的form tag和validator。 还在MultiActionController里面实现了表单的绑定

    《程序天下:J2EE整合详解与典型案例》光盘源码

    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 小结 第十一章 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    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 小结 第十一章 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    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 小结 第十一章 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    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 例子

    学习这个示例,你可以了解如何将Spring MVC和MyBatis集成,以及如何使用`SimpleFormController`和`MultiActionController`处理Web请求。这有助于提升你在Java Web开发中的技能,特别是在大型企业级应用的场景下,...

    毕设 外文文献翻译-Spring的web MVC构架模式 (2).docx

    2. **可选性与解耦**:Spring的核心设计允许开发者在不使用整个框架的情况下,只利用其特定部分,如只使用IoC容器管理bean,或者只使用AOP进行横切关注点的处理。这种设计有助于实现业务逻辑和Web层的分离,提高了...

    外文翻译-Spring的web MVC 构架模式.pdf

    Spring提供了多种控制器基类,如`AbstractController`、`AbstractCommandController`、`MultiActionController`、`SimpleFormController`和`AbstractWizardFormController`,以适应不同层次的控制需求。与Struts不同...

    (完整word版)SSM英文文献翻译.docx

    它提供了多种控制器类型,如AbstractController、AbstractCommandController、MultiActionController、SimpleFormController等,满足不同层次的控制需求。与Struts不同,SpringMVC允许直接使用任意对象作为命令或...

    毕设 外文文献翻译--Spring的web-MVC-构架模式

    Spring提供了多种类型的控制器,如`AbstractController`、`AbstractCommandController`、`MultiActionController`等,以满足不同的应用场景。 3. **视图**:负责将模型数据转化为用户界面。Spring支持多种视图技术,...

Global site tag (gtag.js) - Google Analytics