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。
格式如下:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>
2.2 在Struts-config.xml中加入DelegatingRequestProcessor
用Spring的DelegatingRequestProcessor重载Struts 默认的 RequestProcessor。这样当收到一个针对Action的请求时,DelegatingRequestProcessor会自动从Spring Context中查找对应的Action Bean。
格式如下:
<controller>
<set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/>
</controller>
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" .../>
你必须在 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
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd">
编写validation.xml,如
<form name="userForm">
<field property="name" depends="required">
<arg0 key="user.name"/>
</field>
</form>
并在resources/i18n/messages.properties 里加入需要的message,如user.name = User Name
struts-config.xml 加入
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
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: 两种业务操作成功后显示的信息的回调函数。
几个回调函数在子类重载,而如果几个封装函数不合心意,请重新扩展一个基类或完全重新封装。
相关推荐
SpringSide 使用 Maven 的 Archetype 插件来生成项目模板,这种模板使用 Velocity 语法编写,使得定制和扩展变得更加灵活。 在 SpringSide3.0 中,项目模板存放在 `archetypes` 目录下。新生成的项目包含了基础的...
在本文档中,我们将详细介绍如何使用Springside 3.3.4版本,并特别关注SSH(Spring + Struts + Hibernate)整合的方法。 #### 二、环境配置与准备 1. **安装Java JDK**: - 首先确保已经安装了Java环境,并且设置...
《SpringSide框架详解:整合Spring、Hibernate与Struts2的高效解决方案》 SpringSide框架,作为一款基于Java的开源企业级应用开发框架,是开发者们为了简化开发流程、提高开发效率而精心设计的。它巧妙地融合了...
"ssh3.3"这个文件名暗示了SpringSide 3.3可能集成了Struts2、Hibernate和Spring,也就是常说的SSH框架。这三个框架的整合能够实现高效的MVC开发,Struts2处理请求和展示视图,Hibernate负责持久化操作,Spring则...
《SpringSide 4:构建企业级Java应用的全方位指南》 ...通过深入研究SpringSide 4项目,开发者不仅可以掌握Spring、Struts2和Hibernate的整合使用,还能学习到企业级应用开发的最佳实践,提升自己的Java开发技能。
标题 "struts2+spring3+hibernate3+jquery+springside 做一个OA2" 提供了一个综合的Web开发框架组合,用于构建一个办公自动化(OA)系统。这个系统基于以下技术栈: 1. **Struts2**: Struts2是一个Java Web MVC...
在JavaEE领域,SpringSide4-Master涵盖了诸如Hibernate、Struts、JSF等其他主流框架的替代方案,展示了Spring的全面性和兼容性。它还涉及了RESTful API设计、JSON序列化、模板引擎以及前后端分离等现代Web开发技术,...
2. **使用Eclipse/MyEclipse进行开发**:SpringSide提供了一个专门的Eclipse/MyEclipse插件,用于项目创建和管理。安装插件后,在Eclipse/MyEclipse中设置SpringSide的目录,然后通过File->New->other菜单创建一个新...
### Springside3与传统SSH(Struts + Spring + Hibernate)的区别 #### 1. 数据库设计 在数据库设计方面,Springside3采用了一种更为现代化的方法,这体现在其对实体对象、DAO对象的设计上。它更加侧重于利用Java ...
### 使用SpringSide开发Web项目知识点详解 #### SpringSide简介 SpringSide是一个以Spring Framework为核心,遵循Pragmatic风格的Java EE应用参考示例。它集成了当前Java EE世界的主流技术选型与最佳实践,旨在帮助...
通过实现`getModel()`方法返回模型对象,Struts2可以在处理请求时直接使用该对象。 ##### 4.2 Prepareable接口 实现`Prepareable`接口可以允许开发者在Action执行之前做一些准备工作,如初始化表单数据等。 #### ...
7. **单元测试与集成测试**:SpringSide提供了丰富的测试支持,使用JUnit进行单元测试,使用Mockito进行模拟对象测试,以及使用DBUnit进行数据库相关的集成测试。源码中包含了这些测试用例,有助于理解如何在Spring...
在项目中,Spring与Hibernate结合使用,实现了数据持久层的高效管理。JPA接口提供了统一的数据访问API,降低了与具体数据库系统的耦合度。同时,通过Struts2的拦截器和动作设计,实现了业务逻辑和视图的分离,提高了...
SpringSide以Spring Framework为核心,提供Pragmatic之中又适合工业化大规模开发的企业应用Kickstart。 如果说Sun 的代码规范规定了大家在代码中如何命名变量,怎么编写注释的话,SpringSide则是对怎么用不轻也不重...
SpringSide3的主要优点在于其自动化项目生成,能够快速启动新项目,并且支持多种技术栈,包括持久化层的Hibernate和Spring Jdbc,Web MVC的Struts2,视图层的JSP和JQuery,以及企业服务如Web Service(JAX-WS通过CXF...