我在控制器中设置了以下代码:
model.set("type", type);
在百里香视图中,我想构建一个带有动作URL的表单:
/mycontroller/{type}
任何想法如何实现这一目标?我没有运气就阅读了百里香的文件。
答案 0 :(得分:91)
作为user482745 suggests in the comments(现已删除),我之前建议的字符串连接
<form th:action="@{/mycontroller/} + ${type}">
在某些网络环境中会失败。
Thymeleaf使用LinkExpression
来解析@{..}
表达式。在内部,它使用HttpServletResponse#encodeURL(String)
。它的javadoc陈述
对于健壮的会话跟踪,servlet发出的所有URL都应该是 贯穿这个方法。否则,URL重写不能用于 浏览器不支持cookie。
在通过URL完成会话跟踪的Web应用程序中,在附加@{..}
之前,该部分将附加到为${..}
发出的字符串。你不想要这个。
而是使用documentation
中建议的路径变量您还可以以路径变量的形式包含参数 与普通参数类似,但在内部指定占位符 您的网址路径:
<a th:href="@{/order/{id}/details(id=3,action='show_all')}">
所以你的例子看起来像是
<form th:action="@{/mycontroller/{path}(path=${type})}"> //adding ending curly brace
答案 1 :(得分:33)
如果您不想使用字符串连接(proposed by Sotirios),则可以在expression preprocessing中使用URL link:
<form th:action="@{/mycontroller/__${type}__}">
答案 2 :(得分:13)
您需要在@ {}内连接字符串。
<form th:action="@{'/mycontroller/' + ${type}}">
@ {}用于URL重写。 URL重写的一部分是跟踪会话。第一次用户请求URL,应用服务器添加到URL ;jsessionid=somehexvalue
并使用jsessionid生成cookie。当客户端在下一个请求期间发送cookie时,服如果服务器知道客户端支持cookie,则服务器不会在URL中保留addind jsessionid。
我首选的方法是使用管道语法(|)进行文字替换。
<form th:action="@{|/mycontroller/${type}|}">
Thymeleaf路径变量语法是
<form th:action="@{/mycontroller/{pathParam}(pathParam=${type}}">
答案 3 :(得分:2)
您需要的是:
<a th:href="@{/mycontroller/{type}(type=${type})}">
<强>文档强>
这里有很大的帮助: http://www.thymeleaf.org/doc/articles/standardurlsyntax.html。我用过的 从那里:
您还可以以路径变量的形式包含参数 与普通参数类似,但在内部指定占位符 您的网址路径:
<a th:href="@{/order/{id}/details(id=3,action='show_all')}">
... 更重要的是:URL表达式如:
<a th:href="@{/order/details(id=${order.id})}">
答案 4 :(得分:0)
Exception evaluating SpringEL expression: "businessId" (login:50)
我有同样的问题,并通过字符串连接解决,如下所示。
<强> LoginController.java 强>
@RequestMapping(value = "/login/{businessId}", method = RequestMethod.GET)
public ModelAndView get(HttpServletRequest request, @PathVariable String businessId) {
ModelAndView modelAndView = new ModelAndView("login");
modelAndView.addObject("businessId", businessId);
return modelAndView;
}
login.html
<form role="form" th:action="@{/login} + '/'+ ${businessId}" th:method="post">
<fieldset>
<div class="form-group">
<input class="form-control" placeholder="E-mail" name="userName"
type="email"></input>
</div>
<div class="form-group">
<input class="form-control" placeholder="Password"
name="password" type="password" value=""></input>
</div>
<div class="checkbox">
<label> <input name="remember" type="checkbox"
value="Remember Me"></input>Remember Me
</label>
</div>
<!-- Change this to a button or input when using this as a form -->
<button id="login" class="btn btn-lg btn-success btn-block" type="submit">Login</button>
</fieldset>
</form>