一 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');
性能問題
如果?IN
?的值列表很大(如上千個值),數據庫優化器可能處理較慢,此時考慮用臨時表或?JOIN
。NULL 值
IN
?不會匹配?NULL
?值。如果需要包含?NULL
,需額外添加條件:WHERE name IN ('apple', 'banana') OR name IS NULL
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 & world
<script>
?→?<script>
步驟 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協議的特性共同決定的
- 二進制數據需要獨立傳輸,避免 URL 編碼導致的損壞。
- 底層庫依賴此格式解析文件,Struts2 僅是封裝了調用邏輯。
- HTTP 協議標準:
multipart/form-data
?是文件上傳的 MIME 類型規范。
Struts2 本身不直接處理文件上傳,而是依賴第三方庫(如?Jakarta Commons FileUpload?或?COS)解析?multipart/form-data
?請求。這些庫的核心邏輯是:
- 解析請求體:根據?
boundary
?分隔符提取各部分數據。 - 區分文件與文本:通過?
Content-Disposition
?頭部判斷字段類型(如?form-data; name="file"; filename="test.jpg"
?表示文件)。 - 保存臨時文件:將上傳的文件流寫入服務器臨時目錄,供后續處理。
六,組合框(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 }
。
............................