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中加入ContextLoaderPlugInContextLoaderPlunIn是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.xml 和 action-servlet.xml 中的 Action与Bean的桥梁是action 的"path"和 bean 的"name"。如果你在 struts-config.xml 文件中有如下配置:<action path="/users" .../> 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 加入οnsubmit="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的封装,封装自己的版本。 典型子类代码如下:
第一 extends StrutsEntityAction<User,UserManager>,声明管理的Entity类型是User,管理的Entity是UserManager,UserManager必须实现EntityDao<T>接口; 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的流程封装; 几个回调函数在子类重载,而如果几个封装函数不合心意,请重新扩展一个基类或完全重新封装。 |