在项目开发中,有时会出现这样的场景:
同一个页面由多个不同入口方法进入(例如不同的审核状态列表),但页面上有一个搜索表单(<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。