English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
1. Einleitung
1.1Was ist Eingabevalidierung? Warum ist Eingabevalidierung erforderlich?
In dem letzten Artikel haben wir die Datentypumwandlung gelernt, wir haben die zwei Methoden der Datenverarbeitungsebene erwähnt und auch darauf hingewiesen, dass die Benutzerinputdaten umgewandelt werden müssen, um die gewünschten Daten zu erhalten, wie können wir sicherstellen, dass die umgewandelten Daten die gewünschten Daten sind? Das ist etwas verwirrend. Man kann sich so vorstellen: Das Alter eines erwachsenen Mannes ist18Alter, du möchtest jetzt erhalten18Diese Daten, aber, die Eingabe des Benutzers32Die Daten sind nach der Typumwandlung auch korrekt, aber die Daten sind nicht das, was du willst. Was tun wir in diesem Fall? Daher ist die Eingabevalidierung hier nützlich.
Das Verhältnis zwischen Typumwandlung und Eingabevalidierung ist: Die Typumwandlung ist die Voraussetzung für die Eingabevalidierung, wenn die Typumwandlung fehlschlägt, ist keine weitere Eingabevalidierung erforderlich. Aber oft werden Typumwandlung und Eingabevalidierung gleichzeitig durchgeführt.
Es gibt zwei Arten von Eingabevalidierung:
1Clientseitige Validierung;
2Serverseitige Validierung. Hier wird hauptsächlich die serverseitige Validierung (Überschreiben der Methode ValidateXxx und Validierung der XML-Konfigurationsdatei) erläutert
1.2Die Validierungsablaufmethode ValidateXxx wird überschrieben
1Der Typumwandler ist verantwortlich für die Typumwandlung der Anfrageparameter als Zeichenkette und setzt diese Werte als Attributwerte des Actions
2During the execution of type conversion, exceptions may occur, if an exception occurs, the exception information will be automatically saved to the ActionContext, and the conversionError interceptor is responsible for encapsulating it into fieldError
3Call the ValidateXxx() method through reflection, where Xxx is the method name corresponding to the handling logic of the user request to be processed
4Call the Validate method of the Action class
5If the above steps do not appear fieldError, the handling method of the user request in the Action will be called, if fieldError appears, the system will switch to the view specified by the input logic view.
Second, input validation
2.1There are two ways to explain input validation here:
1Rewrite the Validate method or create a custom ValidateXxx method (where Xxx is a name defined by yourself, this method will be executed first, followed by the Validate method)
2Create a new xml for validation
2.2Rewrite the Validate method
In the MVC framework, there will be a standardized data validation part provided, Struts2Here we provide a Validate method, by rewriting the Validate method we can perform input validation, but there are two points to know when rewriting the Validate method:1Validate method will be executed before the execute method;2Validate method will execute validation rules for all Actions, in order to distinguish a certain Action, we can use ValidateXxx method.
Note: The following example is an example of using local type conversion and input validation together.
A simple registration verification example:
Create an entity class User:
User
Create a view: Register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8> <title>Register User</title> </head> <body> <h2>Validate using the validateXXX() method</h2> <form action="register_test"> User: <input type="text" name="user"><br/> Password: <input type="password" name="user"><br/> Password: <input type="password" name="user"><br/> <input type="submit" value="Submit"> </form> </body> </html>
Create a RegisterAction class that inherits from ActionSupport
package com.validatexxx; import com.opensymphony.xwork2.ActionSupport; //Rewrite the validate() and validateXXX specified methods for verification /* * In the struts.xml configuration, the method method is set to test(), the ValidateTest() method will be called first * Then the validate method is called * After the test method is called * */ public class RegisterAction extends ActionSupport { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } //2 @Override public void validate(){ System.out.println("Überladene Validate-Methode"); if (null == user.getPassword() || "".equals(user.getPassword()) || null == user.getRepassword() || "".equals(user.getRepassword())) { this.addFieldError("repassword", "repassword should be same password"); return; } if (!user.getPassword().equals(user.getRepassword())) { //Wenn Daten im FieldError existieren, springt der Server automatisch zu der logischen Ansicht input this.addFieldError("repassword", "repassword should be same password"); } } //1 public void validateTest(){ System.out.println("Benutzerdefinierte Validierungsmethode: ValidateTest"); } //3 public String test(){ System.out.println("test:Methode"); return SUCCESS; } }
Hinweis: Hier ist das Attribut User, daher müssen Sie den Namen des Parameters auf der JSP-Seite als den Namen des Beispiels user schreiben, und Sie müssen auch einen Typenkonverter erstellen, der eine mit Daten gefüllte Klasse zurückgibt
Erstellen Sie struts.xml und speichern Sie ihn im WEB-INF/classes/struts.xml
Hinweis: Hier muss das method das ValudateXxx() Methode sein, die Sie selbst definiert haben, der Autor hier ist test. Verwenden*falls nicht, struts2strict muss ebenfalls konfiguriert werden-method-invocation="false", angeblich weil die Version zu hoch ist, die Sicherheit wurde erhöht, daher muss sie hinzugefügt werden, um sie verwenden zu können*
Erstellen Sie die Klasse Usertypeconverter, die von StrutsTypeConverter erbt (erstellen Sie einen Typenkonverter)
package com.validatexxx; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; //Typkonvertierungsklasse public class Usertypeconverter extends StrutsTypeConverter { @Override public Object convertFromString(Map arg0, String[] arg1, Class arg2) { System.out.println("Usertypeconverter:类型转换!"); User user = new User(); user.setUsername(arg1[0]); user.setPassword(arg1[1]); user.setRepassword(arg1[2]); return user; } @Override public String convertToString(Map arg0, Object arg1) { User u = (User)arg1; return u.getUsername();+"!"; } }
Hinweis: Nach der Erstellung des Typkonverters muss noch eine RegisterAction erstellt werden-conversion.properties, im gleichen Verzeichnis abgelegt
Der Inhalt der Datei ist:
Vorher ist der Attributname in RegisterAction, dahinter ist der spezifische Pfad des Typkonverters.
Neue Erfolgsansicht: success.jsp
success.jsp
Neue Fehleransicht: input.jsp
input.jsp
Der Erfolgseffekt der Codeausführung ist wie folgt:
Register.jsp-Seite
Die erfolgreich umgeleitete Seite ist: success.jsp
Konsolen-Testergebnis:
Die Daten werden zu Usertypeconverter für die Typkonvertierung weitergeleitet, dann zu RegisterAction, um die Methode ValidateTest() auszuführen, Validate und test, dann wird SUCCESS zurückgegeben und die Ansicht des results ausgeführt.
Wir schauen uns die Reihenfolge des Codeausführungsfehlers an:
Register.jsp-Seite
input.jsp-Seite
Konsolen-Testeffekt:
In der Methode Validate gibt der Autor folgendes Code: this.addFieldError(), wie bereits erwähnt wurde, wird der Server uns automatisch zu der Fehleransicht weiterleiten, wenn ein Fehler hinzugefügt wird. Es wird input zurückgegeben, und input ist in struts.xml konfiguriert, daher wird zur input.jsp-Ansicht zurückgegangen.
2.3、新建xml进行输入验证
Erstellen Sie die Ansicht: Test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8> <title>XML-Validierung</title> </head> <body> <s:form action="empinfo" method="post"> <s:textfield name="name" label="Name" size="20" /> <s:textfield name="age" label="Age" size="20" /> <s:submit name="submit" label="Submit" align="center" /> </s:form> </body> </html>
Erstellen Sie eine neue Klasse Employee, die ActionSupport erweitert
Diese Klasse verwendet sowohl die Methode Validate überschreiben als auch die Xml-Konfiguration, wir können eine davon auswählen, um zu überprüfen
package com.validatexxx; import com.opensymphony.xwork2.ActionSupport; //Verwenden Sie die Methode validate() zur Überprüfung, dies ist eine Serverseitige Überprüfung! public class Employee extends ActionSupport { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //第二步再执行该方法 public String execute(){ System.out.println("execute:"+this.age); return SUCCESS; } /* 使用服务端的校验:重写validate方法(); //第一步先执行该方法 //重写validate方法有缺陷:每次都会使用validate方法验证,造成极大的资源浪费。 public void validate(){ System.out.println("validate"); if (name == null || name.trim().equals("")) { //当往该方法添加数据的时候,服务器会返回input,之后跳转到input.jsp页面中。 addFieldError("name","The name is required"); } if (age < 28 || age > 65) { addFieldError("age","Age must be in between 28 und 65"); } } */ }
在Struts.xml中进行配置:
这里的success.jsp和input.jsp还是使用上面的。
之后我们需要新建Employee-validation.xml,路径放在与Employee同级目录下,注意:-validation.xml是固定不变的
内容为:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> <field name="name"> <field-validator type="required"> <message> The name is required. </message> </field-validator> </field> <field name="age"> <field-validator type="int"> <param name="min">29</param> <param name="max">64</param> <message> Das Alter muss zwischen 28 und 65 </message> </field-validator> </field> </validators>
Wichtig: Die.dtd-Beschränkung dieses Dokuments muss vorhanden sein, andernfalls wird ein Fehler zurückgegeben:
FEHLER DefaultDispatcherErrorHandler Es ist während der Verarbeitung der Anfrage ein Ausnahmevorgang aufgetreten: [Verbindungszeitüberschreitung: verbinden - [Unbekannte Position], null]
Nun verwenden wirhttp://localhost:8080/LearStruts2/ValidateJSP/Test.jspzugreifen.
Test erfolgreich:
Test.jsp Oberfläche:
success.jsp
Fehlgeschlagener Testbeispiel:
input.jsp Oberfläche:
Die Beispielanweisung ist korrekt.
Tatsächlich in Struts2Es gibt mehrere integrierte Validierer: Erforderliche Validierung, Erforderliche Zeichenfolgenvalidierung, Ganzzahlnvalidierung, Datumsvalidierung, Ausdrucksvalidierung, Zeichenlängevalidierung, regulärer Ausdrucksvalidierung und so weiter. Wenn erforderlich, werde ich diese alle nacheinander erläutern.
Hier ist eine Einführung in Struts, die ich Ihnen von den Redakteuren vorgestellt habe2Detaillierte Erklärung der Datenvalidierung: Ich hoffe, dies hilft Ihnen weiter. Wenn Sie Fragen haben, hinterlassen Sie bitte einen Kommentar, und ich werde schnell antworten. Ich möchte auch allen danken, die die Unterstützung der Anleitung website gewährt haben!
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetnutzern selbstständig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie verdächtige urheberrechtliche Inhalte entdecken, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @ beim Senden einer E-Mail, um eine Beschwerde einzureichen und relevante Beweise bereitzustellen. Sobald die Beschwerde bestätigt wird, wird diese Website den verdächtigen Inhalten sofort löschen.)