从零开始学SpringMVC(十)——form标签与服务器表单校验

  • mvc:view-controller

      当我们发送一个请求时,如果没有找到对应的mapping映射方法即Controller,则会在配置文件springmvc.xml当中匹配mvc:view-controller寻找对应的跳转页面

示例:编写一个测试页面test.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>index</title>
</head>
<body>
  <a href="${pageContext.request.contextPath}/test">测试无mapping跳转</a>
</body>
</html>

 从零开始学SpringMVC(十)——form标签与服务器表单校验

此时并没有配置对应的Controller的mapping方法,因此运行项目后点击链接会报404.

从零开始学SpringMVC(十)——form标签与服务器表单校验

此时,我们只要在springmvc.xml配置文件中添加如下配置即可

<mvc:view-controller path="test" view-name="result"/>

从零开始学SpringMVC(十)——form标签与服务器表单校验

此时重新运行项目再次点击链接即可跳转到/result.jsp页面

注意,如果使用了mvc:view-controller,则要在后面加上<mvc:annotation-driven/>,否则将导致配置好的mapping映射方法即Controller不可用

完整的springmvc.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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop.xsd
   http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--  扫描指定包下的注解 -->
    <context:component-scan base-package="demo1.Controller"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--  配置逻辑视图的前缀 -->
    <property name="prefix" value="/"/>
    <!--  配置逻辑视图的后缀  -->
    <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 配置无mapping时的默认跳转页面   -->
    <mvc:view-controller path="test" view-name="result"/>
    <!--  解决配置了mvc:view-controller后导致Controller中的mapping无法使用的问题  -->
    <mvc:annotation-driven/>
</beans>

从零开始学SpringMVC(十)——form标签与服务器表单校验

  • <mvc:annotation-driven/>

<mvc:annotation-driven /> 是一种简写形式

如果不配置<mvc:view-controller>以及<mvc:annotation-driven />时,springmvc会自动注册以下三个Bean:

RequestMappingHandlerMapping

RequestMappingHandlerAdapter

ExceptionHandlerExceptionResolver

如果配置了<mvc:view-controller>而没有配置<mvc:annotation-driven />,此时就不会注册两个bean:

RequestMappingHandlerAdapter

ExceptionHandlerExceptionResolver

RequestMappingHandlerMapping(处理请求映射mapping)没有自动注册,因此导致无法访问配置好的Controller里的mapping映射方法

所以我们在配置<mvc:view-controller>会加上<mvc:annotation-driven />,这样的话就会注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter 、ExceptionHandlerExceptionResolver这三个bean

配置了<mvc:annotation-driven />后会提供以下支持:

数据绑定支持,

@NumberFormatannotation支持,

@DateTimeFormat支持,

@Valid支持,读写XML的支持(JAXB),

读写JSON的支持(Jackson)。

  • form标签

3.1简介

在使用SpringMVC的时候我们可以使用Spring封装的一系列表单标签,

这些标签都可以访问到ModelMap中的内容

3.2作用

第一是它会自动的绑定来自Model中的一个属性值到当前form对应的实体对象

第二是它支持我们在提交表单的时候使用除GET和POST之外的其他方法进行提交,包括DELETE和PUT等

3.3使用场景

当编辑时, 跳转到form表单页,传统模式要在跳转前先到数据库查询数据,然后进行表单数据回显

使用form之前一定要保证有对应的bean,没有对应的bean时, 会自动以command为key到request域中查询,当找不到的时候, 会报异常

3.4 使用步骤

3.4.1在需要用到form标签的jsp页面引入标签库

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

3.4.2 test.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>测试form标签的使用</title>
</head>
<body>
 <a href="${pageContext.request.contextPath}/query/1">查询数据展示修改</a>
</body>
</html>

