在项目开发中,有时会出现这样的场景:
同一个页面由多个不同入口方法进入(例如不同的审核状态列表),但页面上有一个搜索表单(<form>
),表单提交时需要回到当前入口的 URL,而不是固定跳转到某个方法(例如 list.do
)。
以本例为例,后台有三个不同入口方法,分别调用同一个 list()
方法,并渲染同一页面:
/admin/xxx/checkStatus_1List.do?checkStatus=1
/admin/xxx/checkStatus_2List.do?checkStatus=2
/admin/xxx/checkStatus_4List.do?checkStatus=4
问题是:
HTML 的 <form>
标签只能有一个 action
,而页面是共用的,如果 action
写死,就会导致从不同入口进入页面时,搜索后 URL 丢失原来的入口信息。
解决思路
核心目标:
让 <form>
的 action
动态指向当前访问的 URL(包括参数),确保从哪个入口进来就提交到哪个入口。
方法一:在 Controller 中传递 formAction
在入口方法中,通过 request.getRequestURI()
和 request.getQueryString()
拼接当前完整的请求 URL,然后放到页面变量中。
@RequestMapping(value = "/adminzy/agricultural/checkStatus_1List")
public String checkStatus_1List(HttpServletRequest request, String checkStatus) {String currentUrl = request.getRequestURI(); // /adminzy/agricultural/checkStatus_1ListString queryString = request.getQueryString(); // checkStatus=1if (queryString != null) {currentUrl += "?" + queryString;}request.setAttribute("formAction", currentUrl);return list(request, checkStatus);
}
前端页面使用该变量:
<form id="search_form" action="${formAction}" method="post"><!-- 搜索条件 -->
</form>
优点:
- 明确可控,不依赖 JSP/HTTL 内置变量。
- 每个入口可灵活控制 URL。
缺点:
- 需要在每个入口方法都加重复逻辑。
方法二:直接在前端读取当前 URL
如果你的模板引擎(JSP/HTTL)支持直接访问 request
对象,可以直接在 HTML 中写:
<form id="search_form" action="${request.getRequestURI()}?${request.getQueryString()}" method="post">
解释:
${request.getRequestURI()}
→/adminzy/agricultural/checkStatus_1List.do
${request.getQueryString()}
→checkStatus=1
- 拼接后:
/adminzy/agricultural/checkStatus_1List.do?checkStatus=1
优点:
- 不用改 Controller。
- 简洁。
缺点:
- 需要模板支持 EL 表达式访问 request 对象。
- 在某些模板中可能需要额外配置。
方法三(推荐):在 list()
方法统一处理
既然所有入口方法都调用同一个 list()
,可以直接在 list()
里设置 formAction
,这样只改一次即可。
String currentUrl = request.getRequestURI();
String queryString = request.getQueryString();
if (queryString != null) {currentUrl += "?" + queryString;
}
request.setAttribute("formAction", currentUrl);
HTML 页面直接使用:
<form id="search_form" action="${formAction}" method="post"><!-- 搜索条件 -->
</form>
优点:
- 一次改动,全局生效。
- 无需重复写在每个入口方法里。
缺点:
- 灵活性稍差,如果个别入口需要特殊处理,仍需单独覆盖。
总结
- 如果只需要简单保持入口 URL,方法三最省事,改一次 Controller 即可。
- 如果入口逻辑差异较大,或部分入口的表单提交地址不同,可以用方法一精细控制。
- 如果完全不想改 Controller,可以用方法二直接读取当前请求 URL。