从单体服务到微服务:多模式 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.hqwc.cn/news/499010.html

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

相关文章

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水果质量识别系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本篇博客详尽介绍了一套基于深度学习的水果质量识别系统及其实现代码。系统采用了尖端的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等前代算法进行了详细的性能对比分析&#xff0c;提供在识别图像、视频、实时视频流和批量文件中水果方面的高效准确性…

SpringBoot接收参数的几种形式

SpringBoot接收参数的几种形式 在SpringBoot中获取参数基本方式有5种,需要都掌握. 这里需要记住一个技术术语或概念 API接口: 你写好的那个URL地址,就被称为API接口 1. 接收常规参数 给/param/demo1这个URL接口发送id, name两个参数 以上是以GET请求类型进行发送,实际发送…

EasyX的使用(详解版)

EasyX的基础概念&#xff1a; 图形化——EasyX的安装-CSDN博客 创建图形化窗口 #include<graphics.h> #include<conio.h> int main() {//创建绘图窗口&#xff0c;大小为100x100像素。//更改为大窗口&#xff0c;像素增大&#xff1b;更改为小窗口&#xff0c;像素…

Jenkins笔记(一)

个人学习笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 目录 一&#xff1a;简单了解 二&#xff1a;什么是DevOps 三&#xff1a;安装Jenkins 四&#xff1…

HarmonyOS—端云一体化组件

概述 DevEco Studio还为您提供多种端云一体化组件。集成端云一体化组件后&#xff0c;您只需进行简单配置即可向应用用户提供登录、支付等众多功能。 登录组件 您可使用端云一体化登录组件向应用用户提供登录和登出功能&#xff0c;目前支持帐号密码登录、手机验证码登录、以…

喜报|迪捷软件入选工信部“2023年信息技术应用创新解决方案”

为进一步推进信创生态建设&#xff0c;激发产业自主创新活力&#xff0c;高效促进供需协同发展&#xff0c;加强区域联动和资源整合&#xff0c;国家工业和信息化部网络安全产业发展中心&#xff08;工业和信息化部信息中心&#xff09;联合相关单位&#xff0c;遴选了一批可复…

idea集成git详解教程(实用篇)

0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可&#xff08;NEXT&#xff09; 2.软件测试 在Windows桌面空白处&#xff0c;点击鼠标右键&#xff0c;弹出右键菜单 Git软件安装后&#xff0c;会在右键菜单中增加两个菜单 Git GUI He…

django框架不调试下会被达出史(sql查询次数,消耗时间)

1:使用pycharm编辑器里面 2:安装django-debug-toolbar 3:进行调试查询 https django框架调试,各个面板查询消耗时间&#xff0c;pycharm,debug 1&#xff1a;settings.py INSTALLED_APPS列表中添加 INSTALLED_APPS [# 使用多合一有点慢# multi_captcha_admin,# 多合一验证码i…

Linux 基础之 vmstat 命令详解

文章目录 一、前言二、使用说明2.1 vmstat [delay/count/d/D/t/w]2.2.vm模式的字段 一、前言 vmstat(VirtualMeomoryStatistics&#xff0c;虚拟内存统计)是一个不错的 Linux/Unix 监控工具&#xff0c;在性能测试中除了top外也是比较常用的工具之一&#xff0c;它可以监控操作…

Html零基础入门教程(非常详细)

文章目录 1.认识HTML2.html 框架3.HTML常见标签4.HTML语法特征5.列表 1.认识HTML html是超文本标记语言: 目前最新版本是html5,由w3c(万维网联盟)完成标准制定。 声明文档的类型是html5 超文本标记语言。 HTML &#xff0c;全称“Hyper Text Markup Language&#xff08;超文…

【HTML】HTML基础2(一些常用标签)

目录 例子 首先是网页图标 然后是一些常用标签 插入图片 例子 <!DOCTYPE html> <html><head><link rel"icon" href"img/银河护卫队-星爵.png" type"image/x-icon"><meta charset"utf-8"><title>…

MySQL 自增列解析(Auto_increment)

MySQL数据库为列提供了一种自增属性&#xff0c;当列被定义为自增时。Insert语句对该列即使不提供值&#xff0c;MySQL也会自动为该列生成递增的唯一标识&#xff0c;因此这个特性广泛用于主键的自动生成。 一、自增列的用法 自增列具有自动生成序列值&#xff0c;整型&#…