Struts2深入解析:从Struts1到Struts2的演进与对比

需积分: 3 12 下载量 105 浏览量 更新于2024-08-01 收藏 617KB PPT 举报
"Struts2_zxx.ppt 是由张孝祥在北京传智播客教育机构分享的一份关于Struts2高级进阶的教程。该教程涵盖了MVC模式的回顾、Struts请求处理流程、超链接技巧、Formbean数据封装、表单重复提交的预防、复选框和下拉列表框的使用、文件上传、DispatchAction的应用、Validator框架以及Struts请求处理过程的源码分析和digester等内容。此外,教程还讨论了Struts2与Struts1之间的区别和联系,指出Struts2并非Struts1的简单升级,而是基于WebWork框架,并强调学习Struts1的重要性,因为它是许多开发人员的基础,尽管Struts2提供了更多的改进和解决方案。" 本文将深入探讨Struts2框架的关键知识点,帮助读者更好地理解和应用这个强大的MVC框架。 1. **MVC模式的回顾**: MVC(Model-View-Controller)模式是一种软件设计模式,用于分离应用程序的数据模型、用户界面和控制逻辑。在Struts2中,Model通常代表业务对象,View负责展示数据,而Controller处理用户请求并协调Model和View。 2. **Struts2请求处理时序图**: Struts2通过拦截器(Interceptor)机制处理请求,每个请求都会经过一系列的拦截器,最后到达Action,执行完业务逻辑后再通过拦截器链返回响应。 3. **超链接的技巧**: 在Struts2中,使用`s:a`标签创建超链接,可以方便地传递参数,同时支持动作的映射和重定向。 4. **封装Formbean数据**: Struts2通过Action类封装表单数据,通过注解或XML配置将表单字段映射到Action属性,简化了数据绑定。 5. **防止表单重复提交**: 为了防止用户意外多次提交表单,通常在服务器端设置临时标识或令牌,当表单提交后,检查该标识,若已存在则忽略后续的相同请求。 6. **复选框的处理**: Struts2支持集合类型的表单字段,通过`s:checkboxlist`等标签处理复选框数组,将用户选择的值绑定到Action的集合属性。 7. **下拉列表框的使用**: 使用`s:select`标签创建下拉列表,可以动态加载选项列表,与Action的属性进行双向绑定。 8. **文件上传**: Struts2的`FileUpload`拦截器支持文件上传,Action类中可以定义`File`和`String`类型的属性来接收上传文件。 9. **DispatchAction的应用**: DispatchAction允许一个Action类处理多个请求,通过方法名映射请求路径,提高代码复用。 10. **Validator框架**: Struts2的Validator框架用于验证用户输入,通过配置文件或注解定义验证规则,自动进行数据校验。 11. **Struts2请求处理过程的源码分析与digester**: Digester是Struts2解析XML配置文件的工具,理解其工作原理有助于深入理解框架内部机制。请求处理过程中,Struts2通过拦截器链、ActionInvocation和ActionContext等组件协同工作。 12. **Struts2与Struts1的区别**: Struts2在设计和实现上更加灵活,提供了更丰富的特性,如Ognl表达式语言、拦截器、类型转换等。然而,Struts1由于其广泛的应用和熟悉度,仍然是许多项目的选择。 Struts2作为Struts1的进化版,带来了许多改进,但了解Struts1的基础对于成为一名全面的Java Web开发者至关重要。通过学习Struts2的高级进阶,开发者可以提升其在企业级应用开发中的能力。

import numpy as np # 假设label和emg分别是标签和肌电信号的数据集 label = label emg = emg # 初始化空的列表 label_data = [] emg_data = [] # 循环提取每个标签数据集和对应的肌电信号数据集 for target_label in range(1, 49): # 初始化临时列表 label_subset = [] emg_subset = [] # 遍历标签数据 for i in range(len(label)): if label[i] == target_label: # 提取相同位置的标签和肌电信号数据 label_subset.append(label[i]) emg_subset.append(emg[i]) # 将临时列表转换为numpy数组,并添加到最终的数据集列表中 label_data.append(np.array(label_subset)) emg_data.append(np.array(emg_subset)) filtered_emg_data = [] fs = 1000 # 采样频率为1000 Hz win_length = 20 # 窗口长度为20毫秒 f_low = 20 # 滤波下限频率为20 Hz f_high = 100 # 滤波上限频率为100 Hz for i in range(len(label_data)): emg_subset = emg_data[i] # 获取肌电信号数据集 filtered_subset = np.zeros(emg_subset.shape) # 初始化滤波后的数据集 # 遍历每个通道(列)进行滤波处理 for j in range(emg_subset.shape[1]): emg_channel = emg_subset[:, j] # 获取当前通道的数据 # 计算 STFT nperseg = int(win_length * fs) f, t, Zxx = signal.stft(emg_channel, fs=fs, window='hamming', nperseg=nperseg, boundary=None, padded=False) # 设置带通滤波的频率范围 freq_idx = np.where((f >= f_low) & (f <= f_high))[0] Zxx_filt = Zxx.copy() Zxx_filt[np.setdiff1d(np.arange(Zxx.shape[0]), freq_idx)] = 0 # 反向STFT获取滤波信号 signal_filt = signal.istft(Zxx_filt, fs=fs, window='hamming', nperseg=nperseg) filtered_subset[:, j] = signal_filt print(signal_filt ) filtered_emg_data.append(filtered_subset) print("Filtered EMG Data Shape:", [data.shape for data in filtered_emg_data])

2023-06-12 上传