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
1.
2.
笔者十分反对这种具有连带性的配置,一个bean的属性改变会造成对别一个bean属性的改变。这样增加了系统的复杂度,和维护成本。所以必须提供一种默认的实现,让bean之间的依赖,不要造成bean属性之间的依赖。MultiActionController在这方面表示得十分不好。
3.
3.
一个理想的MultActionController应该配置简单明了,并且无需要在多个地方进行配置。