頁面需觸發後端 Action,但不提交表單數據:如「刪除」、「狀態切換」、「導出」、「頁面跳轉」等純導航/命令操作。
<a href="userAction.do?action=delete&id=1001">刪除</a> <a href="orderAction.do?method=export&format=excel">導出 Excel</a>
優點:語義清晰、可被搜索引擎抓取、支持瀏覽器歷史/收藏夾、無 JS 依賴。
缺點:參數暴露在 URL,不適合敏感數據;長 URL 受限(~2KB)。
<%@ taglib prefix="s" uri="/struts-tags" %>
<!-- 生成帶參數的 URL -->
<s:url action="userAction" var="deleteUrl">
<s:param name="action" value="delete" />
<s:param name="id" value="%{userId}" />
</s:url>
<a href="<s:property value='#deleteUrl' />">刪除</a>
<!-- 直接在標簽中使用 -->
<a href="<s:url action='orderAction'><s:param name='method' value='export'/><s:param name='format' value='excel'/></s:url>">導出</a>
優點:
contextPath、參數 URL 編碼、Session ID 重寫(無 Cookie 時)。includeParams="get/none/all" 繼承當前請求參數。// 1. 簡單跳轉
function goDelete(id) {
if (confirm('確定刪除?')) {
location.href = 'userAction.do?action=delete&id=' + encodeURIComponent(id);
}
}
// 2. AJAX 校驗後跳轉
function exportData() {
fetch('/api/export/check', { method: 'POST', body: JSON.stringify({ format: 'excel' }) })
.then(r => r.json())
.then(data => {
if (data.allowed) {
location.href = data.downloadUrl; // 後端生成臨時下載鏈接
} else {
alert(data.message);
}
});
}
// 3. POST 方式跳轉(參數不露 URL、超長參數)
function postRedirect(url, params) {
var form = document.createElement('form');
form.method = 'POST';
form.action = url;
Object.entries(params).forEach(([k, v]) => {
var input = document.createElement('input');
input.type = 'hidden';
input.name = k;
input.value = v;
form.appendChild(input);
});
document.body.appendChild(form);
form.submit();
}
// 用法
postRedirect('reportAction.do', { method: 'generate', filters: JSON.stringify(complexFilter) });
| 場景 | 推薦方式 | 理由 |
|---|---|---|
| 簡單導航、刪除、詳情頁 | 超鏈接 <a> | 語義化、SEO、無障礙、緩存友好 | 需框架自動編碼、攜帶上下文參數 | Struts <s:url> | 國際化、無 Cookie 環境、參數復用 |
| 需用戶確認、條件判斷、AJAX 前置 | JavaScript | 交互豐富、可控流程 |
| 敏感參數、大數據量、非冪等操作 | JS 動態 POST Form | 參數不入 URL、突破長度限制、防 CSRF 配合 Token |
encodeURIComponent(),Struts 標簽自動編碼。非表單請求 Action 的本質是導航與命令分離。優先使用語義化的 <a>,框架項目用 <s:url> 保證 URL 生成一致性,複雜交互交給 JavaScript。牢記:URL 參數不可信,權限在服務端。