当前位置: 首页 > 知识库问答 >
问题:

在thymeleaf中创建动态URL查询字符串

南宫俊喆
2023-03-14

我是thymeleaf新手,我想使用thymeleaf url创建动态查询字符串。对于分页,我在所有页面中使用公共片段和include片段。在所有页面中都有搜索选项,还需要分页进行搜索。所以,我们需要在搜索条件的分页中传递动态查询字符串。但是当我创建动态查询字符串时,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}'

更新胸腺叶配置

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;
}}

共有1个答案

洪祺
2023-03-14

这个问题有简单的解决方案,我试图从thymeleafhref属性创建URL如下:

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

但是不需要将参数传递给thymeleafth:href属性。只需使用th:href属性附加查询字符串,如下所示:

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

在这里,我们创建URL,并将动态查询字符串附加到URL。

 类似资料:
  • 我想要这样的url baseURL/dealer/index.php?r=rest/packinfo 我开始犯错了 URL查询字符串“r=rest/{method}”不能有replace block。对于动态查询参数,请使用@query。

  • 我正在工作的一个项目,允许人们列出手机出售,并能够查看所有的手机出售。我的工作正常。jsp返回一个包含所有电话及其所有详细信息的列表。如品牌、型号、网络、存储、颜色、屏幕大小等。 问题是,它需要设置,以便您只看到“品牌”和“型号”(例如“i Phone”“6”),然后能够点击“更多信息”查看其余的细节。这个'more info'按钮应该会打开一个包含手机全部细节的新jsp。 抱歉,如果我没有提供足

  • 问题内容: Spring数据中是否有一种方法可以动态形成where子句? 我想做的是有一个方法(类似于findBy / get方法),该方法运行WHERE和AND并使用所提及的NOT NULL属性。 例如, 我们的方法看起来像这样 谢谢。 问题答案: 看看Spring数据存储库都支持的JPA规范和谓词,甚至更好的QueryDSL。本文提供了一个示例:http : //spring.io/blog/

  • 我不熟悉Thymeleaf,我对使用表单动态创建URL有一个问题。 我有一个简单的spring boot应用程序,它将对象存储在数据库中,我可以使用简单的URL查询数据库。例如,url/distance/0.3将返回距离属性小于或等于0.3的对象。当我在浏览器中编辑这些URL时,它们可以完美地工作。 我希望用户能够自己设置这些搜索值。我试图创建一个简单的表单,用用户输入创建上面的url,但出现以下

  • 问题内容: 这是一个非常基本的问题。但是我无法在Java文档中找到答案,也无法对其进行测试,因为我不知道这种方法是否存在。 我可能会收到一个URL字符串,可能是 要么 然后我会得到可能以开头的资源路径,或者就像 我正在看课,可以处理第一部分,即获取hostURL使其成为HTTPS或HTTP请求。问题是附加资源路径。我必须手动检查它的第一个字母是否存在。我想知道此功能是否已经在某个类中。 问题答案:

  • 我有以下接口 我正在使用以下依赖项 我使用的Base_Url如下所示: 原始url或api调用应该如下所示: 我尝试将@path更改为@query,但仍然得到相同的错误消息 下图是来自邮差的一个测试,看起来很管用: 我只是从postman复制url并在代码中进行必要的更改,我得到的错误代码仍然是相同的