热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

深入解析Java的Struts框架中的控制器DispatchAction

这篇文章主要介绍了深入解析Java的Struts框架中的控制器DispatchAction,Struts是Java的SSH三大web开发框架之一,需要的朋友可以参考下

Struts中的表单处理器为ActionForm,而struts中的控制器主要是Action,以及DispatchAction控制器等。
Action
在struts中,所有的用户都会经过ActionServlet的处理,而实际的工作是交给Action对象来处理的,ActionServlet可以从配置文件中创建ActionMapping对象,从ActionMapping对象中找到对应使用的Action,然后将用户请求转交给Action。
对Struts一个ActionMapping只能生成一个Action对象,当用户发起请求的时候会检查所需要的Action对象是否存在,如果不存在就会生成一个Action对象,在以后的处理过程中使用这个对象。
当我们使用Action的时候需要继承arg.apache.struts.action.Action这个类,在子类中加入所需要的业务逻辑处理,这些子类会返回ActionForward对象,ActionServlet接受这个对象,把页面转发到指定页面,从而把用户请求的结果发送到对应的页面。我们在struts-config.xml中进行配置。配置的主要属性如下:
(1)  path属性:访问Action的URL地址,当用户请求路径和URL匹配时,ActionServlet会把这个用户请求发送给Action处理。
(2)  type属性:指定处理请求的Action对应的类,需要写类文件的包路径。
(3)  name属性:指定我们的Action用到的ActionForm名字,这个ActionForm必须是在中定义过的。
(4)  scope属性:指定ActionForm的使用范围,缺省值为session范围。
(5)  input属性:指定表单验证出错的时候转向页面。
(6)  validate属性:指明是否自动调用ActionForm中的validate方法对表单进行验证。
配置示例如下代码。

 
    
       
    
   
    
       
              
              
       
    
   
 


问题
当我们完成用户增删改查操作时采用struts框架,我们需要为增删改查建立四个不同的Action,如果有更多的增删改查操作,比如对物料增删改查也需要建立四个Action,这样造成了大量的Action。
问题的解决
在struts中的Action类中,只提供了一个execute()方法,一个用户请求URL只能对应一个servlet,在struts中提供了另一个控制器类org.apache.struts.actions.DispatchAction,这个类可以经完成相关业务逻辑所需方法几种在一个DispatchAction类中,我们继承DispatchAction类后不重写execute()方法,而是编写自己的方法,在不同的方法中处理不同的动作。删除用户增删改查对应的Action,建立UserAction。

20151211175605933.jpg (244×123)

界面中调用代码如下所示。


其中list对应着UserAction中的list方法,传递的字符串与UserAction中的方法名相同。
UserAction中的代码如下所示:

packagecom.bjpowernode.drp.web.actions; 
  
importjava.util.Date; 
importjava.util.List; 
  
importjavax.servlet.http.HttpServletRequest; 
importjavax.servlet.http.HttpServletResponse; 
  
importorg.apache.commons.beanutils.BeanUtils; 
importorg.apache.struts.action.ActionForm; 
importorg.apache.struts.action.ActionForward; 
importorg.apache.struts.action.ActionMapping; 
importorg.apache.struts.actions.DispatchAction; 
  
importcom.bjpowernode.drp.manager.UserManager; 
importcom.bjpowernode.drp.model.User; 
importcom.bjpowernode.drp.web.forms.UserActionForm; 
  
