Struts2 工作总结

一 in,

在SQL中,IN 是一个条件操作符,用于指定多个可能的值,通常用在 WHERE 子句中。它的作用是检查某个字段的值是否在给定的值列表中 ,相当于多个 OR 条件的简写形式。

不使用 IN(冗长)

SELECT * FROM fruits WHERE name = 'apple' OR name = 'banana' OR name = 'orange';

-- 使用 IN(简洁)

SELECT * FROM fruits WHERE name IN ('apple', 'banana', 'orange');

  1. 性能问题

    如果 IN 的值列表很大(如上千个值),数据库优化器可能处理较慢,此时考虑用临时表或 JOIN。

  2. NULL 值
    IN 不会匹配 NULL 值。如果需要包含 NULL,需额外添加条件:

    |-----------------------------------------------------|
    | WHERE name IN ('apple', 'banana') OR name IS NULL |

  3. NOT IN

    反向过滤,排除列表中的值:

    |---------------------------------------------------------------|
    | SELECT * FROM fruits WHERE name NOT IN ('apple', 'banana'); |

二,转义

model.setD40000(StringEscapeUtils .escapeHtml(model.getD40000().replace("\"", "")));

这段代码的作用是对 model.getD40000() 返回的字符串进行HTML 转义 和双引号去除 处理,然后将处理后的结果重新设置回 model.setD40000()

  • 步骤 1 :model.getD40000()

    获取 model 对象中 D40000 字段的原始字符串值。

  • 步骤 2 :.replace("\"", "")

    删除字符串中的所有双引号 "(例如 "hello" → hello)。

  • 步骤 3 :StringEscapeUtils.escapeHtml(...)

    对处理后的字符串进行 HTML 转义 ,将特殊字符(如 <, >, &, ', ")转换为对应的 HTML 实体,防止 XSS 攻击或 HTML 注入。
    示例:

    • hello & world → hello &amp; world
    • <script> → &lt;script&gt;
  • 步骤 4 :model.setD40000(...)

    将最终处理后的字符串重新设置回 model 对象的 D40000 字段。

三 排序,

List<YourObject> sortedList = originalList.stream() .sorted(Comparator.comparing(YourObject::getFieldName)) .collect(Collectors.toList());

  • originalList :原始 List。
  • YourObject::getFieldName :指定排序的字段(通过 getter 方法引用)。
  • collect(Collectors.toList()) :将排序后的 Stream 重新收集为 List。
(1) 降序排序

使用 Comparator.reversed():

|------------------------------------------------------------|
| List<Person> sortedByAgeDesc = people.stream() |
| .sorted(Comparator.comparing(Person::getAge).reversed()) |
| .collect(Collectors.toList()); |

(2) 多字段排序

先按 age 升序,再按 name 降序

|---------------------------------------------------------------------|
| List<Person> sortedByAgeThenName = people.stream() |
| .sorted(Comparator.comparing(Person::getAge) |
| .thenComparing(Comparator.comparing(Person::getName).reversed())) |
| .collect(Collectors.toList()); |

(3) 处理 null 值

如果字段可能为 null,使用 Comparator.nullsFirst() 或 Comparator.nullsLast():

|----------------------------------------------------|
| List<Person> sortedWithNulls = people.stream() |
| .sorted(Comparator.comparing( |
| Person::getName, |
| Comparator.nullsFirst(Comparator.naturalOrder()) |
| )) |
| .collect(Collectors.toList()); |

(4) 自定义排序逻辑

使用 Comparator.comparing() 并传入 Lambda:

|------------------------------------------------------------|
| List<Person> sortedByNameLength = people.stream() |
| .sorted(Comparator.comparing(p -> p.getName().length())) |
| .collect(Collectors.toList()); |

四,AJAX 和 HTML Form

特性 AJAX HTML Form
数据传输方式 异步(后台发送请求,不刷新页面) 同步(提交后页面刷新或跳转)
请求方法 通常用 XMLHttpRequest 或 fetch <form> 的 submit 行为
数据格式 JSON、XML、纯文本等 默认 application/x-www-form-urlencoded 或 multipart/form-data(文件上传)
用户体验 无刷新,动态更新页面 页面跳转或刷新
适用场景 局部更新、实时交互(如搜索建议) 传统表单提交(如登录、文件上传)
前端控制 可自定义请求头、处理响应 依赖浏览器默认行为
后端接收方式 与 Form 类似(键值对或 JSON) 通过 request.getParameter() 或 @RequestParam(Spring)

五, enctype="multipart/form-data"

sturus2上传文件时需要 enctype="multipart/form-data"

在Struts2(或任何Web应用)中上传文件时,需要使用 multipart/form-data 编码类型,这是由文件上传的底层机制和HTTP协议的特性共同决定的

  1. 二进制数据需要独立传输,避免 URL 编码导致的损坏。
  2. 底层库依赖此格式解析文件,Struts2 仅是封装了调用逻辑。
  3. HTTP 协议标准 :multipart/form-data 是文件上传的 MIME 类型规范。

Struts2 本身不直接处理文件上传,而是依赖第三方库(如 Jakarta Commons FileUpload 或 COS )解析 multipart/form-data 请求。这些库的核心逻辑是:

  1. 解析请求体 :根据 boundary 分隔符提取各部分数据。
  2. 区分文件与文本 :通过 Content-Disposition 头部判断字段类型(如 form-data; name="file"; filename="test.jpg" 表示文件)。
  3. 保存临时文件:将上传的文件流写入服务器临时目录,供后续处理。

六,组合框(ComboBox)

<select id="comboId" name="comboName">

<option value="">-- 请选择 --</option>

<option value="1">选项1</option>

<option value="2">选项2</option>

<option value="3">选项3</option>

</select>

分组选项(<optgroup>)

<select>

<optgroup label="分类1">

<option value="1">选项1</option>

<option value="2">选项2</option>

</optgroup>

<optgroup label="分类2">

<option value="3">选项3</option>

</optgroup>

</select>

Struts2 动态绑定 :通过 <s:if> 或 <s:select> 实现选项选中状态的逻辑控制。

七,overflow滚动条

|-----------|---------------------------------------------------|
| visible | 默认值,内容超出容器时直接溢出(不裁剪,不显示滚动条)。 |
| hidden | 超出部分隐藏,不显示滚动条。 |
| scroll | 强制显示滚动条(即使内容未溢出,也会显示空滚动条)。 |
| auto | 仅在内容溢出时显示滚动条(按需显示)。 |
| clip | 类似 hidden,但禁止程序化滚动(如 JavaScript 的 scrollTop)。 |

  • overflow: auto:最常用的按需滚动。
  • overflow: scroll:强制显示滚动条(适合需要明确提示可滚动的场景)。
  • 自定义滚动条 :通过 ::-webkit-scrollbar 美化(注意浏览器兼容性)。
  • 隐藏滚动条 :用 scrollbar-width: none 和 ::-webkit-scrollbar { display: none }。

............................

相关推荐
Nuanyt1 小时前
LeetCode Hot100 刷题笔记 · 普通数组专题
java·笔记·算法·leetcode
为思念酝酿的痛2 小时前
MySQL数据库基础
数据库·mysql
瀚高PG实验室2 小时前
数据库使用psql及jdbc进行远程连接,不定时自动断开的解决办法
数据库·postgresql·瀚高数据库
SelectDB技术团队2 小时前
从实时入库到实时可用:Apache Doris 5.0 增量计算场景与实践
数据库·人工智能·开源·agent·实时数仓·apache doris·增量计算
cfm_29142 小时前
Leaf-segment号段模式
java
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 发布圈子动态:数据库表和接口文档介绍
java·数据库·交友
paopaokaka_luck2 小时前
智慧电玩店管理系统(空闲机台随机分配、游玩时长概率模拟、积分自动结算、积分兑换闭环、 ECharts经营分析、 腾讯地图选址)
java·人工智能·mysql·echarts·推荐算法
Brilliantwxx2 小时前
【STM32】 独立看门狗 IWDG 深度详解:从硬件结构到工程实战
数据库·stm32·单片机·嵌入式硬件·mongodb
运维小斌3 小时前
麒麟 V10 部署 OceanBase:故障速查与验收清单
linux·数据库·oceanbase·麒麟
LMT流氓兔3 小时前
第五单元——第9课:防止同一次操作重复执行
java·服务器·数据库·算法·ai·langchain