SpringMVC(9)——表单标签库
  TEZNKK3IfmPf 2023年11月13日 37 0

概述

表单标签库中包含了可以用在JSP页面中渲染HTML元素的标签。

JSP页面中使用Spring表单标签库时,必须在JSP页面开头处声明taglib指令:

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

在表单标签库中有form、input、password、hidden、textarea、checkbox、checkboxes、
radiobutton、Iradiobuttons、select、option、options、errors等标签。

常用标签

表单标签

语法:

    <form:form modelAttribute="" method="post" servletRelativeAction="">

    </form:form>

表单标签除了具有HTML表单元素属性以外,还具有acceptCharset、commandName、
cssSClass、cssStyle、htmlEscape和modelAttribute等属性。

  • acceptCharset:定义服务器接受的字符编码列表。
  • commandName:暴露表单对象的模型属性名称,默认为command。
  • cssClass:定义应用到form元素的CSS类。
  • cssStyle:定义应用到form元素的CSS样式。
  • htmlEscape:true或false,表示是否进行HTML转义。
  • modelAttribute:暴露form backing object的模型属性名称,默认为command。

其中,commandName和modelAttribute属性的功能基本一致,属性值绑定一个JavaBean对象。

input标签

语法:

<form:input path="xxx"/>

该标签有cssClass、cssStyle、htmlEscape及path属性。

path属性将文本框输入值绑定到form backing object上。

password标签

语法:

<form:password path="xxx"/>

hidden标签

语法:

<form:hidden path="xxx"/>

表示隐藏的元素,故不支持cssClass和cssStyle属性。

textarea标签

语法:

<form:textarea path="xxx"/>

checkbox标签

语法:

<form:checkbox path="xxx" value="xxx"/>

多个path相同的checkbox标签,它们是一个选项组,允许多选,选项值绑定到一个数组属性。

例:

    <form:checkbox path="language" value="汉语"/>汉语
    <form:checkbox path="language" value="英语"/>英语
    <form:checkbox path="language" value="俄语"/>俄语
    <form:checkbox path="language" value="拉丁语"/>拉丁语
    <form:checkbox path="language" value="法语"/>法语

checkboxes标签

与多个path相同的checkbox标签功能相同。

三个重要属性:

  • items:用于生成input元素的Collection、Map或Array。
  • itemLabel:items属性中指定的集合对象的属性,为每个input元素提供label。
  • itemValue:items属性中指定的集合对象的属性,为每个input元素提供value。

语法:

<form:checkboxes items="xxx" path="xxx"/>

radiobutton标签

语法:

<form:radiobutton path="xxx" value="xxx"/>

多个path相同的radiobutton标签是一个选项组,只支持单选。

radiobuttons标签

语法:

<form:radiobuttons path="xxx" items="xxx"/>

等价于多个path形同的radiobutton标签,也只支持单选。

select标签

语法:

<form:select path="xxx" items="xxx"/>

<form:select path="xxx" items="xxx">
    <option value="xxx">xxx</option>
</form:select>

<form:select path="xxx">
    <form:options items="xxx"/>
</form:select>

select标签的选项来自属性items指定集合或者嵌套的option标签或options标签。

options标签

和select标签嵌套使用。

errors标签

渲染一个或者多个的span元素,每个span元素包含一个错误消息。

显示所有错误消息的语法:

<form:errors path="*"/>

显示特定的错误消息的语法:

<form:errors path="xxx"/>

实例

本项目要用到的jar包:

SpringMVC(9)——表单标签库

创建springmvc项目并按照下图创建文件及文件夹:

SpringMVC(9)——表单标签库

各文件代码如下:

StudentController.java

package springmvcdemo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import springmvcdemo.pojo.Student;
import springmvcdemo.service.StudentService;

import java.util.ArrayList;
import java.util.HashMap;

@Controller
@RequestMapping("/student")
public class StudentController {
    @Autowired
    private StudentService studentService;

    @RequestMapping("input")
    public String inputUser(Model model) {
        HashMap<java.lang.String, java.lang.String> hobbys = new HashMap<>();
        hobbys.put("阅读", "阅读");
        hobbys.put("运动", "运动");
        hobbys.put("游戏", "游戏");
        hobbys.put("旅行", "旅行");
        model.addAttribute("student", new Student());
        model.addAttribute("hobbys", hobbys);
        model.addAttribute("studentClass", new java.lang.String[]{"高三1班", "高三2班", "高三3班"});
        return "studentAdd";
    }

