[java] string trim en substring probleem *

Pagina: 1
Acties:

  • Deathchant
  • Registratie: September 2003
  • Laatst online: 22-05 16:51

Deathchant

Don't intend. Do!

Topicstarter
hallo mensen

ik heb een jsp tje (fileSearch.jsp) met daarop een input type="file".

in dit veldje komt een bestandje bijvoorbeeld C:\test.doc.

Nu wil ik deze string testen op .doc. Indien deze niet ".doc" als laatste 4 karakters heeft, dat ie dan een error geeft.

ik werk overigens met strutsframework en heb deze code in mijn form bean:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
{
      ActionErrors errors=new ActionErrors();

      // haal de spaties aan het begin en aan het eind weg
      fileLocation.trim();
      
      //sla de lengte van de string op
      int lengte=fileLocation.length();
      
      //begin vanaf dit punt te checken  
      int zoekpositie=(lengte-3);      

      
      if (lengte < 4 || (fileLocation==null || fileLocation.equals(""))){         
             errors.add("nofile",new ActionError("error.nofile"));                    
      } 
      else{          
          if (fileLocation.substring(zoekpositie) != ".doc" || fileLocation.substring(zoekpositie) != ".pdf"){
              errors.add("invalidextension",new ActionError("error.invalidextension"));
          }
      }
      return errors;
  }
}


stel ik heb "gegevens.doc" als string. Dan wil ik de substring controleren of deze gelijk is aan ".doc".

Als ik minder dan 4 spaties invul, doet hij het.
Als ik meer dan 4 spaties invul geeft hij de error "invalid extension"
Als ik meer dan 4 karakters met op het einde .doc invul geeft hij ook deze error

Weet iemand waar de bug zit?

.modbreak: zet javacode tussen [code=java]...[/code] tags :)

[ Voor 9% gewijzigd door .oisyn op 02-04-2004 18:11 ]

Canon: EOS R6 | EF 16-35/4L IS USM | EF 70-200/2.8L IS II USM
Zeiss: 35/2 Distagon | 50/2 Makro-Planar | 85/1.4 Planar | 100/2 Makro-Planar | 135/2 Apo Sonnar


  • nxt
  • Registratie: November 2001
  • Laatst online: 04-02 09:36

nxt

gokje
int zoekpositie=(lengte-3);
- je checkt de laatste 3 characters en wilt de laatste 4 controleren?
if (fileLocation.substring(zoekpositie) != ".doc"
- strings moet je vergelijken met de .equals(..) of de .equalsIgnoreCase(..) method
en niet met ==

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

1) code tags gebruiken [ code ] [ /code] (zonder spaties)
2) probleemgebied zo klein mogelijk maken. Dit heeft niets met struts/jsp te maken maar is gewoon core java.
3) maak een variable aan waarin de extensie staat en druk die af. Je kan dan zien wat je fout doet, je krijgt beter te zien wat je bedoelt (een goed genoemde variable is helderderder dan een berekening). En je het is ook onnodig om die berekening iedere keer opnieuw te maken. Afgezien van onnodige traagheid is de onderhoudbaarheid ook bagger.

  • ahriman
  • Registratie: Januari 2002
  • Laatst online: 29-03 16:03
De trim() fuctie returned de getrimde string, hij veranders de string niet, dus:

code:
1
fileLocation = fileLocation.trim();

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 26-05 15:05
waarom maak je geen gebruik van het Validator framework (zit bij struts zelf)?

dan kan je gewoon via req expressie de invoer in je form controleren

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

"Beauty is the ultimate defence against complexity." David Gelernter


  • Deathchant
  • Registratie: September 2003
  • Laatst online: 22-05 16:51

Deathchant

Don't intend. Do!

Topicstarter
Iedereen bedankt voor zijn posts.
ik zal voortaan me "beter" aan de regels houden. Die fileLocation=fileLocation.trim() was ik vergeten :). Ik ga eens proberen.

Je zegt dat ik anders de variabele naar het scherm moet schrijven, maar ik maak deze controle in de actionform onder de action errors validate methode. ik heb al vaker geprobeerd met system.out.println een variabele naar het scherm te schrijven, maar laat niks zien

[ Voor 48% gewijzigd door Deathchant op 05-04-2004 08:48 ]

Canon: EOS R6 | EF 16-35/4L IS USM | EF 70-200/2.8L IS II USM
Zeiss: 35/2 Distagon | 50/2 Makro-Planar | 85/1.4 Planar | 100/2 Makro-Planar | 135/2 Apo Sonnar


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 26-05 00:01

Janoz

Moderator Devschuur®

!litemod

Deathchant schreef op 05 april 2004 @ 08:45:
Iedereen bedankt voor zijn posts.
ik zal voortaan me "beter" aan de regels houden. Die fileLocation=fileLocation.trim() was ik vergeten :). Ik ga eens proberen.

