在上一篇文章中 ,我向您展示了如何使用Spring控制器处理纯HTML表单。 但是处理表单的更强大的方法是使用Spring的@ModelAttribute
及其spring:form
标签。 我将向您展示如何通过修改上一篇文章的项目设置从这里开始。 我们将简单地修改Comment表单和控制器以使用此功能。
在同一项目中,将src/webapp/comment.jsp
视图文件修改为:
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags/form" %>
<spring:form modelAttribute="comment">
<table>
<tr>
<td><spring:textarea path="text" rows="20" cols="80"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Post"/>
</td>
</tr>
</table>
</spring:form>
现在,该视图使用spring:form
标记而不是纯HTML来呈现注释表单。 我在这里仅向您显示了一个元素,但是spring:form
标记库还附带了所有匹配HTML表单元素,可帮助您快速绑定数据并呈现表单。 提交时,这将自动触发CommentController
。 我们将需要对其进行修改以捕获表单。
package springweb.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import springweb.data.Comment;
import springweb.data.CommentService;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@Controller
public class CommentController {
@Autowired
private CommentService commentService;
@RequestMapping(value="/comments")
public ModelAndView comments() {
List<Comment> comments = commentService.findComments();
ModelAndView result = new ModelAndView("/comments");
result.addObject("comments", comments);
return result;
}
@ModelAttribute("comment")
public Comment createFormModelAttribute() {
return Comment.create("");
}
@RequestMapping(value="/comment")
public String comment() {
return "comment";
}
@RequestMapping(value="/comment", method = RequestMethod.POST)
public ModelAndView postComment(HttpServletRequest req,
@ModelAttribute("comment") Comment comment) {
String fromUrl = req.getRequestURI();
String user = req.getRemoteUser();
String userIp = req.getRemoteAddr();
comment.setFromUserIp(userIp);
comment.setFromUser(user);
comment.setFromUrl(fromUrl);
commentService.insert(comment);
ModelAndView result = new ModelAndView("comment-posted");
result.addObject("comment", comment);
return result;
}
}
与旧控制器相比,该控制器的不同之处在于我们将@ModelAttribute
与一个form
对象一起使用(或Spring称为command
对象)。我们可以为其命名,在这里我将其称为comment
。 它只是一个Java POJO类,没什么特别的。 但是它用于捕获所有表单输入,然后传递给Controller,这称为数据绑定。 请注意,当您首先请求表单视图时,它将通过createFormModelAttribute()
方法进行实例化。 如果您用文本预先填充了pojo,它将自动以表格形式显示! 当用户提交时,控制器将使用postComment()
方法进行处理,并且再次使用新的表单输入来填充表单对象以进行处理。 这使您可以使用纯对象样式的表单,并且在许多方面,与纯HTML表单相比,它更短,更简洁。
Spring MVC表单处理有很多。 一种强大的功能是它可以帮助您组织form
对象验证并收集错误消息。 Spring还可以帮助您本地化错误消息文本等。您可以阅读有关其参考文档的更多信息。
翻译自: https://www.javacodegeeks.com/2013/11/exploring-spring-controller-with-spring-form-tag.html