JBoss Seam (POJO without EJB) 后台 + ExtJS 前台完整例子(九)

Seam框架通过元注解、对象创建与代码分离等技术简化Java开发流程,提升开发效率。本文介绍Seam框架如何减少XML配置依赖,实现POJO组件化,并通过实例展示其简化开发的具体方式。

JBoss Seam (POJO without EJB) 后台 + ExtJS 前台完整例子(九)


1.引言

在2007年初,接触到了RubyOnRails,为其开发的快捷和方便所折服。反观用了多年的Java技术,则很难找到能与之抗衡的新框架。难怪有人要超越java( Beyond Java)了。

Spring 曾经因为倡导无EJB的J2EE企业级开发,近几年来得到了广泛的关注和应用。JBoss Seam(本文下面简称为Seam)的出现,被认为和Spring框架存在着不同技术架构的竞争关系。对它们之间的关系出现了很多的 争论与取舍。这也许是一件好事,从另一面反映出了Java 社区的活力。

Seam的很多概念比较新,所以本文首先罗列了一些有价值的资源。然后以本项目的实践为基础,说明Seam从哪些方面简化了Java开发。

2. 认识Seam

Seam 2.0是2007年11月发布的,系统完整的中文资料可能还难以找到,你应该从阅读其发行包中的参考手册开始。不过,已经有人在 组织翻译Seam的参考手册,相信不久就会发表。

今年出版的《 JBoss seam : simplicity and power beyond Java EE》是必须阅读的一本好书。

从全局域管理的角度来认识Seam,我认为抓住了Seam的核心概念,让人有茅塞顿开的感觉。感谢zaya的这篇好 文章

3. 元注解代替XML配置文件

每个Java开发人员对XML配置文件都不会陌生. 随着应用规模的扩大, XML配置文件的内容会随之膨胀, 带来管理上的困难. Seam用元注解(meta annotation)代替了XML配置文件。

