Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(五)

第五章 TTM 后备管理:5.11 迁移的执行 本文讨论 TTM 框架中缓冲区对象(BO)数据搬运的完整流程,涵盖搬运入口 ttm_bo_handle_move_mem() 的执行步骤、驱动 move 回调的约定、同步辅助函数的使用、多跳迁移机制及异步流水化搬运的处理。重点说明了中转位置的引入原因与执行逻辑,以及通过 ghost 对象和 fence 机制解决异步搬运中的资源释放与访问一致性问题,确保数据安全迁移的同时支持 GPU 异步操作。 阅读详情
这是本系列的最后一章,大象对示例进行适当的扩充并说明。
    其实到第四篇,对于示例的说明就已经全部讲完了,如果按照这样的例子,很难有什么值得学习的地方。大象本着写点有用东西的原则,在这章,对示例进行一下适当的扩充并说明。
    第五部分:扩展框架
    paramsPrepareParamsStack拦截器栈
    paramsPrepareParamsStack这个拦截器栈是在struts2-default.xml中定义的,里面包含了很多个拦截器,最重要的是这三个:params、prepare、modelDriven。我们只要记住这样几点。
    params:它负责将请求参数值设置到Action中与之同名的属性中。
    prepare:当Action实现了Preparable接口时,这个拦截器就会调用prepare()方法。如果你有想在execute()方法之前执行的逻辑处理,它就可以帮你完成这个功能。
    modelDriven:如果Action实现了ModelDriven接口,这个拦截器就会把getModel()方法中的返回结果压入值栈。这就意味着,可以在结果页面上直接使用model对象的属性。
    它的执行顺序是这样的
    首先,params拦截器会给action中的相关参数赋值,如id,username,password等等。
    然后,prepare拦截器执行prepare()方法,prepare()会根据参数,如id,去调用相关的方法,设置model对象。当然,实现的这个接口方法由你自己来定义,不局限只设置model之类的功能。
    接着,modelDriven拦截器会将model对象压入值栈,因为它是把getModel()方法中的返回结果放到值栈中,而这个方法的返回类型是个泛型参数,在实现ModelDriven接口的时候,可以给它指定一个具体的对象类型,因此返回类型也将是这个指定的对象类型,如ModelDriven<User>
    最后,params拦截器会将参数再赋值给model对象。
    思考修改与保存这两种动作。当点击人员修改时,请求为:user!input.action?id=1,params拦截器会将id参数值设置到Action中的id属性,请一定注意,id属性要有set()方法,然后prepare拦截器开始在prepare()方法中,根据这个id值取得User对象,接着modelDriven会调用getModel()方法,此时,方法中返回的是user对象,所以会把user加入到值栈中,最后再执行一次params拦截器,但这时没有其它的参数值需要赋值给user对象,所以程序会接着往下走,这里假定没有其它的业务逻辑,执行返回,字符串为input,根据前面讲的插件知识,结果页面为user-input.jsp,那么就跳转到修改页面了,而且页面中表单域将显示数据库中的值。如果理解了修改,那么保存也就清楚了。
    prepare()方法虽然不错,但是也有弊端,那就是它会对Action中的每个方法都进行拦截,不管你是执行execute还是input,还是其它的自定义方法,它都会对其拦截,这当然不是我们所希望的。那有没有更好的方式?答案是肯定的,请接着往下看。
    prepareMethedName
    使用prepare拦截器的另一种形式,在prepare名称后面加上需要拦截的方法名。比如,你要拦截input方法,可以写成prepareInput,需要拦截save方法,就写上prepareSave。采取这样的方式后,将会在执行这些方法之前时,才对它们进行拦截。
    例如,请求role!input.action,会执行RoleAction中的input方法,如果我们设置了prepareInput方法,则会先进入此方法执行,执行完后再回到input方法往下执行。
    请注意,在使用这种方式时,Preparable接口定义的prepare()方法体内不要含有任何代码,就是说给这个方法一个空实现。这样,它就什么都不做,所有的拦截处理就全部交由相应的prepareMethedName来完成。
    
    
    它们在每个对应的方法之前执行。prepareEntity就是来初始化实体对象,然后由modelDriven拦截器将getModel()方法中的返回结果放入值栈,当返回页面时,就可以直接取值了。
    StrutsAction
    重新定义一个基类,里面封装大部分的通用操作,主要依靠泛型来实现,将hibernateDao注解进来,通过继承这个基类进行基本的CRUD操作。本文末尾提供示例源码下载,里面有详细的注释,这里我只贴出部分重要代码进行说明,为了行文需要,有些注释去掉了,但源码里面都有,请大家放心。
    
    通过扩展ActionSupport,使用泛型参数,构造函数根据反射得到T的具体类型。
    
    这就是默认的执行方法,基本的操作,在这个超类里面都进行了定义,每个方法里面设置的以do开头的方法,是方便让子类进行覆盖,当基本的业务逻辑无法满足我们的需求时,就可以在子类重写这些方法。
    
    方法有默认实现,主要是列表显示,保存和删除,新增和修改已经有getModel()方法取得实体,在页面上使用s标签就可以直接取值,除非有特殊的业务需求,否则不用覆盖doInputEntity()、doViewEntity()方法。请注意,当需要实现自己的逻辑时,只需要覆盖上面定义的这些方法,而不用重写execute、input之类。
    我对HibernateDao又进行了适当的扩展与修改,提供了更多的基本封装方法,不过大家还可以继续添加。里面都有详细的注释,这里就不在赘述了。
    功能扩展
    我对例子做了两个功能,一个是角色表的增加、修改、删除、查看,另一个就是用户表的查询。可以从源码中看到,我在RoleAction中没有写一行关于增删改查的代码,因为它属于基本操作,超类中已经封装好了,所以这部分的代码都省了。对于用户表的查询,我覆盖了doListEntity()方法,在业务层进行条件封装,执行查询,返回结果。
    
    这个list就是在超类中定义的,因为默认实现中也用到了list,另外list有一个get方法,用于在页面中显示。如果不想采取方式取得list集合,就重写doListEntity()方法。这里说明下,我是没有加分页功能的,大家可以按自己的方式添加分页查询。
    在用户查询方法中,我使用的是QBC对象查询,因为这种方式很简洁,不过我在HibernateDao中也写了HQL和SQL方式的查询方法,并进行了封装,可以很方便的调用。
    
    
    这个queryResult方法的定义,你可以改为传递用户名与角色ID的参数,大象在这里就是为了方便,直接使用Request请求。这里userDao调用的query方法是在HibernateDao里面封装的,因为继承了HibernateDao,就直接在Service层拿来用了。至于具体的,可以去看源码。
    页面部分没有进行大的调整,主要是将role-list.jsp重命名为role.jsp,因为使用的是超类的默认实现。添加了role-input.jsp和role-view.jsp两个文件,并在user.jsp中,加入了查询条件。这些代码都很简单就不再贴了,而且前一篇也贴过一部分。
    对于这个例子的完整讲解说明就到此结束了。大象还想补充说明一下,这个例子只适用于学习,不适合商用,想在实际项目中运用,还需要对框架做大量的改造工作。本系列只是基于SSH2入门学习之用,源码中不含jar包,下图是本例中所需的最少jar文件,大家只要下载了spring、struts、hibernate三个完整压缩包,那么这些jar基本上都包含了。
    
    发布并启动Tomcat,然后输入访问地址:http://localhost:8080/ssh2 运行该示例,看看效果。
   
    本文为菠萝大象原创,如要转载请注明出处。
