Thymeleaf是一个XML / XHTML / HTML5模板引擎(可扩展到其他格式),可以在Web和非Web环境中工作。它更适合在Web应用程序的视图层提供XHTML / HTML5,它甚至可以在脱机环境中处理任何XML文件。它提供了一个可选模块,用于与Spring MVC集成,因此您可以在使用此技术的应用程序中将其用作JSP的完全替代,即使使用HTML5也是如此。
无法解析为每个:“${e : #fields.errors('userName')}”
我正在尝试使用休眠验证器验证我的表单。但是在运行我的表单时出现错误 无法解析为每个:“${e : fields.errors('userName')}”(模板:“home...
如何在 thymeleaf 中使用消息属性文件的自定义位置?
我使用 thymeleaf 和 spring,我的 messages.properties 文件需要与模板具有相同的名称才能正常工作。我尝试使用 webConfigurer.Java 创建自定义路径,但我...
我正在尝试在 html 表格中添加上标数字,该数字将显示在电子邮件中。 到目前为止我的代码如下: 我正在尝试在 html 表格中添加上标数字,该数字将显示在电子邮件中。 到目前为止我的代码如下: <th:block th:each="param, rowStat: ${someList}"> <th style="..." th:utext="#{some.translation(${param}, ${rowStat.count})}">superscript</th> </th:block> “someList”是一个简单的字符串列表,“some.translation”如下: {0} (moreInfo)<sup>{1}</sup> 我想要实现的目标是: 字符串1(更多信息)1 String2(更多信息)2 我的问题是 thymeleaf 异常,表示在此上下文中禁止访问变量“param”。访问“rowStat.count”工作正常。 如果有一种更简单的方法来显示上标数字,那对我来说也很好。 不允许使用 param,因为这是 Thymeleaf 的保留字,用于检索请求参数。尝试将其更改为其他内容: <th:block th:each="myParam, rowStat: ${someList}"> <th style="..." th:utext="#{some.translation(${myParam}, ${rowStat.count})}">superscript</th> </th:block> 另请参阅此处的 Thymeleaf 文档:请求参数。 param:用于检索请求参数。 ${param.foo} 是具有 String[] 请求参数值的 foo,因此 ${param.foo[0]} 通常用于获取第一个值。 您还可以使用 th:with 将 param 变量重新声明为另一个变量,如下面的代码片段所示: <tr th:with="idExecucaoParam=${param.idExecucao}" th:each="geracao: ${logExecucaoServicos}"> <td th:text="${idExecucaoParam}"/> </tr> 希望有帮助!
Thymeleaf 模板和 Spring Boot:从 Java 枚举创建无线电输入
我想从名为“source”的 Java 枚举类型自动填充 Thymeleaf 中的无线电输入控件。我在后端使用 Spring Boot。 我的控制器初始化枚举列表
与 Thymeleaf 集成的 Vuetify Vue 3 应用程序不渲染
我正在尝试将 Vuetify Vue 3 应用程序作为小部件插入 Thymeleaf 模板中。 Thymeleaf 模板加载成功,我可以在浏览器控制台中看到我的 Vue 应用程序正在初始化。然而,那...
有没有办法通过 Thymeleaf 内联注入 CSS 属性?
我正在使用 Spring 和 Thymeleaf 在后端构建电子邮件,我遇到了以下问题:我需要在使用内联 CSS 时注入颜色十六进制代码作为 CSS 属性。 我正在使用 Spring 和 Thymeleaf 在后端构建电子邮件,我遇到了以下问题:我需要在使用内联 CSS 时注入颜色十六进制代码作为 CSS 属性。 <span th:text="${newStateText}" style="display: inline-block; padding: 0.35em 0.65em; font-size: .75em; font-weight: 700; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: 1rem;" th:style="'background-color: '+${newStateBackgroundColor}+'; color: '+${newStateColor}+''" > </span> 如您所见,我尝试使用类似th:style(我认为)不存在的东西来注入newStateBackgroundColor和newStateColor上下文变量 我希望能够通过变量注入some样式属性,并保持我的样式内联。 th:风格确实存在。 我建议使用文字替换,如下所示: <span th:text="${newStateText}" th:style="|background-color: ${newStateBackgroundColor}; color: ${newStateColor}; display: inline-block; padding: 0.35em 0.65em; font-size: .75em; font-weight: 700; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: 1rem;|" />
我的应用程序有一个自定义身份验证机制。我有 /api/** 端点的令牌身份验证以及 /manager/** 和 /viewer/** 的登录表单。我有用于 api 的 @RestController 和 @Contoller web
Java Thymeleaf @ModelAttribute 控制器值为 null,即使 th:object 已指定
我在提交表单时无法解决 Spring + Thymeleaf 的问题。 我在加载页面时创建一个新的 dto,并通过 th:field 更新它。 然而,当我提交表格时,我
如何使用 span 标签将 Java 变量显示到 ThymeLeaf HTML 上?
我目前正在编写一个项目,其中使用 ThymeLeaf HTML 作为前端,使用 Java 作为后端。我正在尝试将我的 Java 控制器类之一中的变量显示到 m...
如何让Spring security允许访问无需登录即可进入主页?
我设置了spring mvs项目并添加了spring security,我希望每个人都无需登录即可看到主页。 这是我的安全配置: 包 uz.smartup.academy.bloggingplatform.config; 导入组织。
spring @joinColumn 对象未将 html 传递给控制器
我是编码菜鸟。 我基于编码的春季宠物诊所。 现在不传递对象 我是编码菜鸟。 我基于编码的春季宠物诊所。 现在不传递对象 <div th:replace="~{::caller-select('사이트', 'hstry_site', ${historySites})}"></div> <div th:replace="~{::caller-select('유형', 'hstry_type', ${historyTypes})}"></div> <div th:replace="~{::caller-input('문의 내용', 'hstry_content')}"></div> 'hstry_content' 好的。但 'hstry_site' 和 'hstry_type' 不通过。 chrome开发模式>网络>formdata>3值都OK。 我可以知道如何修复吗? 控制器打印对象如下。 [History@23d723c8 hstry_id = [null], hstry_call_time = [null], hstry_content = '12312312', hstry_site = [null], hstry_type = [null], tel_no = '01000000001'] 下面是历史课。 @Column(name = "hstry_content") private String hstry_content; @ManyToOne(cascade = {CascadeType.ALL}) @JoinColumn(name = "hstry_type_id", referencedColumnName = "id", insertable = false, updatable = false) private HistoryType hstry_type; @ManyToOne(cascade = {CascadeType.ALL}) @JoinColumn(name = "hstry_site_id", referencedColumnName = "id", insertable = false, updatable = false) private HistorySite hstry_site; 当更改列信息时 // @Column(name = "hstry_type_id") // private Integer hstry_type; // // @Column(name = "hstry_site_id") // private Integer hstry_site_id; 它传递给控制器。 您似乎在 Spring 应用程序中传递 hstry_site 和 hstry_type 对象时遇到问题,可能与 Thymeleaf 模板和表单提交有关。让我们分解一下步骤,以确保这些对象正确传递到您的控制器。 1. Thymeleaf 模板更改 确保您的 Thymeleaf 模板(caller-select 和 caller-input 片段)正确绑定到 hstry_site 和 hstry_type。 <!-- For hstry_site --> <div th:replace="~{::caller-select('사이트', 'hstry_site', ${historySites})}"></div> <!-- For hstry_type --> <div th:replace="~{::caller-select('유형', 'hstry_type', ${historyTypes})}"></div> <!-- For hstry_content --> <div th:replace="~{::caller-input('문의 내용', 'hstry_content')}"></div> 确保: historySites 和 historyTypes 已正确填充到您的控制器模型中。 下拉列表或选择输入正确绑定到 hstry_site 和 hstry_type。 2.控制器处理 在控制器方法中,确保正确接收和处理这些对象。 @PostMapping("/saveHistory") public String saveHistory(@ModelAttribute("history") History history) { // Check the values received in history object System.out.println(history); // Save logic or further processing return "redirect:/success"; // Redirect to success page or another endpoint } 3.实体映射 确保您的 History 实体正确映射到 HistorySite 和 HistoryType。 @Entity public class History { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long hstry_id; @Column(name = "hstry_content") private String hstry_content; @ManyToOne(cascade = {CascadeType.ALL}) @JoinColumn(name = "hstry_type_id", referencedColumnName = "id", insertable = false, updatable = false) private HistoryType hstry_type; @ManyToOne(cascade = {CascadeType.ALL}) @JoinColumn(name = "hstry_site_id", referencedColumnName = "id", insertable = false, updatable = false) private HistorySite hstry_site; // Getters and setters } 确保 HistoryType 和 HistorySite 实体也正确定义和映射。 4.级联和 ID 字段 如果您更改为直接使用 Integer 字段(hstry_type_id 和 hstry_site_id),请记住相应地更新您的实体和控制器。此更改可能会影响您处理表单提交和数据库操作的方式。 总结 仔细检查: 用于正确绑定和下拉/选择选项的 Thymeleaf 模板。 正确处理@ModelAttribute的控制器方法。 实体映射和更改(特别是切换到直接 ID 字段时)。 通过确保这些步骤,您应该能够正确地将 hstry_site 和 hstry_type 对象传递到控制器,并按预期将它们保留在数据库中。 解决这个问题。 public String processAddCallerForm(Caller caller, @Valid History 历史记录, BindingResult 结果, @PathVariable("tel_no") String tel_no) { } 此代码包含参数“BindingResult result”。所以我无法在temical中捕获错误消息,删除“BindingResult result”后,我可以看到这样的错误消息: 字段“hstry_site”上的对象“历史”中的字段错误:拒绝值[리드인];代码 [typeMismatch.history.hstry_site、typeMismatch.hstry_site、typeMismatch。 ...... petclinic有'PetTypeFormatter.java',在typeMismatch之前,我没有'HistoryTypesFormatter.java'和'HistorySitesFormatter.java'。 添加“HistoryTypesFormatter.java”和“HistorySitesFormatter.java”后。解决类型不匹配问题。 感谢回复,并帮忙解决。
添加 Thymeleaf th:field 属性时 JavaScript 无法工作
我正在尝试使用事件侦听器将美元符号添加到多个字段。但是,属性 th:field 将替换输入标记中的属性值和名称。 我知道该功能正在运行,因为...
Spring Boot + Security + Thymeleaf 和 CSRF 令牌不会自动注入
免责声明:我知道如何使用 thymeleaf 手动将令牌注入表单中: 免责声明:我知道如何使用 thymeleaf 手动将令牌注入表单中: <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" /> 这篇文章的目标是提高平台知识并更好地了解 Spring Boot 内部发生的事情 我还没有尝试过 Spring Boot,但最近我决定尝试一下,并且不得不承认它很棒,但是使用 Spring MVC 上的 Thymeleaf 和 Security,我不需要在表单上注入 CSRF 令牌(POST) ,因为 Thymeleaf 会自动处理它,但现在在 Spring Boot 中由于某种原因它不会。 从Spring Boot Reference中,我找到了application.properties文件中使用的常用属性列表,与thymeleaf和安全性相关的属性是: 百里香叶特性 spring.thymeleaf.check-template-location=true spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.excluded-view-names= # comma-separated list of view names that should be excluded from resolution spring.thymeleaf.view-names= # comma-separated list of view names that can be resolved spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML5 spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.content-type=text/html # ;charset=<encoding> is added spring.thymeleaf.cache=true # set to false for hot refresh 安全属性 security.user.name=user # login username security.user.password= # login password security.user.role=USER # role assigned to the user security.require-ssl=false # advanced settings ... security.enable-csrf=false security.basic.enabled=true security.basic.realm=Spring security.basic.path= # /** security.basic.authorize-mode= # ROLE, AUTHENTICATED, NONE security.filter-order=0 security.headers.xss=false security.headers.cache=false security.headers.frame=false security.headers.content-type=false security.headers.hsts=all # none / domain / all security.sessions=stateless # always / never / if_required / stateless security.ignored= # Comma-separated list of paths to exclude from the default secured paths 但是如果让 Thymeleaf 再次注入令牌的解决方案存在,我看不到它。 编辑:添加我的配置 该项目是使用上一个 STS 版本中附带的初始化程序创建的(在我看来这非常棒),并检查了 Web、Thymeleaf、Security、JPA、MySQL、H2、Mail、Facebook、Twitter、LinkedIn 和 Actuator 项目,然后添加了一些额外的内容 使用Java 7和Tomcat 7,因为我打算在不久的将来将项目部署在Openshift上,接下来是我的配置文件: pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.3.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <start-class>com.adrisasws.springmvc.WebApplication</start-class> <java.version>1.7</java.version> <tomcat.version>7.0.59</tomcat.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>1.1.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity3</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.social</groupId> <artifactId>spring-social-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-social-facebook</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-social-linkedin</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-social-twitter</artifactId> </dependency> <dependency> <groupId>org.springframework.social</groupId> <artifactId>spring-social-google</artifactId> <version>1.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <profiles> <profile> <id>openshift</id> <build> <finalName>webapp</finalName> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <outputDirectory>webapps</outputDirectory> <warName>ROOT</warName> </configuration> </plugin> </plugins> </build> </profile> </profiles> 安全配置(与我在非启动项目中使用的安全文件完全相同,其中 CSRF 令牌实际上会自动注入) @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfiguration extends WebSecurityConfigurerAdapter { ////////////////////////////////////////////////////////////////////////// // DEPENDENCIES // ////////////////////////////////////////////////////////////////////////// @Autowired private DataSource dataSource; @Autowired private UserRepository userRepository; ////////////////////////////////////////////////////////////////////////// // PROPERTIES // ////////////////////////////////////////////////////////////////////////// @Value("${custom.security.rememberme-secret}") private String secret; @Value("${custom.security.rememberme-create-tables}") private String createTables; private final static String[] adminRequests = new String[] { ... some matchers here... }; private final static String[] userRequests = new String[] { ... some matchers here... }; private final static String[] publicRequests = new String[] { ...some matchers here... }; ////////////////////////////////////////////////////////////////////////// // AUTHORIZATION // ////////////////////////////////////////////////////////////////////////// @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/css/**", "/images/**", "/js/**", "/error**"); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers(adminRequests).access("hasRole('"+Role.ADMIN.toString()+"')") .antMatchers(userRequests).access("hasRole('"+Role.USER.toString()+"')") .antMatchers(publicRequests).permitAll() .anyRequest().authenticated() .and() .requiresChannel() .anyRequest().requiresSecure() .and() .formLogin() .loginPage("/login") .defaultSuccessUrl("/", false) .permitAll() .and() .logout() .logoutUrl("/logout") .logoutSuccessUrl("/login?logout") .invalidateHttpSession(true) .deleteCookies("JSESSIONID") .permitAll() .and() .rememberMe() .rememberMeServices(rememberMeService()) .and() .apply(new SpringSocialConfigurer()); } ////////////////////////////////////////////////////////////////////////// // AUTHENTICATION // ////////////////////////////////////////////////////////////////////////// @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { auth .userDetailsService(userDetailsService()) .passwordEncoder(bCryptPasswordEncoder()); } @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(11); } @Bean public UserDetailsService userDetailsService() { return new UserRepositoryUserDetailsService(userRepository); } @Bean public SocialUserDetailsService socialUserDetailsService() { return new UserRepositorySocialUserDetailsService(userDetailsService()); } ////////////////////////////////////////////////////////////////////////// // REMEMBER ME // ////////////////////////////////////////////////////////////////////////// @Bean public JdbcTokenRepositoryImpl jdbcTokenRepository() { JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl(); jdbcTokenRepository.setDataSource(dataSource); jdbcTokenRepository.setCreateTableOnStartup(Boolean.valueOf(createTables)); return jdbcTokenRepository; } @Bean public RememberMeAuthenticationProvider rememberMeAuthenticationProvider() { return new RememberMeAuthenticationProvider(secret); } @Bean public PersistentTokenBasedRememberMeServices rememberMeService() { PersistentTokenBasedRememberMeServices service = new PersistentTokenBasedRememberMeServices(secret, userDetailsService(), jdbcTokenRepository()); service.setUseSecureCookie(true); service.setParameter("rememberme"); service.setTokenValiditySeconds(AbstractRememberMeServices.TWO_WEEKS_S); return service; } @Bean public RememberMeAuthenticationFilter authenticationFilter() throws Exception { return new RememberMeAuthenticationFilter(authenticationManager(), rememberMeService()); } } 在我的 Spring Boot 配置中与 thymeleaf 相关,并且用于开发目的 spring.thymeleaf.cache=false 百里香模板看起来像这样(我目前的登录页面,为了清晰起见,将仅包含相关内容) <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security/" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorator="thymeleaf/layouts/default"> <head> ... css and meta tags ... </head> <body> ... some html ... <th:block sec:authorize="isAnonymous()"> <!-- Bad Credentials --> <div th:if="${param.error}" class="alert alert-danger text-center"> Invalid username and/or password. </div> <!-- Logout --> <div th:if="${param.logout}" class="alert alert-success text-center"> You have been logged out. </div> <!-- Login Form --> <form id="f" th:action="@{/login}" method="post" role="form" autocomplete="off"> <!-- Username --> <input type="text" class="form-control text-center" id="username" name="username" th:placeholder="#{form.login.username}" /> <!-- Password --> <input type="password" class="form-control text-center" id="password" name="password" th:placeholder="#{form.login.password}" /> <!-- Remember me --> <input type="checkbox" id="rememberme" name="rememberme" /> <!-- Submit --> <button type="submit" class="btn btn-primary" th:utext="#{form.login.submit}">Login</button> <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" /> </form> ... more html and javascript ... </body> </html> Edit2 - 在按照Faraj Farook指出的方向进行一些调试后,我发现,在具有我发布的配置的项目中,在Spring Boot版本中,在此类org.thymeleaf.spring4.requestdata.RequestDataValueProcessor4Delegate中,以下函数返回空处理器 public Map<String, String> getExtraHiddenFields( final RequestContext requestContext, final HttpServletRequest request) { final RequestDataValueProcessor processor = requestContext.getRequestDataValueProcessor(); if (processor == null) { return null; } return processor.getExtraHiddenFields(request); } 而非 Spring boot 版本,它返回一个处理器,它是 org.springframework.security.web.servlet.support.csrf.CsrfRequestDataValueProcessor 的实例。 我也有类似的问题。经过一番调查后,我发现只有使用“th:action”属性(而不是普通的“action”)的表单才会注入 csrf 令牌。 对于登录表单,似乎您需要手动注入 csrf(link)。 在 Spring 官方文档(link)中,建议在提交登录表单之前检索 csrf 令牌,以防止会话超时。在这种情况下,表单上的隐藏输入中不会有 csrf 令牌。 使用 Spring Boot + Thymeleaf + Spring Security 可以解决这个问题: 应用程序属性 security.enable-csrf=true 更新 30/03/2017: 其中一件重要的事情是:在表单中使用 th:action,这将告诉 Spring Security 在表单中注入 CSRF,而不需要手动插入。 对于手动插入: html 模板 <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" /> 更新25/01/2017: pom.xml <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity4</artifactId> <version>2.1.2.RELEASE</version> </dependency> 据Thymeleaf开发人员称,Thymeleaf使用RequestDataValueProcessor接口来查找额外的隐藏字段,这些字段会自动添加到表单回发中。 org/thymeleaf/spring3/processor/attr/SpringActionAttrProcessor.java中的以下代码显示了这一点。 final Map<String,String> extraHiddenFields = RequestDataValueProcessorUtils.getExtraHiddenFields(arguments.getConfiguration(), arguments); 对问题进行排序,并自动添加CSRF Token;在您的应用程序中创建一个自定义请求数据值处理器并将其注册到 spring。为此,您可以阅读下面的教程。 Spring-MVC 中的 Csrf 防御 我还建议你在没有Spring Boot的情况下检查你之前的Spring MVC代码,以确认项目的配置XML是否有定制的RequestDataValueProcessor。 你必须做两件事。声明一个 bean @Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { ... other beans ... @Bean public RequestDataValueProcessor requestDataValueProcessor() { return new CsrfRequestDataValueProcessor(); } } 确保 themeleaf 模板中的 html 表单使用“th:action” <form th:action="@{/youractionurl}"> ... input tags </form> 这会自动插入 _csrf 令牌,如下所示 <input type="hidden" name="_csrf" value="4568ad84-b300-48c4-9532-a9dcb58366f3" />
使用@RequestMapping注解的控制器类不允许您在其中使用使用@PostMapping注解的方法
我有一个用 @RequestMapping("/students") 注释的控制器类 StudentController @RequestMapping(“/学生”) @控制器 公共类 StudentController {} 在这个c里面...
我有两个全局控制器建议类定义如下。 @ControllerAdvice 公共类 GlobalModelAttributes { @ModelAttribut(“mkey”) 公共字符串 mKey() { 返回“
我正在尝试使用 th:block 使表格更具体地分析我的数据.. 我正在尝试 某事 有些... 我正在尝试使用 th:block 使表格更具体地分析我的数据.. 我正在努力 <table> <thead> <tr> <th>something</tr> <th>something2</tr> <th>something3</tr> </tr> </thead> <tbody> <tr> <th:block th:if="${not #maps.isEmpty(result)}" th:each="firstEntry : ${result}"> <th:block th:if="${firstEntryStat.count == 0}"> <tr> </th:block> <td th:text="${firstEntry.value}"></td> <th:block th:if="${firstEntryStat.count == 0}"> </tr> </th:block> </th:block> </tbody> </table> 我尝试制作这种表格(在帖子末尾) 但它以错误结束,即 元素类型“th:block”必须由匹配的结束标记终止 “” 所以我尝试了另一种方法, <table> <thead> <tr> <th>something</tr> <th>something2</tr> <th>something3</tr> </tr> </thead> <tbody> <tr> <th:block th:if="${not #maps.isEmpty(result)}" th:each="firstEntry : ${result}"> <tr th:if="${firstEntryStat.count == 0}"> <td th:text="${firstEntry.value}"></td> </tr th:if="${firstEntryStat.count == 0}"> </th:block> </tbody> </table> 但是,它产生了如下错误 元素类型“tr”的结束标记必须以“>”分隔符结尾。 有没有办法制作如上图所示的数据表? 我的地图数据的结构如下 Maps< String , Maps< String, Maps< String, Long>>> result = new HashMap<>(); result = { "First": { "time": { "now": "", "past": "", "future": "" }, "sleifj": { "now": "", "past": "", "future": "" } }, "Second": { "time": { "now": "", "past": "", "future": "" }, "sleifj": { "now": "", "past": "", "future": "" } } } ====================================================== ================= 附加数据信息 我的地图数据看起来像 First - time - now : slejflesf - past : lsijefleisf - future : lsajiefeasf - sleifj - now : slejflesf - past : lsijefleisf - future : lsajiefeasf Second - time - now : slejflesf - past : lsijefleisf - future : lsajiefeasf - sleifj - now : slejflesf - past : lsijefleisf - future : lsajiefeasf ------------------------------------------------------ Map Name | Sub Name | Now | Past | Future | ------------------------------------------------------ First | time | asfas | lsefa | saeflkjle| ------------------------------------------ | sleifj | dsff | sfesf | sefasefa | ------------------------------------------------------ Second | time | asfas | lsefa | saeflkjle| ------------------------------------------ | sleifj | dsff | sfesf | sefasefa | ------------------------------------------------------ 在您的第一个示例中,当您尝试嵌套 2 个表格行时,您在 2 个 </tr> 标签之间缺少 </th:block>,这是不可取的。 第二个示例仍然存在相同的问题,但为此我认为您不能在结束标签上使用th:if。 查看您编写的 ASCII 模型,您可能想要做的就是将子图中非第一个项目的第一个 <td> 元素留空。 (参见下面的模拟代码) <table> <thead> <tr> <th>Map Name</th> <th>Sub Name</th> <th>Now</th> <th>Past</th> <th>Future</th> </tr> </thead> <tbody> <th:block th:each="mapNameItem : ${result}"> <tr th:each="subMapItem : ${mapNameItem}"> <td th:if="subMapItemStat.count == 0" th:text="mapNameItem.key" /> <td th:if="subMapItemStat.count != 0" /> <td th:text="subMapItem.key" /> <td th:text="subMapItem.get('now')" /> <td th:text="subMapItem.get('past')" /> <td th:text="subMapItem.get('feature')" /> </tr> </th:block> </tbody> </table> 您可能希望将 th:each 上最外面的 th:block 移动到 tbody,而不是根据您的格式需求。
我需要使用 Thymeleaf 模板为不同区域设置发送电子邮件。 我的 HTML 中有下一部分 我有下一个代码 上下文上下文 = 新 Co...
使用 PathVariable CSS 时未加载以及如何填写表单以在 thymeleaf 中更新
我正在尝试做同样的小服务,有时我会向我的 Rest Api 发送请求。 我遇到两个问题: 如何使用 thymeleaf 填充 html 表单中的字段? 我有这样的形式,我...
我正在为我正在设计的系统使用带有mysql数据库的spring MVC。 当我尝试从 spring 控制器将对象传递到 html 页面时,遇到了标题中引用的错误。 我什么...
无法将 String 类型的值转换为属性“person”所需的类型 PersonDTO
我有一个名为 Tabel 的类,其中有一个人。 Tabel 类和 Person 类具有一对多关系。 @实体 @数据 @Builder @AllArgsConstructor @NoArgs构造函数 @Table(名称 = "表&...