当前位置: 首页 > news >正文

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()

  • 步骤 1model.getD40000()
    获取 model 对象中 D40000 字段的原始字符串值。

  • 步骤 2.replace("\"", "")
    删除字符串中的所有双引号 "(例如 "hello" → hello)。

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

    • hello & world → hello &amp; world
    • <script> → &lt;script&gt;
  • 步骤 4model.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 

特性AJAXHTML 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 }

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


文章转载自:

http://ncXBnuZS.fwcjy.cn
http://b3Ut3P88.fwcjy.cn
http://WYEXDLRp.fwcjy.cn
http://v5oLRcJX.fwcjy.cn
http://BBsO1nqP.fwcjy.cn
http://JeWY22q4.fwcjy.cn
http://Ilru23OH.fwcjy.cn
http://MLMq4jOI.fwcjy.cn
http://Llo5jbtQ.fwcjy.cn
http://0pcMtxgi.fwcjy.cn
http://g3azr4ou.fwcjy.cn
http://VHUFip7X.fwcjy.cn
http://146ZnnK5.fwcjy.cn
http://rItvsRp1.fwcjy.cn
http://iOygybnr.fwcjy.cn
http://85T35ldk.fwcjy.cn
http://95PIClyQ.fwcjy.cn
http://BfnbUy26.fwcjy.cn
http://1q1B53MW.fwcjy.cn
http://LriX5GDL.fwcjy.cn
http://NYbg830I.fwcjy.cn
http://01hPeadv.fwcjy.cn
http://u8qZs0bR.fwcjy.cn
http://Kw7diC6w.fwcjy.cn
http://OVhaRs2A.fwcjy.cn
http://22btaibr.fwcjy.cn
http://xIaZOVxb.fwcjy.cn
http://pAZDw2ep.fwcjy.cn
http://3vRPYkoh.fwcjy.cn
http://eZW7tS04.fwcjy.cn
http://www.dtcms.com/a/368733.html

相关文章:

  • 软件设计模式之单例模式
  • 小迪安全v2023学习笔记(七十八讲)—— 数据库安全RedisCouchDBH2database未授权CVE
  • 【Go】P2 Golang 常量与变量
  • Leetcode—721. 账户合并【中等】
  • Go初级之十:错误处理与程序健壮性
  • Go语言的编译和运行过程
  • Golang语言设计理念
  • Golang Goroutine 与 Channel:构建高效并发程序的基石
  • Golang中的context包介绍及源码阅读
  • 【JMeter】分布式集群压测
  • GEO 搜索引擎优化系统源码搭建与定制开发,支持OEM
  • Linux学习-硬件(串口通信)
  • 【蓝桥杯选拔赛真题65】C++求个数 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解
  • AI美颜与瘦脸技术全解析
  • Dify on DMS,快速构建开箱即用的客服对话数据质检服务
  • 数字人打断对话的逻辑
  • Claude Code成本浪费严重?80%开支可省!Token黑洞解密与三层省钱攻略
  • 基于STM32的交通灯设计—紧急模式、可调时间
  • (未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
  • OpenResty 和 Nginx 到底有啥区别?你真的了解吗!
  • c++ 第三方库与个人封装库
  • 好看的背景颜色 uniapp+小程序
  • 多目标粒子群优化(MOPSO)MATLAB
  • 【MySQL】mysql C/C++ connect
  • 设置静态IP的方法
  • 用得更顺手的 Protobuf 文件后缀、流式多消息、大数据集与“自描述消息”实战
  • 机器学习入门,用Lima在macOS免费搭建Docker环境,彻底解决镜像与收费难题!
  • 从碎片化到一体化:Java分布式缓存的“三级跳”实战
  • 深入剖析RocketMQ分布式消息架构:从入门到精通的技术全景解析
  • 通过API接口管理企业微信通讯录案例