Главная » Spring » Проверка входных данных Spring

0

К процедуре регистрации нового пользователя предъявляются определенные требования. В частности, новый пользователь дол- жен указать свое полное имя, адрес электронной почты, имя учетной

записи и пароль. Но и это еще не все, адрес электронной почты не может иметь произвольный формат – он должен быть похожим на адрес электронной почты. Кроме того, пароль должен содержать как минимум шесть символов.

Аннотация @Valid – первая линия обороны от недопустимых вход- ных данных. В действительности аннотация @Valid является частью спецификации «JavaBean Validation API»1. Версия Spring 3 вклю- чает поддержку JSR-303, и мы воспользовались аннотацией @Valid, чтобы сообщить фреймворку Spring, что объект Spitter должен быть проверен, так как значения своих свойств он получает из данных, введенных пользователем.

Если в процессе проверки объекта Spitter будут обнаружены не- допустимые данные, информация об ошибках будет передана методу addSpitterFromForm() в виде объекта BindingResult во втором парамет- ре. Если метод BindingResult.hasErrors() вернет true, это означает, что проверка потерпела неудачу. В этом случае метод вернет логиче- ское имя представления spitters/edit, чтобы обеспечить повторное отображение формы и дать пользователю возможность исправить ошибки.

Но как Spring отличит допустимый объект Spitter от недопусти- мого?

Объявление правил проверки

Кроме всего прочего, спецификация JSR-303 определяет несколь- ко аннотаций, определяющих правила проверки допустимости зна- чений в свойствах. Чтобы определить «допустимость» каждого свой- ства объекта Spitter, можно использовать эти аннотации. В листинге

8.11 представлены свойства класса Spitter, отмеченные аннотациями с правилами проверки.

Листинг 8.11. Свойства класса Spitter, отмеченные аннотациями с правилами проверки

@Size(min=3,  max=20,

message="Username  must  be  between  3  and  20  characters  long.")

