我使用一个输入文本和一个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保存好了)。
我没有任何想法......我读过百里香参考文献,但无法找到答案,所以请帮助好人!
答案 0 :(得分:2)
您必须使用选定的对象表达式*{content}
并将textarea标记放在表单标记内!
最后全部关于结果表单中生成的name
属性。该名称需要与所选根对象propertyAccessor
中的th:object
对应。
表格由弹簧处理(没有任何百里香截取)。
关于春季整合的文档非常好:http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html
他们说:
th:field属性的值必须是选择表达式(* {...}),这是有意义的,因为它们将在表单支持bean上进行评估,而不是在上下文变量(或模型属性)中进行评估Spring MVC术语。
修改强>: 由于项目的链接,修复很容易:
答案 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>