Spring框架<form:form>它是如何生成action属性的?

Spring framework <form:form> how does it generate the action attribute?

我在 JSP 页面上使用 <form:form> Spring 框架。 当我查看生成的页面时,我看到 <form action="[the path of my page]">.

action="[the path of my page]" 自动添加。

理论上我可以手动编辑每个 <form> 以添加 action="" 所需的属性(编辑: 在 gerrytan 的回答中使用 ${root} 之类的东西),但这不是一个实用的选择。


编辑: 我不能假设 / 是根路径,因为它会不断变化,因为它在代理后面。)


如何更改此自动 "behavior",以便在 [我的页面路径] 的开头连接一个路径?

以下是我见过的两种常用方法及其优缺点:

始终假定上下文路径为 /

你会放 <form:form action="/controller1/path1"。这种方法的好处是 URL 始终引用一致的位置,无论使用什么路径为页面提供服务。但是,这意味着您的应用已部署到 / 上下文路径中。如果你必须改变这个(例如:由于反向代理/负载平衡器)那么你必须做大量的查找/替换

始终使用隐式变量查找上下文路径

这是我的首选方法。首先像这样定义一个jsp变量:

<c:set var="root" value="${pageContext.request.contextPath}"/>

并且每当您必须引用内部路径时,请使用 ${root}

<form:form action="${root}/controller1/path1" ...

这种方法的缺点是必须在每个页面上声明变量 ${root}。但是,当您更改上下文根时,请放心,您所有的引用仍然是正确的

您也可以使用 <spring:url><c:url> 作为替代,甚至更好 use HandlerInterceptor to make the root attribute available automatically on all views

编辑 看来 ${pageContext.request.servletPath} 就是你要找的东西

我将手动更改所有表格 我将在每个 JSP 页之前调用的某种过滤方法中填充 ${fullPathUrl}。