Thymeleaf: Nối - Không thể phân tích cú pháp dưới dạng biểu thức


83

Tôi đang gặp sự cố khi cố gắng nối nhiều giá trị trong mẫu của mình. Theo Thymeleaf ở đây tôi chỉ đơn giản là có thể + chúng cùng nhau ...

4.6 CÁC CHỈ TIÊU KẾT NỐI

Các văn bản, bất kể chúng là chữ hay là kết quả của việc đánh giá các biểu thức biến hoặc thông báo, đều có thể được nối dễ dàng bằng cách sử dụng toán tử +:

th:text="'The name of the user is ' + ${user.name}"

Đây là một ví dụ về những gì tôi thấy hoạt động:

<p th:text="${bean.field} + '!'">Static content</p>

Tuy nhiên, điều này không:

<p th:text="${bean.field} + '!' + ${bean.field}">Static content</p>

Về mặt logic, điều này sẽ hoạt động nhưng không phải, tôi đang làm gì sai?


Maven:

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring3</artifactId>
    <version>2.0.16</version>
    <scope>compile</scope>
</dependency>

Đây là cách tôi thiết lập TemplateEngine và TemplateResolver của mình:

<!-- Spring config -->
<bean id="templateResolver" class="org.thymeleaf.templateresolver.ClassLoaderTemplateResolver">
    <property name="suffix" value=".html"/>
    <property name="templateMode" value="HTML5"/>
    <property name="characterEncoding" value="UTF-8"/>
    <property name="order" value="1"/>
</bean>
<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
    <property name="templateResolver" ref="fileTemplateResolver"/>
    <property name="templateResolvers">
        <list>
            <ref bean="templateResolver"/>
        </list>
    </property>

ThymeleafTemplatingService:

@Autowired private TemplateEngine templateEngine;
.....
String responseText = this.templateEngine.process(templateBean.getTemplateName(), templateBean.getContext());

AbstractTemplate.java:

public abstract class AbstractTemplate {
  private final String templateName;
  public AbstractTemplate(String templateName){
    this.templateName=templateName;
  }
  public String getTemplateName() {
    return templateName;
  }
  protected abstract HashMap<String, ?> getVariables();
  public Context getContext(){
    Context context = new Context();
    for(Entry<String, ?> entry : getVariables().entrySet()){
      context.setVariable(entry.getKey(), entry.getValue());
    }
    return context;
  }
}

tôi có cùng một lỗi xảy ra !!!!!!!!!! nhưng tôi sử dụng thymeleaf và scala

Cách duy nhất tôi quản lý để làm cho nó hoạt động là sử dụng tiền xử lý. <p th:text="${'__${bean.property1}__' + '::' + '__${bean.property2}__'}">default text</p>
NeilA

Ví dụ này phù hợp với tôi. Bạn đang sử dụng phiên bản thymeleaf nào? Bạn có sử dụng thêm bất kỳ phương ngữ nào không?
hubbardr

Câu trả lời:


199

Nhưng từ những gì tôi thấy bạn có một lỗi khá đơn giản về cú pháp

<p th:text="${bean.field} + '!' + ${bean.field}">Static content</p>

cú pháp đúng sẽ trông như thế nào

<p th:text="${bean.field + '!' + bean.field}">Static content</p>

Trên thực tế, cú pháp th:text="'static part' + ${bean.field}"bằngth:text="${'static part' + bean.field}" .

Hãy thử nó ra. Mặc dù bây giờ điều này có lẽ là vô dụng sau 6 tháng.


Cảm ơn, hữu ích cho tôi.
asifaftab87

23
Vô dụng sau 6 tháng ?, Nó vẫn còn hữu ích 6 năm sau
AguThadeus

32

Bạn có thể kết hợp nhiều loại biểu thức bằng cách sắp xếp biểu thức đơn giản / phức tạp giữa các ||ký tự:

<p th:text="|${bean.field} ! ${bean.field}|">Static content</p>

Tôi đang sử dụng phiên bản Thymeleaf: 2.1.1.RELEASE (nó phải là phiên bản cuối cùng)
Fernando Aspiazu

Hoạt động tốt trên phiên bản2.1.5
Thiago Pereira

1
Điều gì sẽ xảy ra nếu văn bản chứa |? Ví dụ. "|${fullName} Stories \| Twiza|"Tôi nhận được Không thể phân tích cú pháp dưới dạng biểu thức.
Piyush

làm thế nào để làm điều đó ở đây nó không làm việc, bạn có thể chuyển đổi nó cho bạn cú pháp ... th:class="'hotel listing col organic urgencyMsg available organic h-' + ${record.hotelInfo.hotelId} + '-organic'"> am sử dụng3.0.2
Shareef

1
Để sử dụng thanh dọc (|) trong văn bản:<p>[[${fullName}]] Stories | Twiza </p>
Ranjan

3

Lưu ý rằng với | char, bạn có thể nhận được cảnh báo với IDE của mình, ví dụ, tôi nhận được cảnh báo với phiên bản mới nhất của IntelliJ, Vì vậy, giải pháp tốt nhất là sử dụng cú pháp này:

th:text="${'static_content - ' + you_variable}"

1

Chúng ta có thể kết hợp như thế này:


<h5 th:text ="${currentItem.first_name}+ ' ' + ${currentItem.last_name}"></h5>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.