SpringSide使用Struts

本文介绍Spring与Struts框架的整合方法,包括ContextLoaderPlugIn的配置、DelegatingRequestProcessor的应用,以及输入校验与错误信息显示的实现方式。此外还提供了SpringSide对Struts的封装方案。

Spring与Struts的整合,输入校验与消息显示

1.概述

     Struts大家都很熟悉,不再详细介绍,另请请参阅  

1. Pragmatic Struts :SpringSide推荐的最新最Pragmatic用法。

2. SpringSide的Struts封装,SpringSide封装的Struts的CRUD Action基类,默认拥有CRUD的方法,大家可以自行扩展,或者这参考其思路重新封装。

1.1 参考书籍

《Jakarta Struts Cookbook》2005 O'Reilly,在铁手的博客上有部分中文翻译。

2. Spring与Struts的整合

2.1 在struts-config.xml中加入ContextLoaderPlugIn

ContextLoaderPlunIn是Struts 1.1+ 的插件,用来为 Struts 的 ActionServlet 加载 Spring的Application Context。这个Context引用 WebApplicationContext (由 ContextLoaderListener 加载) 作为它的父Context。默认的context文件是映射的 ActionServlet 的名字,加上 -servlet.xml后缀。 如果 ActionServlet 在 web.xml 里面的定义是 action, 那么默认的文件就是 /WEB-INF/action-servlet.xml

格式如下:

 
      

2.2 在Struts-config.xml中加入DelegatingRequestProcessor

用Spring的DelegatingRequestProcessor重载Struts 默认的 RequestProcessor。这样当收到一个针对Action的请求时,DelegatingRequestProcessor会自动从Spring Context中查找对应的Action Bean。

格式如下:

 
      

2.3 建立struts-config.xml与action-servlet.xml中Action与Bean的对应关系

连接 struts-config.xmlaction-servlet.xml 中的 Action与Bean的桥梁是action 的"path"和 bean 的"name"。如果你在 struts-config.xml 文件中有如下配置:<action path="/users" .../>
你必须在 action-servlet.xml 中将 Action bean 的名字定义为 "/users":<bean name="/users" class="..."/>
设定完以后,action的type属性可以省略不写,因为所有的Action都在Spring Context中寻找。注意这里bean用的是name属性,而不是id,因为"/"在id属性中是非法字符。

3.输入校验与消息显示

       校验依旧比较麻烦,使用commons-validator 1.3版,使用struts 1.3.5带的validator-rules.xml。可选的validator 以 validator-rules.xml 中定义的为准。

3.1   定义  

     注意validaton.xml的头声明需改为1.3

 
      

       编写validation.xml,如

 
      

并在resources/i18n/messages.properties 里加入需要的message,如user.name = User Name

      struts-config.xml 加入

 
      

    3.2 客户端JS校验:

    在每个form.jsp的form 加入onsubmit="return validateUserForm(this)", 其中UserForm是validation.xml中的form名

     在jsp最后加入

<html:javascript formName="userForm" staticJavascript="false" cdata="false"/>
<script type="text/javascript" src="<c:url value="/scripts/validator.jsp"/>"></script>

3.3 服务端校验:

ActionMessages errors = form.validate(mapping, request);
        if (!errors.isEmpty()) { 
             saveErrors(request, errors);
            return mapping.findForward("edit");
         }

3.4 出错信息的显示:

    信息参见message.jsp,可显示信息或错误。

    在希望显示信息的地方加入<%@ include file="/commons/messages.jsp" %>

    如果希望同时在列里面显示出错,加入<span class="fieldError"><html:errors property="user.name"/></span>

 

 

 

SpringSide的Struts封装

1.概述 

   SpringSide对Struts做了两层封装:

   第一层:StrutsAction,继承于DispatchAction,附带一些Utils函数,另外注册了几个Converter。

   第二层:StrutsEntityAction,继承于StrutsAction, 演示了如何为单个对象的CRUD操作(增删改查)封装了默认Action,子类只需要范型声明所管理的对象类型和管理类型,即拥有CRUD操作的能力。

    大家各自项目的习惯不同,流程,可以参考SpringSide的封装,封装自己的版本。

    典型子类代码如下:

public class UserAction extends StrutsEntityAction<User,UserManager> {
     private UserManager userManager;
     public void setUserManager(UserManager userManager) {
           this.userManager = userManager;
     }
   }

   第一 extends StrutsEntityAction<User,UserManager>,声明管理的Entity类型是User,管理的Entity是UserManager,UserManager必须实现EntityDao<T>接口;
   第二 定义userManager用于依赖注入的setter函数;

2.原理

     StrutsEntityAction 会持有一个EntityDao接口的实体来做CRUD的操作,子类通过在泛型中声明UserAction<User, UserManager>,自动查找属性中类型为UserManager的属性作为EntityDao。如果子类有多个UserManager属性(很少的情况),就需自行实现getEntityManager()函数。

     CRUD现在主要封装了list、edit、view、save、delete 5个流程,一般会调用doListEntity、doGetEntity、doNewEntity、doSaveEntity(),doDeleteEntity 5个业务函数去做相应的业务操作。

     在controller中很重要的request 数据与POJO的转换,由initEntity、initForm  两个函数完成。

     initEntity 先调用bindObject 函数用BeanUtils 直接copy lazyBean的FormBean 和 Entity POJO,然后调用子类的onInitEntity()函数。initForm是同样的原理。

     通常还有一些辅助的对象,比如Book 修改页要有Category列表做下拉选择框,这些辅助对象统一子类重载onRefrence()函数放入request.attributes.

3.扩展与客户化

   EntityAction必须预留足够的扩展点给子类重载,具体函数注释见StrutsEntityAction的JavaDoc, 包括:

    1.list、edit、view、save、delete: 五种action的流程封装;
   2.doListEntity、doGetEntity、doNewEntity、doSaveEntity(),doDeleteEntity: 五种业务函数调用;
   3.initEntity、initForm : FormBean与业务对象的初始化函数及refrenceData,onInitForm,onInitEntity 三个回调函数;
   4.savedMessage、deletedMessage: 两种业务操作成功后显示的信息的回调函数。

  几个回调函数在子类重载,而如果几个封装函数不合心意,请重新扩展一个基类或完全重新封装。

采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值