@Pattern(regexp="^[a-zA-Z0-9]+

К процедуре регистрации нового пользователя предъявляются определенные требования. В частности, новый пользователь дол- жен указать свое полное имя, адрес электронной почты, имя учетной

записи и пароль. Но и это еще не все, адрес электронной почты не может иметь произвольный формат – он должен быть похожим на адрес электронной почты. Кроме того, пароль должен содержать как минимум шесть символов.

Аннотация @Valid – первая линия обороны от недопустимых вход- ных данных. В действительности аннотация @Valid является частью спецификации «JavaBean Validation API»1. Версия Spring 3 вклю- чает поддержку JSR-303, и мы воспользовались аннотацией @Valid, чтобы сообщить фреймворку Spring, что объект Spitter должен быть проверен, так как значения своих свойств он получает из данных, введенных пользователем.

Если в процессе проверки объекта Spitter будут обнаружены не- допустимые данные, информация об ошибках будет передана методу addSpitterFromForm() в виде объекта BindingResult во втором парамет- ре. Если метод BindingResult.hasErrors() вернет true, это означает, что проверка потерпела неудачу. В этом случае метод вернет логиче- ское имя представления spitters/edit, чтобы обеспечить повторное отображение формы и дать пользователю возможность исправить ошибки.

Но как Spring отличит допустимый объект Spitter от недопусти- мого?

Объявление правил проверки

Кроме всего прочего, спецификация JSR-303 определяет несколь- ко аннотаций, определяющих правила проверки допустимости зна- чений в свойствах. Чтобы определить «допустимость» каждого свой- ства объекта Spitter, можно использовать эти аннотации. В листинге

8.11 представлены свойства класса Spitter, отмеченные аннотациями с правилами проверки.

Листинг 8.11. Свойства класса Spitter, отмеченные аннотациями с правилами проверки

@Size(min=3,  max=20,

message="Username  must  be  between  3  and  20  characters  long.")

@Pattern(regexp="^[a-zA-Z0-9]+$",

message="Username must be alphanumeric with no spaces") private   String   username;

1   Также известной как JSR-303 (http://jcp.org/en/jsr/summary?id=303).

@Size(min=6,  max=20,

message="The password must be at least 6 characters long.") private  String  password;

@Size(min=3,  max=50,

message="Your  full  name  must  be  between  3  and  50  characters  long.") private   String   fullName;

@Pattern(regexp="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", message="Invalid   email   address.")

private  String  email;

Первые три свойства в листинге 8.11 отмечены аннотацией @Size, определяемой спецификацией JSR-303, реализующей проверку дли- ны значения аннотированного свойства. Свойство username должно содержать не менее 3 и не более 20 символов, тогда как свойство fullName должно иметь длину от 3 до 50 символов. Свойство password должно содержать не менее 6 символов и не более 20.

Чтобы убедиться, что значение свойства email формально соот- ветствует формату адреса электронной почты, оно было отмечено аннотацией @Pattern с регулярным выражением в атрибуте regexp, на соответствие которому должно проверяться значение свойства1. Аналогично с помощью аннотации @Pattern проверяется, что свой- ство username содержит только алфавитные символы без пробелов.

Во всех аннотациях выше, реализующих проверку, определяется атрибут message с текстом сообщения, отображаемым в форме, в слу- чае, когда проверка терпит неудачу, чтобы пользователь знал, какое значение следует исправить.

Теперь, когда пользователь отправит форму регистрации методу addSpitterFromForm() контроллера SpitterController, значения полей объекта Spitter будут проверены в соответствии с правилами в ан- нотациях. Если какое-либо из правил будет нарушено, метод-обра- ботчик вновь отправит пользователя к форме ввода, чтобы он мог исправить ошибки.

При повторной отправке формы пользователю необходимо иметь некоторый механизм, который позволил бы описать проблему. По- этому вернемся к JSP-файлу с определением формы и добавим код, отображающий сообщения механизма проверки.

1   Имейте в виду, что здесь проверяется не сам адрес электронной почты, а лишь его соответствие определенному формату.

Отображение  сообщений  механизма  проверки

Напомню, что объект BindingResult, переданный методу addSpitter- FromForm(), позволяет определить, были ли выявлены ошибки в про- цессе проверки формы. Для этого достаточно просто вызвать его метод hasErrors(). Но в этом объекте также содержатся сообщения об ошибках для полей, не прошедших проверку.

Один из способов отобразить текст сообщений об ошибках со- стоит в том, чтобы извлекать сообщения об ошибках для отдельных полей вызовом метода getFieldError()  объекта BindingResult. Но в Spring имеется более удобный способ – с использованием библио- теки тегов JSP. В частности, ошибки, выявленные при проверке, позволяет отобразить тег <sf:errors>. Для этого достаточно добавить несколько тегов <sf:errors> в определение формы, как показано в листинге 8.12.

Листинг 8.12. Тег <sf:errors> можно использовать для отображения сообщений об ошибках

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

<div>

<h2>Create a free Spitter account</h2>

<sf:form  method="POST"  modelAttribute="spitter" enctype="multipart/form-data">

<fieldset>

<table  cellspacing="0">

<tr>

<th><sf:label path="fullName">Full name:</sf:label></th>

<td><sf:input  path="fullName"  size="15"  /><br/>

<sf:errors  path="fullName"  cssClass="error"  />  <!–  Сообщить  об  –>

</td>                                                             <!–  ошибке  в  поле  fullName  –>

</tr>

<tr>

<th><sf:label    path="username">Username:</sf:label></th>

<td><sf:input  path="username"  size="15"  maxlength="15"  />

<small id="username_msg">No spaces, please.</small><br/>

<sf:errors  path="username"  cssClass="error"  />  <!–  Сообщить  об  –>

</td>                                                             <!–  ошибке  в  поле  username  –>

</tr>

<tr>

<th><sf:label path="password">Password:</sf:label></th>

<td><sf:password  path="password"  size="30"

showPassword="true"/>

<small>6  characters  or  more  (be  tricky!)</small><br/>

<sf:errors  path="password"  cssClass="error"  />       <!–  Сообщить  об  –>

</td>                                                                <!–  ошибке  в  поле  password  –>

</tr>

<tr>

<th><sf:label path="email">Email Address:</sf:label></th>

<td><sf:input path="email" size="30"/>

<small>In  case  you  forget  something</small><br/>

<sf:errors path="email"  cssClass="error"  />         <!–  Сообщить  об –>

</td>                                                                    <!–  ошибке  в  поле  email  –>

</tr>

<tr>

<th></th>

<td>

<sf:checkbox path="updateByEmail"/>

<sf:label  path="updateByEmail">   Send  me  email  updates!</sf:label>

</td>

</tr>

<tr>

<th><label for="image">Profile image:</label></th>

<td><input  name="image"  type="file"/>

</tr>

<tr>

<th></th>

<td><input  name="commit"  type="submit"

value="I  accept.  Create  my  account."  /></td>

</tr>

</table>

</fieldset>

</sf:form>

</div>

Атрибут path элемента <sf:errors> определяет поле формы, ря- дом с которым следует вывести сообщение об ошибке. Например, следующий элемент <sf:errors> обеспечивает вывод сообщения об ошибке (если таковая имеется) для поля с именем fullName:

<sf:errors path="fullName" cssClass="error" />

Если в значении поля будет обнаружено несколько ошибок, будут выведены все соответствующие сообщения, разделенные HTML- тегом <br/>. Если потребуется отделять сообщения друг от друга

каким-то иным способом, для этого можно использовать атрибут delimiter. Следующий элемент <sf:errors> выводит сообщения об ошибках через запятую и пробел:

<sf:errors path="fullName" delimiter=", " cssClass="error" />

Обратите внимание, что в этой JSP-странице присутствуют че- тыре тега <sf:errors> – по одному для каждого поля, где объявлены правила проверки. Атрибут cssClass ссылается на класс CSS, чтобы обеспечить вывод сообщений об ошибках красным цветом для при- влечения внимания пользователя.

Теперь если при проверке будут обнаружены какие-либо ошибки, они появятся на странице с формой. Например, на рис. 8.7 показано, как будет выглядеть форма, если пользователь оставит все поля не- заполненными.

Как показано на рис. 8.7, сообщения об ошибках отображаются отдельно для каждого поля формы. Но если потребуется отобра- зить все сообщения об ошибках в одном месте (например, вверху

Рис. 8.7. JSP-теги <sf:errors> в форме регистрации обеспечат отображение сообщений об ошибках,

чтобы пользователь мог исправить их и повторить попытку

формы), достаточно будет добавить единственный тег <sf:errors>

с атрибутом path, имеющим значение *:

<sf:errors path="*" cssClass="error" />

Теперь вы знаете, как писать методы-обработчики контроллеров, обрабатывающие данные формы. Но все эти поля форм, обсуждав- шиеся выше, объединяет одно обстоятельство – они являются тек- стовыми полями ввода и предназначены для ввода данных с кла- виатуры. А как быть, если пользователю потребуется представить в форме некоторые данные, которые невозможно ввести с клавиату- ры? Например, отправить изображение или файл какого-то другого типа?

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

quot;,

message="Username must be alphanumeric with no spaces") private   String   username;

1   Также известной как JSR-303 (http://jcp.org/en/jsr/summary?id=303).

@Size(min=6,  max=20,

message="The password must be at least 6 characters long.") private  String  password;

@Size(min=3,  max=50,

message="Your  full  name  must  be  between  3  and  50  characters  long.") private   String   fullName;

@Pattern(regexp="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", message="Invalid   email   address.")

private  String  email;

Первые три свойства в листинге 8.11 отмечены аннотацией @Size, определяемой спецификацией JSR-303, реализующей проверку дли- ны значения аннотированного свойства. Свойство username должно содержать не менее 3 и не более 20 символов, тогда как свойство fullName должно иметь длину от 3 до 50 символов. Свойство password должно содержать не менее 6 символов и не более 20.

Чтобы убедиться, что значение свойства email формально соот- ветствует формату адреса электронной почты, оно было отмечено аннотацией @Pattern с регулярным выражением в атрибуте regexp, на соответствие которому должно проверяться значение свойства1. Аналогично с помощью аннотации @Pattern проверяется, что свой- ство username содержит только алфавитные символы без пробелов.

Во всех аннотациях выше, реализующих проверку, определяется атрибут message с текстом сообщения, отображаемым в форме, в слу- чае, когда проверка терпит неудачу, чтобы пользователь знал, какое значение следует исправить.

Теперь, когда пользователь отправит форму регистрации методу addSpitterFromForm() контроллера SpitterController, значения полей объекта Spitter будут проверены в соответствии с правилами в ан- нотациях. Если какое-либо из правил будет нарушено, метод-обра- ботчик вновь отправит пользователя к форме ввода, чтобы он мог исправить ошибки.

При повторной отправке формы пользователю необходимо иметь некоторый механизм, который позволил бы описать проблему. По- этому вернемся к JSP-файлу с определением формы и добавим код, отображающий сообщения механизма проверки.

1   Имейте в виду, что здесь проверяется не сам адрес электронной почты, а лишь его соответствие определенному формату.

Отображение  сообщений  механизма  проверки

Напомню, что объект BindingResult, переданный методу addSpitter- FromForm(), позволяет определить, были ли выявлены ошибки в про- цессе проверки формы. Для этого достаточно просто вызвать его метод hasErrors(). Но в этом объекте также содержатся сообщения об ошибках для полей, не прошедших проверку.

Один из способов отобразить текст сообщений об ошибках со- стоит в том, чтобы извлекать сообщения об ошибках для отдельных полей вызовом метода getFieldError()  объекта BindingResult. Но в Spring имеется более удобный способ – с использованием библио- теки тегов JSP. В частности, ошибки, выявленные при проверке, позволяет отобразить тег <sf:errors>. Для этого достаточно добавить несколько тегов <sf:errors> в определение формы, как показано в листинге 8.12.

Листинг 8.12. Тег <sf:errors> можно использовать для отображения сообщений об ошибках

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

<div>

<h2>Create a free Spitter account</h2>

<sf:form  method="POST"  modelAttribute="spitter" enctype="multipart/form-data">

<fieldset>

<table  cellspacing="0">

<tr>

<th><sf:label path="fullName">Full name:</sf:label></th>

<td><sf:input  path="fullName"  size="15"  /><br/>

<sf:errors  path="fullName"  cssClass="error"  />  <!–  Сообщить  об  –>

</td>                                                             <!–  ошибке  в  поле  fullName  –>

</tr>

<tr>

<th><sf:label    path="username">Username:</sf:label></th>

<td><sf:input  path="username"  size="15"  maxlength="15"  />

<small id="username_msg">No spaces, please.</small><br/>

<sf:errors  path="username"  cssClass="error"  />  <!–  Сообщить  об  –>

</td>                                                             <!–  ошибке  в  поле  username  –>

</tr>

<tr>

<th><sf:label path="password">Password:</sf:label></th>

<td><sf:password  path="password"  size="30"

showPassword="true"/>

<small>6  characters  or  more  (be  tricky!)</small><br/>

<sf:errors  path="password"  cssClass="error"  />       <!–  Сообщить  об  –>

</td>                                                                <!–  ошибке  в  поле  password  –>

</tr>

<tr>

<th><sf:label path="email">Email Address:</sf:label></th>

<td><sf:input path="email" size="30"/>

<small>In  case  you  forget  something</small><br/>

<sf:errors path="email"  cssClass="error"  />         <!–  Сообщить  об –>

</td>                                                                    <!–  ошибке  в  поле  email  –>

</tr>

<tr>

<th></th>

<td>

<sf:checkbox path="updateByEmail"/>

<sf:label  path="updateByEmail">   Send  me  email  updates!</sf:label>

</td>

</tr>

<tr>

<th><label for="image">Profile image:</label></th>

<td><input  name="image"  type="file"/>

</tr>

<tr>

<th></th>

<td><input  name="commit"  type="submit"

value="I  accept.  Create  my  account."  /></td>

</tr>

</table>

</fieldset>

</sf:form>

</div>

Атрибут path элемента <sf:errors> определяет поле формы, ря- дом с которым следует вывести сообщение об ошибке. Например, следующий элемент <sf:errors> обеспечивает вывод сообщения об ошибке (если таковая имеется) для поля с именем fullName:

<sf:errors path="fullName" cssClass="error" />

Если в значении поля будет обнаружено несколько ошибок, будут выведены все соответствующие сообщения, разделенные HTML- тегом <br/>. Если потребуется отделять сообщения друг от друга

каким-то иным способом, для этого можно использовать атрибут delimiter. Следующий элемент <sf:errors> выводит сообщения об ошибках через запятую и пробел:

<sf:errors path="fullName" delimiter=", " cssClass="error" />

Обратите внимание, что в этой JSP-странице присутствуют че- тыре тега <sf:errors> – по одному для каждого поля, где объявлены правила проверки. Атрибут cssClass ссылается на класс CSS, чтобы обеспечить вывод сообщений об ошибках красным цветом для при- влечения внимания пользователя.

Теперь если при проверке будут обнаружены какие-либо ошибки, они появятся на странице с формой. Например, на рис. 8.7 показано, как будет выглядеть форма, если пользователь оставит все поля не- заполненными.

Как показано на рис. 8.7, сообщения об ошибках отображаются отдельно для каждого поля формы. Но если потребуется отобра- зить все сообщения об ошибках в одном месте (например, вверху

Рис. 8.7. JSP-теги <sf:errors> в форме регистрации обеспечат отображение сообщений об ошибках,

чтобы пользователь мог исправить их и повторить попытку

формы), достаточно будет добавить единственный тег <sf:errors>

с атрибутом path, имеющим значение *:

<sf:errors path="*" cssClass="error" />

Теперь вы знаете, как писать методы-обработчики контроллеров, обрабатывающие данные формы. Но все эти поля форм, обсуждав- шиеся выше, объединяет одно обстоятельство – они являются тек- стовыми полями ввода и предназначены для ввода данных с кла- виатуры. А как быть, если пользователю потребуется представить в форме некоторые данные, которые невозможно ввести с клавиату- ры? Например, отправить изображение или файл какого-то другого типа?

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии