Spring MVC之MultiActionController

MultiActionController

         在使用Spring提供的控制器时,AbstractController和SimpleFormController是应用得最多的。AbstractController是最基本的Controller,可以给予用户最大的灵活性。SimpleFormController则用于典型的表单编辑和提交。在一个需要增,删,改,查的需求中,增加和修改扩展SimpleFormController完成,删除和查询则扩展AbstractController完成。 但是像上面那样完成某一业务对象的增,删,改,查,都属于一类相关的业务。把一类相关的操作分布到不同的类去完成,违返“高内聚”的设计原则。这样四个业务操作需要四个类来完成,造成太多的类文件,难以维护和配置。  所以Spring借鉴Struts的DispatchAction提供了类似功能的MultiActionController。可以 实现不同的请求路径对应MultiActionController中的不同方法,这样就可以把相关的操作都在一个类的相关方法中完成。这样使得这个类具有“高内聚”,也利于系统的维护,还避免了重复代码。

Controll要继承MultiActionController,MultiActionController有两种配置方法,他们选择方法的方式是不一样的。
第一种是:根据请求参数决定方法 empMutilAction.do?action= 方法名

action就是参数的名称,你可以把他理解为Controller是一个servlet,而我希望一个servlet能够处理多种请求,而servlet能区分要处理的请求类型是save数据还是删除数据,就必须给servlet一个标示符。我们可以通过转入servlet时,顺便带一个参数action,它指明了你的操作是什么,是save或者delete,或者其他

第二种是: 根据请求路径决定方法 ,就是在地址栏中 输入  /X.do,X还是这个Controller中的方法名

现在我们先看Controller,两种配置方法会在下面写上

package com.hsit.controller;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import com.hsit.pojo.UserInfo;

public class MyMultiActionController extends MultiActionController {

	public ModelAndView add(HttpServletRequest request,
			HttpServletResponse response, UserInfo user) {
		
		ModelAndView mav = new ModelAndView();
		mav.addObject("option", new String[] {"abc","cde"});
		System.out.println(user);
		mav.setViewName("b");
		return mav;
	}
	
	public String test(HttpServletRequest request,HttpServletResponse response) {
		return "a";
	}

	@Override
	protected void initBinder(HttpServletRequest request,
			ServletRequestDataBinder binder) throws Exception {
		// TODO Auto-generated method stub
		binder.registerCustomEditor(Date.class, new CustomDateEditor(
				new SimpleDateFormat("yyyy-MM-dd"), true));
	}

}

视图
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
        
    <title></title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<!--
	<script type="text/javascript" src="js/*.js"></script>
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    	<center>
    		<form action="multy.do" method="post">
                      <!-- 设置参数action值为add,使得MultiActionControll调用add方法-->
                      <input type="hidden" name="action" value="add">
    			用户名:<input type="text" name="username" size="20"/><br>
    			账  号:<input type="password" name="password" size="20"><br>
    			日  期:<input type="text" name="date" size="20"><br><br>
    			<input type="submit" value="提交">
    		</form>
    	</center>
  </body>
</html>


配置方法

根据请求参数决定方法

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="multy.do">multyAction</prop>
				<prop key="goAdd.do">goAdd</prop>
			</props>
		</property>
	</bean>
	
	<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
	
	<bean id="goAdd" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
		<property name="viewName" value="add"></property>
	</bean>
	
	<!-- 根据请求参数决定方法 empMutilAction.do?action=add -->
	<bean id="multyAction" class="com.hsit.controller.MyMultiActionController">
		<property name="methodNameResolver">
			<bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
			<!-- 指定参数名为action -->
				<property name="paramName" value="action" />
			</bean>
		</property>
	</bean>
	
</beans>

地址栏输入: p://colo-pc:8080/SpringMVC01/multy.do?action=方法名,即可自动调用Controller中相应的函数

根据请求路径 决定方法

在这里我们的JSP页面代码略有改变

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
        
    <title></title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<!--
	<script type="text/javascript" src="js/*.js"></script>
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    	<center>
    	<!-- form action属性直接指定要执行的MultiActionController的功能,前提是要配置好 -->
    		<form action="add.do" method="post">
    		<!-- 现在就不需要传参数action指明调用哪个方法 -->
    			用户名:<input type="text" name="username" size="20"/><br>
    			账  号:<input type="password" name="password" size="20"><br>
    			日  期:<input type="text" name="date" size="20"><br><br>
    			<input type="submit" value="提交">
    		</form>
    	</center>
  </body>
</html>


文件配置
<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
			<!-- MultiActionController中的两个方法add和test 
			     key必须与方法名一样
				比如请求路径http://localhost:8080/SpringMVC01/test.do,类中必须有个方法名为test
			-->
				<prop key="add.do">multyAction</prop>
				<prop key="test.do">multyAction</prop>
				
				<prop key="goAdd.do">goAdd</prop>
			</props>
		</property>
	</bean>
	
	<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
	
	<bean id="goAdd" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
		<property name="viewName" value="add"></property>
	</bean>
	
	<!-- 根据请求参数决定方法 empMutilAction.do?action=add -->
	<bean id="multyAction" class="com.hsit.controller.MyMultiActionController">
		<!--<property name="methodNameResolver">
			<bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
			 指定参数名为action 
				<property name="paramName" value="action" />
			</bean>
		</property>-->
		<property name="methodNameResolver">
			<bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />
		</property>
	</bean>
		
</beans>

通过以上配置,我们地址栏输入http://colo-pc:8080/SpringMVC01/ test.do,就会自动让分发器分发到MultiActionController中,执行其中的test方法


MultiActionController的缺点 

MultiActionController把相关的业务方法集中在一个类中进行处理,减少控制类的数量。方便于系统的维护,可以重用相关的逻辑代码,提高代码的重用,同时也减少bean的配置。有太多的bean配置可以说是Spring  的一个暇疵。Spring提供IOC,让我们灵活的控制bean的依赖。同时我们需要去维护太多的bean配置,Spring项目中很大程度上都在烂用xml  配置文件,这很不利于团队开发和系统的后期维护。MultiActionController也不例外。 
1.  multiActionController的配置相对复杂。MultiActionController需要注入一个MethodNameResolver对象,再通过MethodNameResolver的mappings属性来提供请求与方法之间的映射。这样的配置是复杂的和难以理解的。使用Spring框架的确很灵活,但是有时这种过分的灵活反而增加了系统的复杂度。 
2.  multiActionController配置涉及的bean过多。除了自身的bean定义外,还需要把所有的映射配置到一个UrlHandlerMapping中去。这样除了维护multiActionController的自身的bean定义外,还需要维护UrlHandlerMapping的定义。 
笔者十分反对这种具有连带性的配置,一个bean的属性改变会造成对别一个bean属性的改变。这样增加了系统的复杂度,和维护成本。所以必须提供一种默认的实现,让bean之间的依赖,不要造成bean属性之间的依赖。MultiActionController在这方面表示得十分不好。 
3.  数据绑定支持不好。SimpleFormController专门用来支持编辑和表单提效的,它支持数据绑定,在这方面做得很好。可以把jsp页面的字段值绑定为某一对象(Command)。可以自定义command的名称。虽然MultiActionController也支持数据绑定,但是它并不支持自定义command的名称。它默认的comamnd名称为”command”。这也是不便于维护的,对象应该有一个代表自身含义的名字。如果所有页面的绑定对象都以”command”作为名字,那将难以理解。MultiActionController支持数据绑定的方法参见上面例子的saveUser方法。 
3.  理想的MultiActionController构想 
一个理想的MultActionController应该配置简单明了,并且无需要在多个地方进行配置。  应该支持对绑定对象自定义名称。 


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值