    @RequestMapping("/addStudent")
    public String addStudent(@ModelAttribute Student student, Model model) {
        if (studentService.addStudent(student)) {
            System.out.println("添加成功");
            return "redirect:/student/studentsList";
        } else {
            System.out.println("添加失败");
            HashMap<java.lang.String, java.lang.String> hobbys = new HashMap<>();
            hobbys.put("阅读", "阅读");
            hobbys.put("运动", "运动");
            hobbys.put("游戏", "游戏");
            hobbys.put("旅行", "旅行");
            // 不需要model.addAttribute(),因为@ModelAttribute指定了form backing object
//            model.addAttribute("student",new Student());
            model.addAttribute("hobbys", hobbys);
            model.addAttribute("studentClass", new java.lang.String[]{"高三1班", "高三2班", "高三3班"});
            return "studentAdd";
        }
    }

    @RequestMapping("studentsList")
    public String studentsList(Model model) {
        ArrayList<Student> students = studentService.getStudents();
        model.addAttribute("students", students);
        return "studentsList";
    }

}

Student.java

package springmvcdemo.pojo;

public class Student {
    private String name;
    private String sex;
    private String[] hobby;
    private String studentClass;
    private String memo;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    public String getStudentClass() {
        return studentClass;
    }

    public void setStudentClass(String studentClass) {
        this.studentClass = studentClass;
    }

    public String getMemo() {
        return memo;
    }

    public void setMemo(String memo) {
        this.memo = memo;
    }
}

StudentService.java

package springmvcdemo.service;

import springmvcdemo.pojo.Student;

import java.util.ArrayList;

public interface StudentService {
    /**
     * 添加学生
     *
     * @param student 学生
     * @return 返回是否添加成功,如果是true则添加成功,false表示没有添加成功
     */
    boolean addStudent(Student student);

    /**
     * 获取学生
     *
     * @return 返回学生集
     */
    ArrayList<Student> getStudents();
}

StudentServiceImpl.java

package springmvcdemo.service;

import org.springframework.stereotype.Service;
import springmvcdemo.pojo.Student;

import java.util.ArrayList;

@Service
public class StudentServiceImpl implements StudentService{
    private static ArrayList<Student> students=new ArrayList<>();

    @Override
    public boolean addStudent(Student student) {
        if (!"张三".equals(student.getName())) {
            students.add(student);
            return true;
        }
        return false;
    }

    @Override
    public ArrayList<Student> getStudents() {
        return students;
    }
}

springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context.xsd">

    <!--使用扫描机制扫描控制器类,控制器类都在controller包及其子包下-->
    <context:component-scan base-package="springmvcdemo.controller"/>

    <!--使用扫描机制扫描服务类,服务类都在service包及其子包下-->
    <context:component-scan base-package="springmvcdemo.service"/>

    <!--配置视图解析器-->
    <!--配置视图解析器成功后,RegisterController和LoginController控制器类的视图路径仅需提供register和login,视图解析器将会自动添加前缀和后缀-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

studentAdd.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加学生</title>
</head>
<body>
    <form:form modelAttribute="student" method="post" action="/student/addStudent">
        姓名:<form:input path="name"/><br>
        性别:<form:radiobutton path="sex" value="男"/>男
              <form:radiobutton path="sex" value="女"/>女<br/>
        爱好:<form:checkboxes path="hobby" items="${hobbys}"/><br/>
        班级:<form:select path="studentClass">
                <form:option value="请选择班级">请选择班级</form:option>
                <form:options items="${studentClass}"/>
              </form:select><br/>
        备注:<form:textarea path="memo" rows="5"/><br/>
        <input type="reset" id="reset">
        <input type="submit" id="submit" value="添加学生">
    </form:form>
</body>
</html>

studentList.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>学生列表</title>
</head>
<body>
    <h1>学生列表</h1><br>
    <a href="/student/input">继续添加</a>
    <table>
        <tr>
            <th>姓名</th>
            <th>性别</th>
            <th>爱好</th>
            <th>班级</th>
            <th>备注</th>
        </tr>
        <c:forEach items="${students}" var="student">
            <tr>
                <td>${student.name}</td>
                <td>${student.sex}</td>
                <td>
                    <c:forEach items="${student.hobby}" var="hobby">
                        ${hobby}&nbsp;
                    </c:forEach>
                </td>
                <td>${student.studentClass}</td>
                <td>${student.memo}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--部署DispatcherServlet-->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--加载Spring MVC的配置文件,配置文件可以放在项目目录的任意位置,使用init-param元素加载配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--配置文件的位置-->
            <param-value>/WEB-INF/config/springmvc-config/springmvc-servlet.xml</param-value>
        </init-param>
        <!--表示容器在启动时立即加载servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <!--处理所有URL-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--避免中文乱码-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

运行效果

SpringMVC(9)——表单标签库

点击【添加学生】按钮

SpringMVC(9)——表单标签库

点击【继续添加】超链接即可继续添加。

如果添加失败,表单中的信息也不会消失。(例如添加姓名为张三的学生)

这是数据绑定的自动回填(但必须结合form标签)。

SpringMVC(9)——表单标签库

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

TEZNKK3IfmPf