例子1:
java 代码
  1. @Restrict
  2. @Name("hotelService")
  3. @AutoCreate
  4. public class HotelService extends BaseService {
  5. 。。。

例子2:
java 代码
  1. @Entity
  2. @Name("user")
  3. @Scope(SESSION)
  4. @Table(name="Customer")
  5. public class User implements Serializable
  6. {
  7. 。。。
  8. @Id
  9. public String getUsername()
  10. {
  11. return username;
  12. }

4. 对象的创建与应用代码分离

应用不再由new关键字或者Class.forName()来创建(组件的)对象。我们来对比一下。

在没有使用Seam框架的程序中,外观类或控制器类中,要调用服务类的方法,必须先创建服务类的实例,这样做:
java 代码
  1. private UserService _userService = null;
  2. private void createUserService() {
  3. if (_userService == null)
  4. _userService = new UserService();
  5. }
  6. public FormValidateResult changePassword(int userId, String currentPassword, String newPassword, String newPassword2, HttpSession session) {
  7. createUserService();
  8. return _userService.changePassword(userId, currentPassword, newPassword, newPassword2, session);
  9. }

用了Seam框架后,我们可以这样做:

java 代码
  1. @In private UserService userService;
  2. public void changePassword(String newPassword) {
  3. userService.changePassword(newPassword);
  4. }

借助@In元注解,我们需要的服务类对象(userService),Seam框架会自动创建并送来。

5. 类即对象

这一点在 zaya文章中有很精彩的描述。动态类型语言(如Ruby、JavaScript等)的特点就是模糊了对象和类之间的区别。对于开发人员来说,在Seam框架下编程,因为总是在与已经实例化的对象打交道,所以给人的感觉好像总是在调用类中的静态方法。

6. 层之间不再需要用接口来连接

用接口(interface)来隔离不同层,被认为是提高软件可维护性的好的做法。但是,在大多数情况下,它所带来的好处却远远没有给开发效率的影响来得大。

如果你用POJO作为Seam的组件,那么你无需编写相应的接口就能直接访问不同层的组件。

7. 无依赖扩展

这一点在 zaya文章中也有很精彩的描述。本项目中的 com.divo.core.misc.ExtendedIdentity 类就是一个很好的例子:

java 代码
  1. @Name("org.jboss.seam.security.identity")
  2. @Scope(SESSION)
  3. @Install(precedence = APPLICATION)
  4. @BypassInterceptors
  5. @Startup
  6. public class ExtendedIdentity extends Identity {
  7. 。。。

通过 @Install(precedence = APPLICATION) 元注解,能自动用 ExtendedIdentity 类替换掉 Seam 框架内建的 Identity 组件。

8. 双向注入

在操作当前登录用户信息时,双向注入给编程带来的好处是很明显的。用户登录成功后,传统的做法需要自己编程把用户信息存入 session:

java 代码
  1. public FormValidateResult login(String loginName, String password, boolean remember, HttpSession session, HttpServletResponse res) {
  2. ...
  3. CurrentLogin myLogin = CurrentLogin.newInstance(userId,userName,loginName);
  4. session.setAttribute(CurrentLogin.LOGIN_KEY, myLogin);

在需要当前登录用户信息时,再从session中取出:

java 代码
  1. CurrentLogin myLogin = (CurrentLogin) session.getAttribute(CurrentLogin.LOGIN_KEY);

用Seam框架编程,相同的功能这样实现(参见UserService.java类):

java 代码
  1. @In(required = false) User user;
  2. @Out(required = false, scope = SESSION)
  3. public User getUser() {
  4. return this.user;
  5. }

通过注出(@Out)元注解,使得登录成功后,无需写任何代码,就能自动将当前登录用户信息保存到会话域。而修改用户密码时,我们也不用写任何代码,Seam框架自动从会话域取出了当前登录用户对象给我们用。

9. 对话域

Seam框架为了解决会话域膨胀问题,引入了一个新的域,即对话域(conversation scope)。从现有设计来看,它主要是为了解决跨多个页面的请求的状态问题。客户端改用ExtJS后,跨多个页面的请求显然已经消失。

那么对话域是否还有用呢?从目前的实践来看,还不好下什么结论。所以我在这里先把问题提出来吧。

10. 安全性

Seam框架对安全性的考虑非常细致周到,本系列文章将有专门的一篇加以介绍。

11.不强制使用特定的架构

应用的规模和要求会有很多差异,用Seam框架可以选择使用EJB,也可以使用POJO without EJB。使用POJO后,仍然可以获得Seam框架提供的各种组件特性。

本项目就使用POJO without EJB这种轻量级的架构方案,并且设计了外观-服务分层架构,详细内容请参见本系列的下一篇文章。

12.结语

本人对Seam框架的学习和实践还是初步的,体会还比较粗浅。但是,Seam框架对Java开发的简化,的确是走出了很大的一步。

附:下面是本系列所有文章的完整列表:
(1) 下载示例项目并安装运行
(2) 建立Eclipse开发环境
(3) 熟悉项目中与JSF相关内容
(4) 重新认识JS
(5) ExtJS之表单(Form)
(6) ExtJS之布局(Layout)
(7) ExtJS之网格(Grid)
(8) Java后台和前台的通讯机制
(9) Seam框架简化Java开发
(10) 分层架构设计
(11) 安全性
(12) 单元测试
内容概要:本文围绕“计及V2G主动支撑的光伏-储能-电动汽车输配协同日前优化调度”展开研究,提出了一种综合考虑光伏发电、储能系统与电动汽车(EV)在V2G(Vehicle-to-Grid)模式下协同参与电网调度的优化模型。通过Matlab代码实现,构建了日前优化调度框架,充分挖掘电动汽车作为移动储能单元的潜力,利用其双向充放电能力为主动配电网提供调峰、填谷和备用等主动支撑服务。研究综合考虑了可再生能源出力不确定性、负荷需求波动以及电动汽车出行行为特征,建立了多主体、多目标的协同优化机制,旨在降低系统运行成本、提高新能源消纳水平,并增强电网运行的稳定性与可靠性。该资源属于电力系统与综合能源系统领域的高水平科研复现资料,具备较强的理论深度与工程应用价值; 适合人群:具备电力系统分析、优化建模基础及Matlab编程能力的研究生、科研人员,以及从事智能电网、能源互联网、综合能源系统等相关领域技术研发的专业技术人员; 使用场景及目标:①用于学习和复现源-网-荷-储协同优化调度的核心建模方法与求解流程;②掌握V2G技术在电网调频调峰中的数学建模方法及其在优化调度中的集成应用;③支撑光伏、储能与电动汽车耦合系统的低碳经济调度、鲁棒优化或分布鲁棒优化等前沿课题的研究与仿真验证; 阅读建议:建议结合文中提供的Matlab代码与主流优化工具箱(如YALMIP、CPLEX、Gurobi等)进行实践操作,重点理解目标函数设计、约束条件构建及多变量耦合关系的处理策略,同时可进一步拓展至日内滚动优化、实时调度或多时间尺度协调优化方向开展深入研究。
内容概要:本文提出了一种基于改进自适应完备集合经验模态分解(Improved Adaptive Complete Ensemble Empirical Mode Decomposition, ICEEMDAN)的混合储能辅助火电机组调频协同控制策略,并提供了完整的Matlab代码实现。该策略利用ICEEMDAN对电网频率波动信号进行高精度自适应分解,提取不同时间尺度下的功率分量,进而合理分配火电机组与混合储能系统(如蓄电池、飞轮等)的调频任务,充分发挥各自响应速度快慢互补的优势。通过引入优化算法对功率分配系数进行动态整定,实现了调频过程中储能系统的高效协同运行,有效抑制了功率波动,提升了系统频率调节的快速性、稳定性和调节精度,同时延长了储能设备的使用寿命。文中详细阐述了算法原理、模型构建、控制逻辑设计及仿真验证过程,具有较强的可复现性与工程应用价值。; 适合人群:具备电力系统自动化、新能源并网控制或智能优化算法等相关专业知识背景,熟悉Matlab/Simulink仿真平台的技术人员,特别适用于从事电网调频、储能系统控制、信号处理在电力系统中应用等方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入研究混合储能系统在提升传统火电机组调频性能中的作用机制;②掌握ICEEMDAN等先进非平稳信号处理方法在功率动态分解中的具体实现与参数调优;③构建火电机组-储能协同调频仿真模型,开展多工况对比分析以优化控制性能;④为相关学术论文复现、科研项目申报或实际工程方案设计提供可靠的技术参考与代码支持。; 阅读建议:建议结合Matlab代码逐模块阅读文档内容,重点关注ICEEMDAN的实现流程、IMF分量筛选规则、功率分配权重计算逻辑及整体控制架构的设计思路。读者可通过调整信号噪声水平、滤波参数、储能容量配置等变量进行仿真实验,对比不同策略下的调频效果,从而深化对协同控制机理的理解,并可进一步拓展至风光火储联合系统或多时间尺度协调控制的研究场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值