Je zegt dat ik anders de variabele naar het scherm moet schrijven, maar ik maak deze controle in de actionform onder de action errors validate methode. ik heb al vaker geprobeerd met system.out.println een variabele naar het scherm te schrijven, maar laat niks zien
Kijk daarvoor eens naar log4j. Daarnaast zou System.out.println ook moeten werken, maar waar dit is te lezen hangt af van de gebruikte applicatie server. Over het algemeen zijn er wel log bestanden te vinden waarin de stdout en stderror worden weggeschreven.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Deathchant
  • Registratie: September 2003
  • Laatst online: 22-05 16:51

Deathchant

Don't intend. Do!

Topicstarter
ik heb dus nu de code zo gedaan

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
      ActionErrors errors=new ActionErrors();
      fileLocation=fileLocation.trim();   
      String ext1=".doc";
      String ext2=".pdf";

      // doet het nu wel
      System.out.println(fileLocation);
      
      if(fileLocation==null || fileLocation.equals("")){         
             errors.add("nofile",new ActionError("error.nofile"));                    
      }            
      else{
          if (!fileLocation.endsWith(ext1) || !fileLocation.endsWith(ext2)){
              errors.add("invalidextension",new ActionError("error.invalidextension"));
          }
      }
      return errors;  
  }
}


werkt nog steeds niet. Hij doet me wel de goeie fout returnen als ik niks of alleen spaties invul, maar de controle op ".doc" en ".pdf" doet het nog niet.

Ik krijg trouwens bij System out println nu wel altijd de goeie string, dus het zal aan de if statements liggen

Bovendien krijg ik het debuggen in Oracle10g JDeveloper maar niet aan de gang.

[ Voor 30% gewijzigd door Deathchant op 05-04-2004 09:26 ]

Canon: EOS R6 | EF 16-35/4L IS USM | EF 70-200/2.8L IS II USM
Zeiss: 35/2 Distagon | 50/2 Makro-Planar | 85/1.4 Planar | 100/2 Makro-Planar | 135/2 Apo Sonnar


Verwijderd

Java:
1
2
3
4
5
      else{
          if (!fileLocation.endsWith(ext1) || !fileLocation.endsWith(ext2)){
              errors.add("invalidextension",new ActionError("error.invalidextension"));
          }
      }


Zit hier niet een logische fout? Als je fileLocation eindigt op .doc, eindigt hij niet op .pdf en andersom. Het IF statement levert dus altijd true op en er zal altijd een error gegenereerd worden. Ik denk dat je de || in && moet veranderen.

toch?

[ Voor 7% gewijzigd door Verwijderd op 05-04-2004 09:32 ]


  • Deathchant
  • Registratie: September 2003
  • Laatst online: 22-05 16:51

Deathchant

Don't intend. Do!

Topicstarter
je hebt volledig gelijk, was ik zojuist achter gekomen.

levert altijd true idd.

hier is de oplossing:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
      ActionErrors errors=new ActionErrors();
      fileLocation=fileLocation.trim();   
      String ext1=".doc";
      String ext2=".pdf";
      int lengte=fileLocation.length();
      
      if(fileLocation==null || fileLocation.equals("") || lengte <= 4){         
             errors.add("nofile",new ActionError("error.nofile"));                    
      }            
      else{
          if (!fileLocation.endsWith(ext1) && !fileLocation.endsWith(ext2)){
              System.out.println("Failure! "+fileLocation+" eindigt NIET op .doc of .pdf");
              errors.add("invalidextension",new ActionError("error.invalidextension"));          
          }
          else{
              System.out.println("Succes! "+fileLocation+" eindigt WEL op doc of pdf");
          }
      }               
      return errors;  
  }

Canon: EOS R6 | EF 16-35/4L IS USM | EF 70-200/2.8L IS II USM
Zeiss: 35/2 Distagon | 50/2 Makro-Planar | 85/1.4 Planar | 100/2 Makro-Planar | 135/2 Apo Sonnar


  • Deathchant
  • Registratie: September 2003
  • Laatst online: 22-05 16:51

Deathchant

Don't intend. Do!

Topicstarter
nu heb ik alleen vanalles getest, maar ik moet nu de file ook echt gaan uploaden.

nou zit ik met een andere programmeur hier en die levert de connectie met de database dmv EJB. Hij zegt: vertel me maar wat je nodig hebt..........dan zorg ik wel voor de afhandeling van de request op mijn EJB en krijgt de info die je nodig hebt.

Nou is er al een ander programma hier aanwezig (volledig op oracle gebaseerd) die al een standaard procedure PL/SQL heeft om een document te uploaden (dus op te slaan in de database). Dus misschien dat ik deze pl/sql functie kan gebruiken

Kan iemand mij misschien vertellen welke dingen hieronder ontbreken voor een goeie afhandeling van het uploaden van een doc of pdf bestand?

Ik moet mijn form doorsturen naar de EJB met:
- de tabel van de database waarin ik de file ga opslaan.
- de locatie van de file
- verwijzing naar upload method

[ Voor 4% gewijzigd door Deathchant op 05-04-2004 10:29 ]

Canon: EOS R6 | EF 16-35/4L IS USM | EF 70-200/2.8L IS II USM
Zeiss: 35/2 Distagon | 50/2 Makro-Planar | 85/1.4 Planar | 100/2 Makro-Planar | 135/2 Apo Sonnar

Pagina: 1