YOLO学习笔记 | YOLOv8与卡尔曼滤波实现目标跟踪与预测(附代码) YOLOv8采用改进的CSPDarknet骨干网络和动态标签分配策略,提供高精度、实时的目标检测能力。使用IOU(交并比)或马氏距离作为代价矩阵,通过匈牙利算法匹配预测框与检测框,解决多目标ID分配问题。卡尔曼滤波通过状态方程和观测方程对目标运动建模,结合预测与观测数据优化状态估计。完整代码需结合具体场景调整参数,并补充匈牙利算法实现(可参考。匈牙利算法(Hungarian Algorithm)是解决。的高效方法,常用于目标跟踪中的。),作为跟踪的输入观测值。(将检测框与预测框匹配)。 阅读详情

相关推荐

QtWebApp的使用【在Qt中搭建HTTP服务器】(一)

用Qt和QtWebApp能够实现在C++中开发HTTP Web服务器应用程序。 首先,需要先安装Qt的软件开发工具包。点此下载 其次,下载最新的QtWebApp库。点此下载 下载并解压缩QtWebApp ZIP文件。你将会看到: 如何使用QtWebApp 1)将QtWebApp.zip文件解压到文件夹中,并创建一个名为“ MyFirstWebApp”的新Qt控制台项目。然后,建立如下文件结构: 2)将以下行添加到MyFirstWebApp项目的项目文件中: QT += network include(

饭的笔记本 2万+

struts2 中 paramsPrepareParamsStack 拦截器

struts2二次参数拦截器内容: 规定了请求的执行顺序 在struts2中,其拦截器为框架精华部分,而二次参数拦截器paramsPrepareParamsStack 对于解决数据回显,对象修改属性丢失的问题悠着很良好的处理机制。 在 struts-default.xml 中的默认拦截器配置中有以下部分(可自行查找源码,通常为:struts-2.5.2\src\core\src\...

weixin_30856965的博客 196

MaxENT生态位模型实战:从数据准备到论文发表的完整指南

本文提供MaxENT生态位模型从数据准备到论文发表的完整实战指南,涵盖物种分布数据处理、环境变量筛选、参数优化及结果可视化等关键步骤。特别介绍如何通过R语言进行高级建模优化,提升模型AUC值,并分享海洋生物专题研究中的数据处理技巧。适合生态学研究者快速掌握这一强大的物种分布预测工具,产出高质量研究成果。

tensor9flow的博客 302

Struts2中的paramsPrepareParamsStack

paramsPrepareParamsStack和Struts2的默认拦截器defaultStack几乎是一样的,但是params拦截器和prepare拦截器的顺序不一样,可以查看struts2-core.jar包下的struts-default.xml defaultStack:

HosiHui的专栏 766

S7-200 SMART Modbus RTU从站配置与调试实战指南

本文提供了一份详细的S7-200 SMART PLC配置为Modbus RTU从站的实战指南。内容涵盖从硬件基础、软件准备、指令库调用、核心编程到地址映射与调试排错的完整流程。重点解析了MBUS_INIT与MBUS_SLAVE指令的关键参数配置,并深入探讨了Modbus地址与PLC内部V存储区的对应关系,帮助工程师快速打通通讯链路,实现与上位机、触摸屏等主站设备的稳定数据交互。

potato的博客 752

pyautogui库详细教程,逐行注释(附项目实战:基于图像识别实现崩坏星穹铁道自动化测试)

本文包含了pyautogui的使用方法与常见问题指南,随文附带对游戏实现的自动化项目源码与说明文档

m0_53043024的博客 1万+

hibernate3.6.10 注解配置添加表字段注释

如果使用的是xml方式配置,则:

云守护的专栏 2万+

不止于HTTPS请求:用VS2022编译的libcurl玩转文件上传和代理设置

本文详细介绍了如何使用VS2022编译的libcurl库实现文件上传和高级代理配置。通过实战代码示例,展示了多部分表单上传、二进制数据上传以及各种代理设置技巧,帮助C++开发者提升网络编程能力。

weixin_28595749的博客 206

Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(五)(转载大象)

这是本系列的最后一章,大象对示例进行适当的扩充并说明。     其实到第四篇,对于示例的说明就已经全部讲完了,如果按照这样的例子,很难有什么值得学习的地方。大象本着写点有用东西的原则,在这章,对示例进行一下适当的扩充并说明。     第五部分:扩展框架     paramsPrepareParamsStack拦截器栈     paramsPrepareParamsStack这个拦截器栈是在...

skyqqzhou的专栏 153

保姆级教程:用STM32单片机实现国标交流充电桩的CP信号检测(附完整代码)

本文详细介绍了基于STM32单片机实现国标交流充电桩CP信号检测的全流程,包括硬件设计、软件架构和充电控制实现。通过分压电路设计、ADC配置和状态机逻辑,确保充电过程的安全与可靠性,适用于新能源汽车充电桩开发。附完整代码和调试技巧,助力开发者快速掌握关键技术。

weixin_42641998的博客 252

百度AI架构师亲授:Agentic智能体在教育领域的落地(附个性化学习案例)

当我们谈论“教育智能化”时,我们真正需要的不是“更聪明的工具”,而是“能懂人的伙伴”——一个能像优秀教师那样主动观察、精准判断、动态调整的“数字助手”。Agentic智能体(智能体)正是这样的存在:它具备“自主性”(主动决策)、“反应性”(感知环境)、“目标导向”(聚焦学习目标)和“社会性”(与人/其他智能体协作),完美匹配教育场景中“个性化、动态化、协同化”的核心需求。本文将从底层逻辑到工程实现为什么Agentic是教育AI的“下一站”?(痛点与价值)Agentic智能体的核心架构是什么?

AI天才研究院 356

Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(一)

转自:Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(一)       Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(一)     在JavaEE企业级开发中,以SSH2框架为核心的应用非常广,大象根据项目实践经验,通过一个实例,详细的为大家讲解如何实现全注解式的开发。    开发环境    JD...

阿O、不拽 190

(11-3-03)多任务与元强化学习:综合实战:基于元强化学习的迷宫导航系统(3)

本文介绍了策略网络隐空间可视化的实现方法及其在强化学习中的应用。通过设计visualize_latent_space函数,使用t-SNE算法将高维隐空间特征降维至二维进行可视化,直观展示策略网络在不同任务中的特征分布。文章详细阐述了实现流程:状态收集、t-SNE降维和可视化绘图,并提供了完整的Python代码示例。实验结果表明,该方法能有效分析策略网络的学习过程与适应能力,为优化模型提供重要依据。同时,文章还介绍了主程序的完整流程,包括环境初始化、元智能体训练与评估、学习策略比较等环节,最后对实验结果进行可

码农三叔 1041

Spring2.5+Struts2+Hibernate3整合之五

转载请注明:来自http://blog.csdn.net/M_ChangGong/ 作者:张燕广该篇主要编写Service层代码以及针对Service层功能的Junit测试代码在src下创建包com.zyg.ssh.service,在该包下创建接口StudentService,其代码如下:package com.zyg.ssh.service;import java.util.

长弓的专栏 4088

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(三)

转自:Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(三)   在前两章我为大家详细分析了JAR包的选择和必须的配置文件,那么这一章,我就对例子的层次结构进行说明,并实现除WEB层的功能代码。    第三部分:建立框架代码    工程结构        大家可以看到,本例一共分为:dao、entity、service、web四层。另外在这些层次下,...

阿O、不拽 137

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

struts2+spring4+hibernate5整合实例

struts2作为一个很传统的mvc框架,在一些项目中,仍然发挥着重要的作用,另外hibernate和spring的结合也是很常见的,这里介绍struts2+hibernate5+spring4的整合,因为struts2支持最高的spring是4版本,所以这里采用的是spring4。整合的思路比较简单,可以从struts2+spring整合,然后接着整合hibernate+spring。也可以反过...

feinifi的博客 1777

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring2.5.6+Hibernate3.0.5升级到Spring3.0.5+Hibernate3.3

SSH框架升级 Spring2.5.6+Hibernate3.0.5升级到Spring3.0.5+Hibernate3.3 1、引言 项目使用的是Struts1 + Spring2.5.6 + Hibernate3.0.5框架,但项目需要开发Flex客户端, Spring 2.5.6不支持与Flex集成,于是决定升级Spring至 3.0.5版本 ,升级Spring的过程中,发现Sprin

rchm8519的专栏 5361
上一篇: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(四)
下一篇: 基于SSH2框架Struts2拦截器的登录验证实现
dw_java08
博客等级 码龄15年 122粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值