public classUserAction extends DispatchAction { 
  
   
  
  
   protected ActionForward list(ActionMapping mapping, ActionForm form, 
          HttpServletRequestrequest, HttpServletResponse response) 
          throwsException { 
      //调用业务逻辑操作 
      List userList = UserManager.getInstance().findAllUserList(); 
      request.setAttribute("userlist",userList); 
       
      returnmapping.findForward("list_success"); 
   } 
  
   
   /** 
   * 用户删除 
   * @param mapping 
   * @param form 
   * @param request 
   * @param response 
   * @return 
   * @throws Exception 
   */ 
   public ActionForward del(ActionMapping mapping, ActionForm form, 
          HttpServletRequestrequest, HttpServletResponse response) 
          throws Exception { 
      //获取从页面表单中提交过来的值 
      UserActionForm uaf = (UserActionForm)form; 
       
      //取得需要删除的userId的集合 
      String[] userIdList = uaf.getSelectFlag(); 
  
      //调用业务逻辑操作 
      UserManager.getInstance().deleteUsers(userIdList); 
      return mapping.findForward("del_success"); 
   } 
   
   /** 
   * 用户添加 
   * @param mapping 
   * @param form 
   * @param request 
   * @param response 
   * @return 
   * @throws Exception 
   */ 
   public ActionForward add(ActionMapping mapping, ActionForm form, 
          HttpServletRequest request, HttpServletResponse response) 
          throwsException { 
       
      //获取从页面表单中提交过来的值 
      UserActionForm uaf = (UserActionForm)form; 
      Useruser = new User(); 
      BeanUtils.copyProperties(user,uaf); 
      user.setCreateDate(newDate()); 
       
      //调用业务逻辑操作 
      UserManager.getInstance().addUser(user); 
      returnmapping.findForward("add_success");  } 
  
   /** 
   * 修改用户 
   * @param mapping 
   * @param form 
   * @param request 
   * @param response 
   * @return 
   * @throws Exception 
   */ 
   public ActionForward modify(ActionMapping mapping, ActionForm form, 
          HttpServletRequestrequest, HttpServletResponse response) 
          throwsException { 
      //获取从页面表单中提交过来的值 
      UserActionForm uaf = (UserActionForm)form; 
      User user = new User(); 
      BeanUtils.copyProperties(user,uaf); 
       
      //调用业务逻辑操作 
      UserManager.getInstance().modifyUser(user); 
      returnmapping.findForward("modify_success"); 
   } 
   
   /** 
   * 根据ID查询用户 
   * 
   * @param mapping 
   * @param form 
   * @param request 
   * @param response 
   * @return 
   * @throws Exception 
   */ 
   public ActionForward find(ActionMapping mapping, ActionForm form, 
          HttpServletRequestrequest, HttpServletResponse response) 
          throwsException { 
      //获取从页面表单中提交过来的值 
      UserActionForm uaf = (UserActionForm)form; 
       
      String userId = uaf.getUserId(); 
       
      //调用业务逻辑操作 
      User user = UserManager.getInstance().findUserById(userId); 
       
      //将user对象从Action传递到JSP页面 
      request.setAttribute("user",user); 
       
      returnmapping.findForward("find_success"); 
   } 
   
} 

  


Struts-config.xml配置文件代码如下所示。

 
   
   
       
   
   
   
     
        
         
         
         
         
         
   
 


其中配置Action的时候,配置了parameter属性,并且指定了parameter属性值为command,当用户单击添加或删除用户操作时,会以http://localhost:8080/struts_dispatchaction_usermgr/user/user_maint.do?command=list,这个请求会被映射到UserAction控制器中,Struts根据method参数的值把这个请求发送到控制器UserAction的list方法。这样取得参数完成页面的调用。
从上述可以看出,DispatchAction可以通过command这个参数的值来决定调用DispatchAction的哪个方法,DispatchAction是从用户请求的URL中提取parameter定义参数的值,从而决定调用哪个方法处理用户请求。所以DispatchAction不能通过ActionForm向服务器提交请求,因为提交表单的时候不能向服务器传递参数。
根据上述示例我们可以总结出DispatchAction与Action区别:Action是从表单中取得数据,并且自动转换为对应的类型。而DispatchAction取得配置文件中parameter,截取parameter定义的参数值。但是DispatchAction可以处理多个动作而不需要建立多个Action。
DispatchAction可以在同一个控制器中处理多个动作,但只能通过URL来调用控制器,根据用户提交的参数来决定调用哪个方法来处理用户请求。不能通过表单提交用户请求信息,在struts中如果要在同一个表单中处理不同的动作,可以使用LookupDispatchAction。在这里就不详细讲述了,有兴许的童鞋可以查找些资料来实现。


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文介绍了如何在具备多个IP地址的FTP服务器环境中,通过动态地址端口复用和地址转换技术优化网络配置。重点讨论了2Mb/s DDN专线连接、Cisco 2611路由器及内部网络地址规划。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 解决MongoDB Compass远程连接问题
    本文记录了在使用阿里云服务器部署MongoDB后,通过MongoDB Compass进行远程连接时遇到的问题及解决方案。详细介绍了从防火墙配置到安全组设置的各个步骤,帮助读者顺利解决问题。 ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
author-avatar
天人景观2010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有