java - Thymeleaf:在 thymeleaf 中创建动态 URL 查询字符串

标签 java spring-mvc urlencode thymeleaf

我是 thymeleaf 的新手,我想使用 thymeleaf url 创建动态查询字符串。对于分页,我使用公共(public)片段并在所有页面中包含片段。所有页面都有搜索选项,搜索也需要分页。因此,我们需要在分页中传递动态查询字符串以用于搜索条件。但是当我动态创建查询字符串时,URL 对特殊字符进行编码,如 =&。以下是我的代码

<!-- Pagination Bar -->
<div th:fragment='paginationbar(searchArguments)'>
  <div class='pagination pagination-centered'>
    <ul>
      <li th:class="${page.firstPage}? 'disabled' : ''">
        <span th:if='${page.firstPage}'> First</span>
        <a th:if='${not page.firstPage}' th:href='@{${page.url}(page=0,size=${page.size},${searchArguments})}'>First</a>
      </li>
      <li th:class="${page.hasPreviousPage}? '' : 'disabled'">
        <span th:if='${not page.hasPreviousPage}'>&lt;&lt;</span>
        <a th:if='${page.hasPreviousPage}' th:href='@{${page.url}(page=${page.currentNumber - 2},size=${page.size},${searchArguments})}' title='Go to previous page'>&lt;&lt;</a>
      </li>
       <li th:each='item : ${page.items}' th:class="${item.current}? 'active' : ''">
        <span th:if='${item.current}' th:text='${item.number}'>1</span>
        <a th:if='${not item.current}' th:href='@{${page.url}(page=${item.number - 1},size=${page.size},${searchArguments})}'><span th:text='${item.number}'>1</span></a>
      </li> 
      <li th:class="${page.hasNextPage}? '' : 'disabled'">
        <span th:if='${not page.hasNextPage}'>&gt;&gt;</span>
        <a th:if='${page.hasNextPage}' th:href='@{${page.url}(page=${page.currentNumber},size=${page.size},${searchArguments})}' title='Go to next page'>&gt;&gt;</a>
      </li>
      <li th:class="${page.lastPage}? 'disabled' : ''">
        <span th:if='${page.lastPage}'>Last </span>
        <a th:if='${not page.lastPage}' th:href='@{${page.url}(page=${page.totalPages - 1},size=${page.size},${searchArguments})}'>Last</a>
      </li>
    </ul>
  </div>
</div>

在页面中包含片段:

<div th:include="admin/fragments/pagination-fragment :: paginationbar('title='+${title}+'&amp;status='+${status})" th:if="${title != null}"></div>

查看页面源代码时,创建如下URL:

<a href="/sample/admin/search-category?page=1&amp;size=5&amp;title%3Dtil%26status%3D"><span>2</span></a>

在上面的 URL 中,浏览器将 title='+${title}+'&status='+${status} 转换为 title%3Dtil%26status%3D。我们如何为分页链接设置实际的查询字符串?

更新 Thymeleaf 配置

public class MultiViewResolverConfig{

@Autowired
private Environment env;

/** 
 * This method is used to create tiles view resolver which have 
 * view resolver first priority for resolve response view
 * */
@Bean
public TilesViewResolver tilesViewResolver() {
    TilesViewResolver resolver = new TilesViewResolver();
    resolver.clearCache();
    resolver.setCache(Boolean.parseBoolean(env.getProperty("tiles.cache")));
    resolver.setCacheLimit(Integer.parseInt(env.getProperty("tiles.cache.limit")));
    return resolver;
}

/** 
 * This method is used to configure tiles for application and 
 * specify which definitions files are used. 
 * This method create a bean and register. 
 * */
@Bean
public TilesConfigurer tilesConfigure(){
    TilesConfigurer configurer = new TilesConfigurer();
    configurer.setDefinitions(new String[]{"classpath:tiles-definitions/user-definitions.xml", 
            "classpath:tiles-definitions/public-definitions.xml", "classpath:tiles-definitions/admin-definitions.xml"});
    //configurer.setValidateDefinitions(true);
    //configurer.setCheckRefresh(true);
    return configurer;
}

/* Thymeleaf configuration */
private ServletContextTemplateResolver templateResolver() {
    ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();

    templateResolver.setPrefix("/WEB-INF/views/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode("HTML5");
    templateResolver.setCacheable(Boolean.parseBoolean(env.getProperty("thm.cache")));
    templateResolver.setCacheTTLMs(Long.parseLong(env.getProperty("thm.cache.limit")));
    return templateResolver;
}

private SpringTemplateEngine templateEngine() {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.addDialect(new LayoutDialect());
    templateEngine.setTemplateResolver(templateResolver());
    return templateEngine;
}

private ThymeleafViewResolver thymeleafViewResolver() {
    ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();

    thymeleafViewResolver.setCharacterEncoding("UTF-8");
    thymeleafViewResolver.setViewClass(ThymeleafView.class);
    thymeleafViewResolver.setViewNames(new String[]{"admin/**"});
    thymeleafViewResolver.setTemplateEngine(templateEngine());
    return thymeleafViewResolver;
}


/* JSP view resolver */

private InternalResourceViewResolver jspViewResolver() {
    InternalResourceViewResolver resolver  = new InternalResourceViewResolver();

    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    resolver.setViewClass(JstlView.class);
    resolver.setCache(Boolean.parseBoolean(env.getProperty("url.cache")));
    resolver.setCacheLimit(Integer.parseInt(env.getProperty("url.cache.limit")));
    return resolver;
}

@Bean
public ViewResolver setupViewResolver(ContentNegotiationManager manager) {
    List<ViewResolver> resolvers = new ArrayList<ViewResolver>();

    resolvers.add(tilesViewResolver());
    resolvers.add(thymeleafViewResolver());
    resolvers.add(jspViewResolver());

    ContentNegotiatingViewResolver viewResolver = new ContentNegotiatingViewResolver();
    viewResolver.setViewResolvers(resolvers);
    viewResolver.setContentNegotiationManager(manager);
    return viewResolver;
}}

最佳答案

这个问题有简单的解决方案,我正在尝试从 thymeleaf href 属性创建 URL,如下所示:

th:href='@{${page.url}(page=0,size=${page.size},${searchArguments})}'

但不需要将参数传递给 thymeleaf th:href 属性。只需将查询字符串附加到您的 th:href 属性,如下所示:

th:href='@{${page.url}(page=0,size=${page.size})}+${searchArguments}' 

在此,thymeleaf 创建 URL,我们将动态查询字符串附加到 URL。

关于java - Thymeleaf:在 thymeleaf 中创建动态 URL 查询字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28587097/

相关文章:

angular - 在 URLEncoded Http Post 请求中保留 +(加号)

java - 在 java 中发布 XML 请求

java - 如何构造像 "concat()"这样的方法

Spring mvc - 配置 XML 和 JSON 响应的错误处理

javascript - 我怎样才能让 Spring @RestController 接受 JSON 格式的参数而不是 www-form-urlencoded?

hibernate - 使用 Spring Data JPA 删除 SpringBoot 2.0.5.RELEASE 应用程序中的对象

php - 在 URL 中发送阿拉伯字符

java - 对密码进行安全 URL 编码

java - 找出不同数字的最大值

java - oracle中使用hibernate自动增量列