春天Thymeleaf + Textarea

时间:2016-05-11 14:05:37

标签: html spring textarea thymeleaf

我使用一个输入文本和一个textarea创建了表单。输入文本工作正常,但textarea甚至不显示:

<div id="news" th:fragment="admin_panel">
    <form method="POST" th:action="@{/addNews}" th:object="${news}" id="myform">
        Tytuł:
        <input type="text" th:field="*{title}"/>
        <input type="submit" value="Wstaw"/>
    </form>
    <textarea name="news_content" rows="20" cols="80" th:field="${news.content}" form="myform">
        ...
    </textarea>
</div>

当我删除th:field时显示textarea,当我使用th:value代替th:field时,它也会显示,但不会保存写入文本到news.content(news.title保存好了)。

我没有任何想法......我读过百里香参考文献,但无法找到答案,所以请帮助好人!

4 个答案:

答案 0 :(得分:2)

您必须使用选定的对象表达式*{content}并将textarea标记放在表单标记内!

最后全部关于结果表单中生成的name属性。该名称需要与所选根对象propertyAccessor中的th:object对应。 表格由弹簧处理(没有任何百里香截取)。

关于春季整合的文档非常好:http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html

他们说:

th:field属性的值必须是选择表达式(* {...}),这是有意义的,因为它们将在表单支持bean上进行评估,而不是在上下文变量(或模型属性)中进行评估Spring MVC术语。

修改: 由于项目的链接,修复很容易:

  • Thymeleaf 3.0.0.BETA03在textarea处理器中有一个错误,转移到3.0.0.RELEASE解决了这个问题
  • 此外,我已将textarea移动到表单元素中。

答案 1 :(得分:1)

关于例外:

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/eniupage] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.spring4.processor.SpringTextareaFieldTagProcessor' (template: "templates/fragments" - line 144, col 60)] with root cause
java.lang.StringIndexOutOfBoundsException: String index out of range: 0

在我的表单中,您可以看到文本输入和文本区域。 news.title保存好了,但是news.content不行。当我替换测试这个参数时(在文本输入中我使用news.content而在textarea中有th:field = $ {news.title})它也很好用。也许我应该使用其他表达式而不是th:field?

News.java

package eniupage.domain;

public class News 
{
    private String title;
    private String content;
    private Date date;

    public String getTitle()
    {
        return title;
    }
    public void setTitle(String title)
    {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) 
    {
        this.content = content;
    }
    public Date getDate()
    {
        return date;
    }
    public void setDate(Date date)
    {
        this.date = date;
    }

}

HomeController.java

包eniupage.web;

@Controller
@RequestMapping( "/" )
public class HomeController  
{

    @Autowired
    AddNewsService addNewsService;

    @RequestMapping( method = GET )
    public String home( Model model )
    {
        model.addAttribute( "newses", addNewsService.getNewses() );
        return "home";
    }

    @RequestMapping( value = "/addNews", method = POST )   
    public String addNews( News news )
    {
        addNewsService.addNews( news );
        return "redirect:/";
    }

}

AdminController.java

@Controller
@RequestMapping( "/admin" )
public class AdminController  
{    
    @RequestMapping( method = GET )
    public String admin( Model model )
    {
        model.addAttribute( new News() );
        return "admin";
    }

}

没有任何HTML格式的结果,因为它甚至不会显示在div中。只有文本输入和提交按钮。

编辑html:

<form action="#" method = "POST" th:action="@{/addNews}" th:object = "${news}" id = "myform">

            Tytuł: <input type = "text" th:field = "*{title}" />

            <input type = "submit" value = "Add" /></br>

            <textarea  rows = "20" cols = "80" th:field = "*{content}" form = "myform" >... </textarea>


        </form>

我使用的是thymeleaf 3.0。也许这是理由?

在参考文献中我读到:

&#34; th:field属性的行为会有所不同,具体取决于它是附加到a还是标记(还取决于标记的特定类型)。&#34;

但是我无法找到在输入和textarea中使用th:field之间的区别。

答案 2 :(得分:0)

您不需要表单文本字段。通过表单ID将文本区域与表单链接就足够了。

<textarea rows="8" cols="120" name="lines" form="usrform" th:text="${message}"></textarea>
<form method="POST" enctype="multipart/form-data" th:action="@{/}" id="usrform">
    <button type="submit" name="action" value="submitlines">Submit</button>
</form>

和控制器:

@RequestMapping(value="/", method=RequestMethod.POST, params="action=submitlines")
public String handleForm(
        @RequestParam("lines") String input,
        RedirectAttributes redirectAttributes) {
}

答案 3 :(得分:0)

当我通过它保存一些数据时,我的textarea输入工作正常(当我执行保存到DB时处于干净状态),但是在编辑表单的情况下(我的textarea输入应该显示预填充的描述)模型属性book.description)为空,其原因是th:value属性,我将其更改为th:field属性,并按预期开始工作。

<textarea class="form-control" id="description" rows="5"
                              name="description"
                              placeholder="Description" th:field="${book.description}"
                              required="required"></textarea>