3.4.3创建表单(result.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="fm" %>
<html>
<head>
    <title>result.jsp</title>
</head>
<body>
<h1>结果页</h1>
<fm:form modelAttribute="teacher"  action="${pageContext.request.contextPath}/update">
    姓名:<fm:input path="name"/> <fm:errors path="name" cssStyle="color: red"/><br>
    年龄:<fm:input path="age"/> <fm:errors path="age" cssStyle="color: red"/><br>
    性别:<fm:radiobutton path="gender" value="0" label="男"/>
        <fm:radiobutton path="gender" value="1" label="女"/><br>
    爱好:<fm:checkboxes path="hobby" items="${hobbyList}"/> <br>
    宠物:<fm:select path="dog.id" items="${dogList}" itemValue="id" itemLabel="name"/> <br>
    <input type="submit" value="修改">
</fm:form>

</body>
</html>

从零开始学SpringMVC(十)——form标签与服务器表单校验 

3.4.4 success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>success.jsp</title>

</head>
<body>
<h1>修改成功</h1>
</body>
</html>

3.4.5 Teacher包装类

public class Teacher {
    private String name;
    private Integer age;
    private Integer gender;
    private String[] hobby;
    private Dog dog;

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

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

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

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    public Integer getGender() {
        return gender;
    }

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

    public Dog getDog() {
        return dog;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                ", hobby=" + Arrays.toString(hobby) +
                ", dog=" + dog +
                '}';
    }
}

3.4.6 Dog包装类
 

public class Dog {
    private  Integer id;
    private String name;
    private String color;

    public Integer getId() { return id; }

    public void setId(Integer id) { this.id = id; }

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

    public void setColor(String color) {
        this.color = color;
    }

    public String getName() {
        return name;
    }

    public String getColor() {
        return color;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}

3.4.7 Controller

@Controller
public class TestController {

     @RequestMapping("/query/{id}")
    public String query(@PathVariable String id, Model model){
         System.out.println(id);
         Teacher teacher = new Teacher();
         teacher.setName("张三");
         teacher.setAge(30);

         ArrayList<Object> dogList = new ArrayList<>();
         Dog dog = new Dog();
         dog.setId(1);
         dog.setName("旺财");
         dog.setColor("黄色");
         Dog dog1 = new Dog();
         dog1.setId(2);
         dog1.setName("小黑");
         dog1.setColor("黑色");
         dogList.add(dog);
         dogList.add(dog1);
         ArrayList<Object> hobbyList = new ArrayList<>();
         hobbyList.add("篮球");
         hobbyList.add("足球");
         hobbyList.add("乒乓球");
         model.addAttribute("hobbyList", hobbyList);
         //设置默认选择的爱好
         String[] hobby = new String[]{"篮球"};
         teacher.setHobby(hobby);
         //设置默认选择的宠物
         teacher.setDog(dog);
         //设置默认选择的性别0-男  1-女
         teacher.setGender(1);
         model.addAttribute("teacher",teacher);
         model.addAttribute("dogList",dogList);
         return "result";
     }

    @RequestMapping("/update")
    public String update(Teacher teacher){
         System.out.println(teacher);
         return "success";
    }
}

3.4.8运行结果

从零开始学SpringMVC(十)——form标签与服务器表单校验 

点击链接,将结果展示到result.jsp页面中

从零开始学SpringMVC(十)——form标签与服务器表单校验 

修改值如下

从零开始学SpringMVC(十)——form标签与服务器表单校验

点击修改按钮,请求路径为jsp中设置的action路径

从零开始学SpringMVC(十)——form标签与服务器表单校验

后台回传数据如下

从零开始学SpringMVC(十)——form标签与服务器表单校验

补充说明:如果在form标签中没有设置action请求响应路径,则默认为当前路径

从零开始学SpringMVC(十)——form标签与服务器表单校验

  • 服务器表单校验

4.1为什么后端要做表单的校验?

如果只使用前端校验的话,且浏览器把JS给禁用掉,那么页面显示就会出问题

4.2 JSR 规范

JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中

JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解

指定校验规则,并通过标准的验证接口对 Bean 进行验证

4.3 Hibernate Validator

是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解

4.4 常用校验规则

4.4.1  Bean Validation 中内置的约束

@Null   被注释的元素必须为 null       

@NotNull    被注释的元素必须不为 null       

@AssertTrue     被注释的元素必须为 true       

@AssertFalse    被注释的元素必须为 false       

@Min(value)   被注释的元素必须是一个数字,其值必须大于等于指定的最小值       

@Max(value)   被注释的元素必须是一个数字,其值必须小于等于指定的最大值       

@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值       

@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值       

@Size(max=, min=)   被注释的元素的大小必须在指定的范围内       

@Digits (integer, fraction)  被注释的元素必须是一个数字,其值必须在可接受的范围内       

@Past   被注释的元素必须是一个过去的日期       

@Future     被注释的元素必须是一个将来的日期       

@Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式    

4.4.2   Hibernate Validator 附加的约束

@NotBlank(message =)   验证字符串非null,且长度必须大于0       

@Email  被注释的元素必须是电子邮箱地址       

@Length(min=,max=)  被注释的字符串的大小必须在指定的范围内       

@NotEmpty   被注释的字符串的必须非空       

@Range(min=,max=,message=)  被注释的元素必须在合适的范围内

4.5 使用步骤

4.5.1 使用Hibernate-Validator导入jar包

从零开始学SpringMVC(十)——form标签与服务器表单校验

4.5.2 在配置文件springmvc.xml当中添加<mvc:annotation-driven/>

从零开始学SpringMVC(十)——form标签与服务器表单校验

4.5.3 在domain类中添加对应的校验规则

从零开始学SpringMVC(十)——form标签与服务器表单校验

4.5.4 在处理器方法的入参中添加注解@Valid

从零开始学SpringMVC(十)——form标签与服务器表单校验

4.5.5 将错误信息回显到页面中

使用form标签<fm:error path="username"></fm:error>

从零开始学SpringMVC(十)——form标签与服务器表单校验

4.5.6 运行结果

从零开始学SpringMVC(十)——form标签与服务器表单校验

 从零开始学SpringMVC(十)——form标签与服务器表单校验

从零开始学SpringMVC(十)——form标签与服务器表单校验 

当年龄输入大于200时,会提示我们在包装类中设置的错误信息

上一篇:JavaScript继承


下一篇:CSS 怀表式翻转