(续上)

3. MultiActionController

     Spring提供了一个多动作控制器MultiActionController,开发人员藉此可以将多个动作聚合在同一个控制器之内,实现功能集成, 从而不必为控制器定义多个入口点。例如对商品信息进行查询、增删改等操作,这个动作可以用一个Contoller来实现。

     这个多动作控制器是Spring中一个独立的Java类包,即
org.springframework.web.servlet.mvc.multiaction, 它能将客户请求与处理方法名字映射起来,并触发正确的方法。MultiActionController事实上是AbstractController的 一个子类,而在应用中,MultiActionController的实现方式有两种:其一是继承MultiActionController,其二是在 配置文件中定义一个代理bean,由它来定义哪个控制器是多动作的。
     
     对于控制器中的多个方法,MultiActionController是通过MethodNameResolver来选择执行的。MultiActionController中的MethodNameResolver包括:

1.InternalPathMethodNameResolver:这是MultiActionController缺省的MethodNameResolver,它是根据URL样式来解析方法名的,实际上就是根据URL中的“文件名”决定的,例如请求“http://www.springframework.org/testing.view ”将令MultiActionController调用testing(HttpServletRequest,HttpServletResponse)方法。
2.ParameterMethodNameResolver:根据请求中的参数来解析并执行方法名,例如请求“http://www.springframework.org/index.view?testParam=testIt ”将令MultiActionController调用testIt(HttpServletRequest, HttpServletResponse)方法。
3.PropertiesMethodNameResolver:根据查询一个key/value列表来解析并执行方法名。

     对于多动作控制器的使用,我们看一个简单的例子,并利用Eclipse和Tomcat来完成。

第一步,定义web.xml。web.xml放置在WEB-INF目录下。 摘自:http://moonstone2007.blog.ccidnet.com/blog-htm-do-list-uid-46968-type-blog-y-2007-m-4-page-2.html
<?xml version="1.0" encoding="ISO-8859-1"?>


 <web-app xmlns="http://java.sun.com/xml/ns/j2ee "
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "
   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd "
   version="2.5">

 <servlet>
      <servlet-name>dispatcherServlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/dispatcherServlet-servlet.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
      <servlet-name>dispatcherServlet</servlet-name>
      <url-pattern>*.do</url-pattern>
 </servlet-mapping>

 </web-app> 
      servlet-mapping定义所有以”.do”结尾开头的url请求都会被Spring 的dispatcherServlet处理转发。默认情况下DispatcherServlet会读取<servlet- name>-servlet.xml文件的配置信息初始化,该文件中urlMapping的定义决定当前请求转发给哪个controller来处 理,这里则定义了一个 dispatcherServlet-servlet.xml文件。

      第二步,定义 dispatcherServlet-servlet.xml文件


 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
 "http://www.springframework.org/dtd/spring-beans-2.0.dtd ">

 <beans>
      <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
             <property name="mappings">
                  <props>
                        <prop key="sample.do">sampleMultiActionController</prop>
                  </props>
             </property>
      </bean>

      <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
             <property name="viewClass">
                  <value>org.springframework.web.servlet.view.InternalResourceView</value>
             </property>
             <property name="prefix">
                  <value>/WEB-INF/jsp/</value>
             </property>
             <property name="suffix">
                  <value>.jsp</value>
             </property>
      </bean>
      
       
      <bean id="sampleMultiActionController" class="com.test.SampleMultiMActionController">
            <property name="methodNameResolver">
                  <ref bean="paraMethodResolver"/>
            </property>

      <!--viewName属性将依赖注入sampleMultiActionController类-->
            <property name="viewName">
                  <value>showme</value>
            </property>
      </bean>
      
      <bean id="paraMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
            <property name="paramName" value="whichMethod"/>
      </bean>
 </beans>
      
      其中,urlMapping定义客户端的sample.do请求由名字为 sampleMultiActionController 的控制器来处理,由于是多动作处理器,所以需要定义MethodNameResolver来通知web.xml中定义的 dispatcherServlet应该调用sampleMultiActionController 的哪个方法。这里用的是InternalPathMethodNameResolver,本例说明了 sampleMultiActionController将在/WEB-INF/jsp/目录下的寻找一个showme.jsp文件作为显示model的 视图。

      第三步,定义一个SampleMultiActionController类,它是MultiActionController的子类,并有insert、update、delete三个,其源代码如下:


 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.Controller;
 import java.io.IOException;
 import java.util.*;
 import javax.servlet.ServletException;
 import org.apache.log4j.Logger;
 import org.springframework.web.bind.*;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.Controller;
 org.springframework.web.servlet.mvc.multiaction.MultiActionController;

 public class SampleMultiActionController extends MultiActionController {
      private Logger logger=Logger.getLogger(this.getClass().getName());
      private String viewName;

      //依赖注入一个名为viewName的参数,例如一个JSP文件,作为展示model的视图
      public String getViewName (){
            return this.viewName;
      }

      public void setViewName (String viewName){
            this. viewName =viewName;
      } 
      
      
      public ModelAndView insert(HttpServletRequest req,
                  HttpServletResponse res) throws ServletRequestBindingException, IOException {
            Map model = new HashMap();
            model.put("dataList", "新增数据...");
            return new ModelAndView(getViewName(),model);
      } 
      
      public ModelAndView update(HttpServletRequest req,
                  HttpServletResponse res) throws ServletRequestBindingException, IOException {
            Map model = new HashMap();
            model.put("dataList", "修改数据...");
            return new ModelAndView(getViewName(),model);
      }
      
      public ModelAndView delete(HttpServletRequest req,
                  HttpServletResponse res) throws ServletRequestBindingException, IOException {
            Map model = new HashMap();
            model.put("dataList", "删除数据...");
            return new ModelAndView(getViewName(),model);
      }
 }
 
      第四步,定义视图,此例中即是/WEB-INF/jsp/showme.jsp


 <%@page contentType="text/html;charset=GBK"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt " %>
 <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt "%> 
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
 <head>MuiltiActionController示例</head> 
 <body>
   <c:out value="${model.dataList}"/>
 </body>
 </html>
 
      第五步,测试。在Eclipse内启动Tomcat,在浏览器地址栏内分别输入,便可看到相应的页面输出信息:
http://localhost:8080/sample.do?whichMethod=insert 
http://localhost:8080/sample.do?whichMethod=update 
http://localhost:8080/sample.do?whichMethod=delete

 

搞自:http://moonstone2007.blog.ccidnet.com/blog-htm-do-list-uid-46968-type-blog-y-2007-m-4-page-2.html