从单体服务到微服务:多模式 Web 应用开发记录<三>预初始化属性

相关文章:

  • 多模式 Web 应用开发记录<一>背景&全局变量优化
  • 多模式 Web 应用开发记录<二>自己动手写一个 Struts

开头先看一个简单的例子,这是 ftl 文件的一个表单:

<form id="validateForm" action="#" method="post">  <div style="padding: 10px 0;" class="ft14">处理信息:</div>  <table class="inputTable"><tr> <th>备注:</th><td>  <textarea cols="10" rows="3"  name="repairVO.remark" class="formTextarea" ></textarea></td></tr></table><div  class="buttonArea" id="option"><input class="btn btn-big" action="doProcess.action" type="submit" value="处理"/><input class="btn btn-big" action="doCancel.action" type="submit" value="取消"/><input type="hidden" name="bizId" value="${(bizId)!}"></input></div></form>

单看这个表单,只会传递两个参数:bizIdrepairVO.remark。所以后端 Struts 的 Action 的成员属性会接收 remark

private RepairVO repairVO;public String doProcess() {try {logger.info("repairVO:{}" , JsonUtils.toJsonString(repairVO));//...其他业务处理return SUCCESS;} catch (Exception e) {return ERROR;}}

正常来说这里的 repairVO 应该只有 remark 属性有数据,可我这里调试发现 repairVO 居然还有其他的属性也有值。

经过排查发现是因为 Action 里面对于 repairVO 有个特殊的 setter 方法:

	public void setRepairVO(RepairVO repairVO) {if(repairVO==null){repairVO = new RepairVO();}if(repairVO.getId()==null){repairVO.setId(this.getBizId());}repairVO.setOrgId(this.getAdmin().getOrgId());repairVO.setOperateTime(new Date());repairVO.setOperatorId(this.getAdmin().getId());repairVO.setOperatorName(this.getAdmin().getUsername());this.repairVO = repairVO;}

这是因为在 Struts2 中,当一个 Action 被调用时,Struts2 会尝试将 HTTP 请求的参数绑定到 Action 的属性。这个过程是通过调用 Action 的 setter 方法完成的。相当于这里对 repairVO 进行了预初始化属性。

这个原理其实也很容易理解,在多模式 Web 应用开发记录<二>自己动手写一个 Struts中实现的 Struts 中是通过反射直接对属性进行赋值,从而进行参数绑定:

   @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String actionPath = req.getPathInfo();if (actionPath.endsWith(".jsp")) {req.getServletContext().getNamedDispatcher("jsp").forward(req, resp);} else {Class<? extends Action> clazz = actions.get(actionPath);if (clazz != null) {Action action = null;try {action = clazz.newInstance();} catch (InstantiationException | IllegalAccessException e) {e.printStackTrace();}Map<String, String[]> paramMap = req.getParameterMap();for (String paramName : paramMap.keySet()) {String[] paramValues = paramMap.get(paramName);for (String paramValue : paramValues) {Field field;try {field = clazz.getDeclaredField(paramName);if (field != null) {field.setAccessible(true);field.set(action, paramValue);}} catch (Exception e) {}}}String view = action.execute(req, resp);req.getRequestDispatcher(view).forward(req, resp);} else {resp.sendError(HttpServletResponse.SC_NOT_FOUND);}}}

这里完全可以改成基于 setter 方法进行参数绑定,那么就可以实现跟 Struts2 类似的“预初始化属性”机制。

那么在 Spring MVC 中如何实现呢,可以直接使用 @ModelAttribute 注解:

    @ModelAttribute("repairVO")public RepairParam setup() {RepairParam repairVO = new RepairParam();User currentUser = getCurrentUser();repairVO.setOrgId(currentUser.getOrgId());repairVO.setOperateTime(new Date());repairVO.setOperatorId(currentUser.getId());repairVO.setOperatorName(currentUser.getUsername());return repairVO;}@RequestMapping("doProcess.action")public String doProcess(@RequestParam("bizId") String bizId, @ModelAttribute("repairVO") RepairParam repairVO, Model model) {//...其他业务逻辑}

这里 doProcess 函数的 repairVO 对象就包括 setup 函数的预初始化属性和请求中的 repairVO.xxx 属性。也就实现了预初始化属性的设置。

欢迎关注公众号:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/709642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【第十天】C++函数对象/仿函数、谓词、适配器及常见algorithm算法

一、函数对象 重载了函数调用运算符()的类 实例化的对象叫函数对象&#xff0c;也叫仿函数。 如果函数对象 有一个参数 叫&#xff1a;一元函数对象/仿函数如果函数对象 有二个参数 叫&#xff1a;二元函数对象/仿函数如果函数对象 有三个及以上参数 叫&#xff1a;多元函数对…

windows下基于docker-desktop 安装 mysql 5.7

0.背景 docker-desktop v4.27.1Windows 11 22H2 docker-desktop 需要wsl的支持,一般win11新机子都默认开启了,安装docker-desktop 一路next即可.win10老版本需要自行安装开启wsl.一个小建议是,如果你的win10安装wsl时各种错误无法解决,建议升级到win11大概率解决,本人亲身经历…

K8S存储卷与PV,PVC

一、前言 Kubernetes&#xff08;K8s&#xff09;中的存储卷是用于在容器之间共享数据的一种机制。存储卷可以在多个Pod之间共享数据&#xff0c;并且可以保持数据的持久性&#xff0c;即使Pod被重新调度或者删除&#xff0c;数据也不会丢失。 Kubernetes支持多种类型的存储卷…

Three.js-03Vite打包入门

1.安装 说明&#xff1a;创建文件以后&#xff0c;按照提示进行操作。如cd文件夹&#xff0c;npm i ,npm run dev等操作。 npm create vitelatest 2.安装three npm i three.js 4.打开npm官网 说明:搜索three第三方库。按照案例进行操作。 5.修改App.vue文件 <script set…

2024年随想

今天2月最后一天了&#xff0c;明天就是3月了&#xff0c;年也正式算过完了吧。我也到了新的单位工作。新的开始新的工作。很高兴下个月&#xff0c;我自己的小孩就要出生了&#xff0c;我也要正式成为一名父亲了。2024年加油。

Win10Ubuntu22.04+FRP0.54搭建内网穿透

1. 下载FRP安装包&#xff0c;FRP为开源软件&#xff0c;在GITHUB可以直接下载&#xff08;选择当前最新的0.54版本&#xff09;&#xff1a;https://github.com/fatedier/frp/releases 下载windows版本安装包&#xff1a;frp_0.54.0_windows_amd64.zip 下载Linux版本安装包&am…

swift 监听状态栏frame变化

针对状态栏高度做一些操作 import UIKitclass ViewController: UIViewController {private var statusBarFrameObservation: NSKeyValueObservation?override func viewDidLoad() {super.viewDidLoad()if let statusBarManager UIApplication.shared.windows.first?.window…

golang的接口探索

1、接口是什么? 在Go语言中,接口是一种类型。抽象地定义了一组方法签名,但不实现这些方法。接口类型指定了一个值应该有哪些方法,因此,任何具有这些方法的类型都自动满足该接口。 在 Go 语言的语义上,只要某个类型实现了所定义的一组方法集,则就认为其就是同一种类型,…

Rocky Linux 运维工具 chown

一、chown 的简介 chown 用于更改文件或目录的所有者&#xff08;owner&#xff09;身份。通过 chown 命令&#xff0c;可以将文件或目录的所有权转移给另一个用户或组&#xff0c;从而控制对该文件或目录的访问和权限。 二、chown 的参数说明 使用语法&#xff1a;chown [新所…

算法刷题day19

目录 引言一、因数平方和二、爬树的甲壳虫三、改变数组元素 引言 这几道题主要都是考察数学&#xff0c;如果数学学的不好&#xff0c;推不出来公式&#xff0c;或者是你的数学思维不好都是做不出来的&#xff0c;所以说数学真的很重要&#xff0c;不过其实能考的数学也就那几…

手撕LRU缓存——LinkedHashMap简易源码

题目链接&#xff1a;https://leetcode.cn/problems/lru-cache/description/?envTypestudy-plan-v2&envIdtop-100-liked 原理非常简单&#xff0c;一个双端链表配上一个hash表。 首先我们要知道什么是LRU就是最小使用淘汰。怎么淘汰&#xff0c;链表尾部就是最不常用的直接…

Google大模型Bard更名Gemini,现在实力如何?(VS gpt系列)

名人说&#xff1a;一花独放不是春&#xff0c;百花齐放花满园。——《增广贤文》 作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、简要介绍1、Gemini是什么&#xff1f;2、主要特点3、Gemini的版本4、应用潜力5、…

zookeeper启动报错

启动zookeeper报错 从报错中可以看到 Invalid config, exiting abnormally 意思是&#xff1a;配置无效&#xff0c;异常退出 在往上看是没有zoo.cof这个配置文件 2024-02-27 14:47:03,285 [myid:] - ERROR [main:o.a.z.s.q.QuorumPeerMain99] - Invalid config, exiting…

基于AMDGPU-ROCm的深度学习环境搭建

在风起云涌的AI江湖&#xff0c;NVIDIA凭借其CUDA生态和优秀的硬件大杀四方&#xff0c;立下赫赫战功&#xff0c;而另一家公司AMD也不甘示弱&#xff0c;带着他的生态解决方案ROCm开始了与不世出的NVIDA的正面硬钢&#xff0c;"ROCm is the answer to CUDA", AMD官网…

2月29日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 小米汽车门店开建&#xff0c;首批销售网点至少六十家 &#x1f30d; 中国民航局&#xff1a;到2035年我国将建成航空运输强国 &#x1f30b; 中国石化&#xff1a;已累计建成充电站超6000座 &#x1f381; ofo 被强制执…

前端监控及搭建前端监控

前端监控怎么做&#xff1f; 前端也需要监控&#xff1f;技术人不可忽视的前端监控最全指南 一.前端监控的目的 为什么要进行前端监控&#xff1f; 是一种用于捕获&#xff0c;分析和报告网站或应用程序中存在异常&#xff0c;错误和性能问题的方法。通过监控&#xff0c;…

java界面代码

package day02;import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class lei4j extends JFrame implements ActionListener {//创建文本框JTextField tiaomu new JTextField(40);//创建密码文本框JPasswordField JK ne…

Java——数组的定义与使用

目录 一.数组的基本概念 1.什么是数组 2.数组的创建及初始化 3.数组的使用 二.数组是引用类型 1.初始JVM的内存分布 2.基本类型变量与引用类型变量的区别 3.再谈引用变量 4.认识 null 三.数组的应用场景 1.保存数据 2.作为函数的参数 2.1参数传基本数据类型 2.…

centos8安装xrdp

centos8安装xrdp 1、安装桌面服务2、关闭selinux3、安装xrdp4、创建root用户4.1 创建普通用户4.2 更改为超级用户 5、连接 xrdp是可以提供远程桌面服务&#xff0c;让linux系统也可以像windows一样&#xff0c;进行远程连接 1、安装桌面服务 Linux服务器没有安装桌面环境。如…

学习vue3第二节(使用vite 创建vue3项目)

使用vite 创建vue3项目 node 安装请移步 node官网&#xff1a; https://nodejs.p2hp.com/ node 版本控制 请移步 nvm官网&#xff1a;https://nvm.uihtm.com/ vite 生成vue项目完整版 请移步 vite官网&#xff1a;https://cn.vitejs.dev/ 1、使用 npm 或者 yarn 创建vue3 项目…