• Spring表单标签


    虽然我们可以使用HTML原生的form表单标签来轻松的写出一个表单,其实我一直都是这样做的,但是使用Spring表单标签可以更方便我们完成例如:验证失败后表单数据的回填功能(虽然你可以使用EL+JSTL来实现),但是使用spring表单标签更为方便。

    如同使用JSTL一样,我们需要先在JSP页面中使用taglib指令导入:

    <%@taglib prefix="form" uri="http://www.springframeork.org/tags/form" %>

    表单标签库中的标签:

    标签 描述
    form 渲染表单元素
    input 渲染<input type="text">元素
    password 渲染<input type="password">元素
    hidden 渲染<input type="hidden">元素
    textarea 渲染textarea
    checkbox 渲染一个<input type="checkbox">
    checkboxes 渲染多个<input type="checkbox">
    radiobutton 渲染一个<input type="radio">
    radiobuttons 渲染多个<input type="radio">
    select 渲染一个select元素
    option 渲染一个可选元素
    errors 在span元素中渲染字段错误

    表单标签

    表单标签用于渲染HTML表单,要使用渲染一个表单输入字段的任何其他标签,必须有一个form标签。

    commandName属性或许是其中最为重要的属性,因为它定义了模型属性的名称,该值要求与返回该表单视图的请求处理方法中模型名一致。commandName==模型名,建议这个属性为必填属性

    <form:form commandName="book" action="save-book" method="post">
    ...
    </form>

    这个commandName为book,是与请求“save-book”对应的请求方法中模型数据名一样的,也就是说需要在请求方法中将数据模型添加到Model对象中,model.addAttribute("book",new Book()),如果不这样做,页面就会抛出异常。

    表单标签的属性:

    属性 描述
    acceptCharset 定义服务器接受的字符编码列表
    commandName 暴露表单对象的模型数据名,默认名为command
    cssClass 定义要应用到被渲染form元素的CSS类
    cssStyle 定义要应用到被渲染form元素的CSS样式
    htmlEscape 接受true/false,表示被渲染的值是否进行HTML转义
    modelAttribute 暴露表单对象的模型数据名,默认名为command

    一般来说,仍是需要action和method属性,因为这两个属性是HTML属性,还是必须的。

    input标签

    input标签渲染<input type="text">元素,这个标签最重要的是path,它将这个输入字段绑定到表单对象的一个属性,类似HTML表单的name值。

    input标签的属性:

    属性 描述
    cssClass 定义要应用到被渲染input元素的CSS类
    cssStyle 定义要应用到被渲染input元素的CSS样式
    cssErrorClass 定义要应用到被渲染input元素的CSS类,如果bound属性中包含错误,则会覆盖cssClass属性值
    htmlEscape 接受true/false ,表示是否应该对渲染的值进行HTML转义
    path 要绑定的属性名,作用与HTML中的name值一致

    input标签也支持绑定到嵌套对象的属性(支持属性的属性,这种级联的属性名),如:

    <form:input path="category.id"/>

    password标签

    password标签渲染<input type="password"/>元素,password标签与input标签类似,只不过有一个showPassword属性:

    属性 描述
    cssClass 定义要应用到被渲染input元素的CSS类
    cssStyle 定义要应用到被渲染input元素的CSS样式
    cssErrorClass 定义要应用到被渲染input元素的CSS类,如果bound属性中包含错误,则会覆盖cssClass属性值
    htmlEscape 接受true/false ,表示是否应该对渲染的值进行HTML转义
    path 要绑定的属性名,作用与HTML中的name值一致

    showPassword 表示是否应该显示密码,默认为false

    hidden标签

    hidden标签渲染<input type="hidden"/>元素,hidden标签,hidden标签与input标签相似,只不过它没有可视的外观,以此不支持cssClass和cssStyle属性

    属性 描述
    htmlEscape 接受true/false ,表示是否应该对渲染的值进行HTML转义
    path 要绑定的属性名,作用与HTML中的name值一致

    textarea 标签

    textarea标签渲染一个HTML的textarea元素,Textarea实际就是一个支持多行输入的一个input元素

    属性值同input类似,我们还可以通过rows(行),cols(列)设置textarea的大小:

    <form:textarea path="note" rows="5" cols="80"/>

    checkbox标签 checkboxs标签 radioButton标签 radioButtons标签

    这些标签的属性都与input类似,path属性较为重要,但是后面带s的复数形式是有些区别的:

    带s多个标签的特有的属性:

    属性 标签
    items 用于生成Collection,Map或者Array数据
    itemLabel item属性中定义的Collection,Map或者Array中对象属性,为每个输入项提供标签名
    iteamsValue item属性中定义的Collection,Map或者Array中对象属性,为每个输入项提供值
    delimiter 定义两个input元素之间的分隔符,默认没有分隔符
    element 给每个被渲染的input元素都定义一个HTML元素,默认为“span”

    例如:


    <
    form:checkbox path="outOfStock" value="Out of Stock"> <form:checkboxs path="category" items="${categoryList}"> Computing Now <form:radiobutton path="newsletter" value="Computing Now"/> Modern Health<form:radiobutton path="mewsletter" value="Modern Health"> <form:radiobuttons path="category" items="${categoryList}"/>

    select和option标签,options标签

    select标签渲染一个HTML的select元素。被渲染元素的选项可能来自赋予其items属性的一个Collection,Map,Array,或者来自一个嵌套的option或者options标签。

    属性值同上checkboxbutton/radiobutton一样。items对于select或后面加s的标签特别有用,因为它可以绑定带对象的Collection,Map,Array,为select元素生成选项(option)

    <form:select id="category" path="category.id" items="${categories}" itemLabel="name" itemValue="id">

    id和name都是categories集合中category对象的属性

    <form:select id="category" path="category.id" items="${categories}" itemLabel="name" itemValue="id">
          <option value="0">--Please select--</option>
    </form:select>

    这个代码片段是渲染一个select元素,其选项来自model属性catagories,以及option标签。

    同其他后缀为s的标签一样,options标签用于生成多个option元素列表

    errors标签

    errors标签用于渲染一个或多个span元素,每个span元素中都包括一个字段错误信息。这个标签用于显示一个特定的字段错误,或者所有的字段错误

    下面这个erros标签将显示所有错误(所有绑定在BindingResult中的错误)

    <form:errors path="*"/>

    下面这个errors标签显示了一个与表单支持对象的author属性相关的字段错误

    <form:errors path="author"/>

    使用spring表单标签的注意项

    • 我们在写修改表单的时候还是需要来一个隐藏域保存id,这样修改的时候不至于id丢失,这个隐藏域还是需要的。
    • 我们设置了<form:form>的commandName属性后,如果没有属性值需要设置,那么需要在Controller得model中放入一个对应的空对象,要不然就会报异常:

        @RequestMapping("/input-book")
        public String inputBook(Model model) {
            List<Category> categories=bookService.getAllCategories();
            model.addAttribute("categories", categories);
            model.addAttribute("book", new Book());
            return "bookAddForm";
        }

    注意: model.addAttribute("book", new Book());  虽然放入的一个new出来的空对象,但是因为spring表单需要寻在commandName属性值,为了不让其找不到而报异常所以需要如此。

    • 之前说个可以使用JSTL的<c:url>标签来保证url地址的正确,但是遗憾的是表单的action属性不能取<c:url/>.因此,需要创建一个变量并从action属性中引用它,如下所示:
    <c:url var="url" value="/emp"></c:url>
    <form:form commandName="employee" action="${url }" method="POST">

    一个需求

    我们不允许用户修改某些字段,但是这样从修改表单传过来的表单数据就会没有这几项,如果就这样去修改数据库,这几项的数据就会被置空,这明显不是我们想要的,我们想让这样不能修改的值保持原样,应该怎么做呢?

    一个办法就是使用隐藏域,将这些不能修改的值以隐藏域方式,这些值虽然存在,但是直接从网页上是看不到的,然而聪明的用户可以从浏览器的开发者工具中找到这些隐藏项,如果这些选项敏感而又需要安全,这种做法就不太好

    还有一种办法就是使用springMVC的@ModelAttribute注解修饰一个会请求的方法,在这个方法中通过id获得该对象,并将这个对象放在Model中,因为@ModelAttribute修饰的方法在每个请求方法前会被调用,所以在我们的修改update方法的形参再使用@ModelAttribute来获得这个实例,springMVC在获得表单输入的数据进行封装时,会将你修改的字段封装,所以也不用担心修改的字段值丢失:

        @ModelAttribute
        public void getThisBook(@RequestParam(value="id",required=false) Integer id,Model model) {
            if(id==null) {
                return;
            }
            model.addAttribute(bookService.get(id));
        }
        @RequestMapping("/update-book")
        public String updateBook(@ModelAttribute Book book) {
            System.out.println(book.getCategory().getId());
            System.out.println(bookService.getCategory(book.getCategory().getId()));
            Category category=bookService.getCategory(book.getCategory().getId());
            book.setCategory(category);
            bookService.update(book);
            return "redirect:/list-book";
        }

    注意:因为id这个字段很重要,但是并不是每次从表单中传来的数据都有id,例如添加的时候就没有id,所以一定要设置为required=false ,要不让就会报错。而且建议使用返回为void的@ModelAttribute修饰的非请求方法,并在其中判断id是否为null

  • 相关阅读:
    在from表单中提交同name数据时,怎么获取所有值
    面试题
    String的创建模式
    spring的事务支持
    微信小程序+java实现附件上传以及下载打开详细过程记录
    spring编写AOP代理上的一点小坑
    java静态内部类的作用
    Python学习 :json、pickle&shelve 模块
    Python学习 :正则表达式
    Python学习 :常用模块(四)----- 配置文档
  • 原文地址:https://www.cnblogs.com/lz2017/p/8365470.html
Copyright © 2020-2023  润新知