Hur skriver man i java för att verifiera ifall en emailadress, resp. httpadress är korrekt? Att beräkna vanliga textfält är ju egentligen bara att köra et <> av nåt slag.
Andreas
20 svar · 624 visningar · startad av AG
Hur skriver man i java för att verifiera ifall en emailadress, resp. httpadress är korrekt? Att beräkna vanliga textfält är ju egentligen bara att köra et <> av nåt slag.
Andreas
Regular Expressions? Fungerar iofs endast i J2 v.4, men ändå. :)
Annars kanske funktioner som charAt() funkar?
Bara ett problem. :)
Jag är inte familjär med några av dessa uttryck, nån som har tid, ork och lust att skriva ner några rader som verifierar, typ räcker med att e-mailadresser måste innehålla "." och "@" medans http-adresser måste innehålla "." och "http://"
Andreas
Här är ett kodexempel:
/*
* Checks for invalid characters
* in email addresses
*/
public class EmailValidation {
public static void main(String[] args)
throws Exception {
String input = "@sun.com";
//Checks for email addresses starting with
//inappropriate symbols like dots or @ signs.
Pattern p = Pattern.compile("^\\.|^\\@");
Matcher m = p.matcher(input);
if (m.find())
System.err.println("Email addresses don't start" +
" with dots or @ signs.");
//Checks for email addresses that start with
//www. and prints a message if it does.
p = Pattern.compile("^www\\.");
m = p.matcher(input);
if (m.find()) {
System.out.println("Email addresses don't start" +
" with \"www.\", only web pages do.");
}
p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");
m = p.matcher(input);
StringBuffer sb = new StringBuffer();
boolean result = m.find();
boolean deletedIllegalChars = false;
while(result) {
deletedIllegalChars = true;
m.appendReplacement(sb, "");
result = m.find();
}
// Add the last segment of input to the new String
m.appendTail(sb);
input = sb.toString();
if (deletedIllegalChars) {
System.out.println("It contained incorrect characters" +
" , such as spaces or commas.");
}
}
}
Hämtad härifrån, där du kan läsa det mesta om reg exp och java:
http://developer.java.sun.com/developer/technicalArticles/releases/1.4regex/
"." och "@" medans http-adresser måste innehålla "." och "http://"
Om du vill köra en fulare och enklare variant än den med regexpar som Jörgen visar ovan kan du använda indexOf-metoden i Strängklassen för att kontrollera att strängen innehåller de rätta prylarna:
if (email.indexOf(".") > -1 && email.indexOf("@") > -1) {
// valid
}
etc..
Men som sagt, det blir bättre och snyggare med reguljära uttryck.
Oki man får tacka.
Hittade ett program som verifierade e-mailadresserna väldigt avancerat. En uppkoppling skedde och aktuuell domän verifierades, man kunde även spärra vissa domäner, typ gratisställen.
Är det även möjligt att i Sgtpeppers exempel göra en verifiering av kända tecken. Eller är det att försöka bygga in följande snutt?
p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");
m = p.matcher(input);
Andreas
Någon som förstår varför jag får följande error på Jörgens kod.
C:\ANDREAS\RESIN\doc\WEB-INF\classes\EmailValidation.java:8: cannot resolve symbol
symbol : class Pattern
location: class EmailValidation
Pattern p = Pattern.compile("^\\.|^\\@");
^
C:\ANDREAS\RESIN\doc\WEB-INF\classes\EmailValidation.java:8: cannot resolve symbol
symbol : variable Pattern
location: class EmailValidation
Pattern p = Pattern.compile("^\\.|^\\@");
^
C:\ANDREAS\RESIN\doc\WEB-INF\classes\EmailValidation.java:9: cannot resolve symbol
symbol : class Matcher
location: class EmailValidation
Matcher m = p.matcher(input);
^
C:\ANDREAS\RESIN\doc\WEB-INF\classes\EmailValidation.java:15: cannot resolve symbol
symbol : variable Pattern
location: class EmailValidation
p = Pattern.compile("^www\\.");
^
C:\ANDREAS\RESIN\doc\WEB-INF\classes\EmailValidation.java:21: cannot resolve symbol
symbol : variable Pattern
location: class EmailValidation
p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");
^
5 errors
Andreas
Hur menar du då Spin?
Jag har testat att lägga till import javax.utilx eller vad det nu var i ".java filen" Har även installerat senaste J2SE (1,4)
Andreas
Har du även lagt till Java 1.4 libbet i classpathen i Resin?
Det kan vara så att Resin fortfarande använder sig av 1.3.x. Jag fick exakt det där felet med Apache-servern för att jag inte pekat om var JAVA_HOME var.
/Lime
Nu får ja plötsligt felet:
500 Servlet Exception
java.lang.ClassCastException: EmailValidation
at com.caucho.server.http.Application.createServlet(Application.java:2036)
at com.caucho.server.http.Application.loadServlet(Application.java:2002)
at com.caucho.server.http.Application.getFilterChainServlet(Application.java:1864)
at com.caucho.server.http.Application.buildFilterChain(Application.java:1843)
at com.caucho.server.http.Invocation.service(Invocation.java:265)
at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:128)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:238)
at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:157)
at com.caucho.server.TcpConnection.run(TcpConnection.java:140)
at java.lang.Thread.run(Thread.java:536)
Lime skall inte classpathen peka mot bin och inte lib?
Andreas
Normalt så ligger libbarna i /lib och binärerna (java, javac, jar ...) i /bin
Var man har lagt sakerna brukar inte spela ngn roll.
Apache kollar var JAVA_HOME är deklarerad och den skall peka på rootkatalogen till javainstallationen. Om jag har installerat den i C:/jdk1.4/ så är det den katalogen som skall vara JAVA_HOME.
Jag vet inte hur Resin vill ha det, men får man "cannot resolve symbol" så beror det i 99% av fallen på att klassen inte hittas och då måste man peka ut den.
Att du får ett CCE betyder ju att något i allafall är uppe och snurrar. :-)
/Lime
Nu fås följande error:
javax.servlet.ServletException: `EmailValidation' must implement javax.servlet.Servlet.
All servlets must implement the Servlet interface.
at com.caucho.server.http.Application.instantiateServlet(Application.java:2896)
at com.caucho.server.http.Application.createServlet(Application.java:2802)
at com.caucho.server.http.Application.loadServlet(Application.java:2763)
at com.caucho.server.http.QServletConfig.loadServlet(QServletConfig.java:424)
at com.caucho.server.http.Application.getFilterChainServlet(Application.java:2522)
at com.caucho.server.http.Application.buildFilterChain(Application.java:2489)
at com.caucho.server.http.Invocation.service(Invocation.java:289)
at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:132)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:217)
at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:159)
at com.caucho.server.TcpConnection.run(TcpConnection.java:136)
at java.lang.Thread.run(Thread.java:536)
Hela koden är:
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.util.regex.*;
public class EmailValidation {
public static void main(String[] args)
throws Exception {
String input = "@sun.com";
//Checks for email addresses starting with
//inappropriate symbols like dots or @ signs.
Pattern p = Pattern.compile("^\\.|^\\@");
Matcher m = p.matcher(input);
if (m.find())
System.err.println("Email addresses don't start" +
" with dots or @ signs.");
//Checks for email addresses that start with
//www. and prints a message if it does.
p = Pattern.compile("^www\\.");
m = p.matcher(input);
if (m.find()) {
System.out.println("Email addresses don't start" +
" with \"www.\", only web pages do.");
}
p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");
m = p.matcher(input);
StringBuffer sb = new StringBuffer();
boolean result = m.find();
boolean deletedIllegalChars = false;
while(result) {
deletedIllegalChars = true;
m.appendReplacement(sb, "");
result = m.find();
}
// Add the last segment of input to the new String
m.appendTail(sb);
input = sb.toString();
if (deletedIllegalChars) {
System.out.println("It contained incorrect characters" +
" , such as spaces or commas.");
}
}
}
Andreas
Är det den enda klassen du använder som servlet? I så fall borde den ärva från HttpServlet och ha en doGet ()- eller doPost ()-metod, som kan ta emot data.
T.ex:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.regex.*;
class EmailValidation extends HttpServlet {
protected void doPost ( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException {
String input = req.getParameter ( "theUsersEmail" );
PrintWriter out = resp.getWriter ();
//Checks for email addresses starting with
//inappropriate symbols like dots or @ signs.
Pattern p = Pattern.compile("^\\.|^\\@");
Matcher m = p.matcher(input);
if (m.find()) {
out.println("Email addresses don't start" +
" with dots or @ signs.");
return;
}
//Checks for email addresses that start with
//www. and prints a message if it does.
p = Pattern.compile("^www\\.");
m = p.matcher(input);
if (m.find()) {
out.println("Email addresses don't start" +
" with \"www.\", only web pages do.");
return;
}
p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");
m = p.matcher(input);
StringBuffer sb = new StringBuffer();
boolean result = m.find();
boolean deletedIllegalChars = false;
while(result) {
deletedIllegalChars = true;
m.appendReplacement(sb, "");
result = m.find();
}
// Add the last segment of input to the new String
m.appendTail(sb);
input = sb.toString();
if (deletedIllegalChars) {
out.println("It contained incorrect characters" +
" , such as spaces or commas.");
return;
}
else {
out.println ( "Email OK" );
}
}
}
Sitter fortfarande fast med detta problem, senaste j2se och resin är installerade:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.regex.*;
public class EmailValidation extends HttpServlet {
protected void doPost ( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException {
String input = req.getParameter ( "theUsersEmail" );
PrintWriter out = resp.getWriter ();
//Checks for email addresses starting with
//inappropriate symbols like dots or @ signs.
Pattern p = Pattern.compile("^\\.|^\\@");
Matcher m = p.matcher(input);
if (m.find()) {
out.println("Email addresses don't start" +
" with dots or @ signs.");
return;
}
//Checks for email addresses that start with
//www. and prints a message if it does.
p = Pattern.compile("^www\\.");
m = p.matcher(input);
if (m.find()) {
out.println("Email addresses don't start" +
" with \"www.\", only web pages do.");
return;
}
p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");
m = p.matcher(input);
StringBuffer sb = new StringBuffer();
boolean result = m.find();
boolean deletedIllegalChars = false;
while(result) {
deletedIllegalChars = true;
m.appendReplacement(sb, "");
result = m.find();
}
// Add the last segment of input to the new String
m.appendTail(sb);
input = sb.toString();
if (deletedIllegalChars) {
out.println("It contained incorrect characters" +
" , such as spaces or commas.");
return;
}
else {
out.println ( "Email OK" );
}
}
}
Felmeddelande:
405 GET not supported
Resin 2.1.0 (built Tue Mar 26 14:12:50 PST 2002)
Andreas
Det borde bero på att du inte överskuggat doGet utan bara doPost.
Eller sättet som data skickas till servlet:en väl? Skickas den via GET ska metoden heta doGet (), skickas den via POST ska den heta doPost (), så felmeddelandet kommer kanske från att du försöker skicka data via GET till servlet:en som bara tar emot via POST?
Nu fungerar det smärtfritt.
En annan sak jag fudnerar över är, har en webbserver, tex resin en inbyggd javamotor, elelr förlitar den sig helt på vilket Java development kit som är installerat?
Hoppas nån förstod vad jag menade :)
Andraes
Jag är inte säker på hur Resin fungerar, men oftast brukar webservers ( Skrivna i Java, så klart ) använda sig av en installerad JRE på burken. :)
Därför är det jdk verisionen som bestämmer ifall jag kan arbeta med reg.exp på servern, eller?
Andreas