Thymeleaf构造带变量的URL

时间:2013-02-18 14:14:25

标签: java jsp thymeleaf

我在控制器中设置了以下代码:

model.set("type", type);

在百里香视图中,我想构建一个带有动作URL的表单:

/mycontroller/{type}

任何想法如何实现这一目标?我没有运气就阅读了百里香的文件。

5 个答案:

答案 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}}">

参考: Thymeleaf Standard URL Syntax

答案 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>