A visitor's bad input is caught twice: once by the browser, from each input's own type and attributes, and again by the server, which applies the rules configured here and never trusts the browser alone. This unit covers both layers together with what a rejection looks like in each submission model, and the patterns that keep every visitor able to find and fix one without losing their answers.
Read it before Branching forms: a field that is conditionally required draws on the same validation rules described here.