Avatar billede jarimark Nybegynder
04. oktober 2001 - 22:11 Der er 27 kommentarer og
1 løsning

Linebreak i database?

I mit utrættelige forsøg på at lave et velfungerende websted i jsp er jeg kommet til endnu et lille problem.

Når jeg skriver en tekst ind i en database, fra en detail page, gemmer den ikke linjeskiftende, medmindre jeg laver dem ved direkte at skrive < br >...

Jeg bruger gnujsp på min server...
Håber der er nogen der kan hjælpe...

/jarimark
Avatar billede lbhansen Nybegynder
04. oktober 2001 - 22:13 #1
hvis du indtaster data med linebreaks, og får dem ud igen. Så er der sikkert linebreaks, men browseren fortolker html, og der bliver \\n ikke fortolket som et linebreak, men det gør <br> til gengæld.
Avatar billede erikjacobsen Ekspert
04. oktober 2001 - 22:13 #2
Når du viser indholdet af databasen som HTML skal du lave
linieskiftene om til <br>.
Avatar billede jarimark Nybegynder
04. oktober 2001 - 22:16 #3
Okay, men hvordan får jeg så siden til at forstå at der skal være et linbreak? Det må vel være muligt eller hvad?
Avatar billede lbhansen Nybegynder
04. oktober 2001 - 22:19 #4
du har fat i det rigtige. Du skal selv erstatte \\n med <br> inden du hælder det ned i databasen, eller før du trækker det ud igen
Avatar billede jarimark Nybegynder
04. oktober 2001 - 22:22 #5
Ahh, men det virker nu ikke så nemt igen :)
Jeg er i hvert fald ret blank i forhold til hvordan det skal gøres...
Avatar billede erikjacobsen Ekspert
05. oktober 2001 - 00:27 #6
Skal du have kode til det? Her er en sjov
en med StringTokenizer:

public static String linebreakToHTML(String sMessageText)
      {
        /*
        In this example we have to parse the Messagetext because it comes from
        a textarea. A textarea may contain linebreaks which html will not make
        visible. So we replace every &quot;\\n&quot; with a &quot;&lt;br&gt;&quot;.
        */
        StringTokenizer oT = new StringTokenizer(sMessageText, \"\\n\");
        String sHTMLMessage = new String(\"\");
        while (oT.hasMoreTokens())
        {
          sHTMLMessage = sHTMLMessage.concat(oT.nextToken());
          sHTMLMessage = sHTMLMessage.concat(\"<br>\");
        }
        return sHTMLMessage;
      }
Avatar billede disky Nybegynder
05. oktober 2001 - 08:57 #7
erik: Dit eksempel er godt bortset fra en lille detalje som er dyr.

Brug ALDRIG en String på den måde du gør, det tager oceaner af tid. Når du hele tiden skal tilføje noget til en String brug \'StringBuffer\' istedet. En String er immutable.

Avatar billede erikjacobsen Ekspert
05. oktober 2001 - 11:48 #8
Det har du bestemt ret i - og vi har jo ovenikøbet en god idé om hvor stor
den (mindst) skal være, så de kan jo også allokeres med det samme.
Avatar billede disky Nybegynder
05. oktober 2001 - 12:17 #9
Lige netop.

Erik har du nogen erfaring med hvor hurtigt StringTokenizer er i forhold til f.eks. .indexOf() metoden ?

Jeg tænker på hvad der er hurtigt til dette problem.
Avatar billede erikjacobsen Ekspert
05. oktober 2001 - 13:10 #10
På et enkelt tegn har jeg ingen fornemmelse for det, men jeg vil da tro,
at hvis man propper flere tegn ind som skilletegn i en StringTokenizer, så
er den (lidt) hurtigere end hvad du ville kunne lave selv med indexOf-er.

I ovennævnte metode er det egentlig lidt \"overkill\" at lave resultatet som
en streng, der så skal skrives ud. Det burde være hurtigst at skrive den ud
direkte i while løkken. Hvis altså hastighed er vigtigst ;)
Avatar billede disky Nybegynder
05. oktober 2001 - 13:11 #11
helt enig.
Avatar billede jarimark Nybegynder
06. oktober 2001 - 11:49 #12
Okay, det var altså for besværligt at bruge String, men hvordan virker StringBuffer så?
Hvis det er det i kom frem til at I ville bruge istedet :)
Avatar billede disky Nybegynder
06. oktober 2001 - 16:54 #13
Det er ikke for besværligt at bruge en String, det tager bare længere tid rent afviklings mæssigt.

En StringBuffer bruger du sådanne her:

StringBuffer sBuf=new StringBuffer();

sBuf.append(\"Her er noget text\");
sBuf.append(\"Her er noget mere text);

String resultat=sBuf.toString();
Avatar billede disky Nybegynder
06. oktober 2001 - 16:55 #14
Her er den løsning jeg selv anvender til dit problem:

    public static String nl2br(String in)
    {
        StringBuffer out=new StringBuffer(in);
        int len=in.length();
        for(int x=0;x<len;x++)
        {
            if(out.charAt(x)==textCRLF)
            {
                out.replace(x,x+1,htmlCRLF);
                x+=4;
            }
        }
        return out.toString();
    }


p.s. kan sikkert tunes.
Avatar billede jarimark Nybegynder
07. oktober 2001 - 16:06 #15
disky:
Okay, men jeg mangler at finde ud af hvordan jeg tager teksten ud af databasen og derefter kører den gennem din løsning..

/jarimark
Avatar billede disky Nybegynder
07. oktober 2001 - 22:24 #16
Kan du ligge data i database ?

Så skal du bare bruge en

select * from TabelNavn where bla=bli

Hvor bla=kolonne navn  og bli lig med det du leder efter.
Avatar billede jarimark Nybegynder
08. oktober 2001 - 19:21 #17
Uha, nu begynder det at blive kompliceret. I hvert fald for mig.

Der er to steder jeg skal bruge dette, så måske vil det være mest praktisk at ændre det allerede når man gemmer tekste i databasen, kan man det?
Avatar billede disky Nybegynder
09. oktober 2001 - 08:29 #18
det kan du også sagtens.

så skal du bruge en update statement istedet.

Kender du dem ?
Avatar billede jarimark Nybegynder
09. oktober 2001 - 17:04 #19
Det kan jeg nok ikke helt prale af... :)
Avatar billede disky Nybegynder
10. oktober 2001 - 10:07 #20
update TABELNAVN set KOLONNENAVN=NYDATA where NOGET=NOGETANDET

Det i uppercase skal tilpasses din base
Avatar billede disky Nybegynder
24. oktober 2001 - 11:04 #21
jarimark:

Kan du ikke lukke spørgsmålet ?
Avatar billede jarimark Nybegynder
03. november 2001 - 20:41 #22
Jeg kan lukke det, men jeg ville gerne løse problemet. Det jeg ikke kan finde ud af lige nu er, hvordan jeg får teksten ud af databasen og ind i variablen nl2br. Hvordan gør jeg det?
Avatar billede disky Nybegynder
04. november 2001 - 15:59 #23
Fra din database får du et resultset, denne scanner du så igennem. Den text du vil have ud henter du fra resultset med rs.getString(\"KolonneNavn\");

Jeg forudsætter dit resultset hedder \'rs\' og du skal rette \'KolonneNavn\' så det passer med navnet på den kolonne hvori data ligger. Altså navnet i databasen.

Metoden getString() returnerer en String som du sender igennem den metode jeg har postet.
Avatar billede mf1616 Nybegynder
13. november 2001 - 09:51 #24
En anden enkelt mulighed var at pakke din tekst ind i et <pre>Tekst</pre>. Dette gør at browseren ved at teksten er formateret i forvejen, dvs. den respekterer linieskift og mellemrum.
Avatar billede jarimark Nybegynder
19. november 2001 - 19:04 #25
Jeg kan ikke få den til at udføre det du foreslår disky. Problemet er måske at den henter det på en speciel måde...

mf1616 jeg har prøvet det du foreslår, det virker, men der er et lille problem. Nu kan jeg ikke længere bestemme hvordan teksten skal være... I hvert fald ikke når jeg henter teksten, og jeg ved ikke hvordan jeg skal gemme den med en bestemt størrelse eller skrifte type...
Avatar billede disky Nybegynder
20. november 2001 - 08:38 #26
for at vi er helt sikre, lad os tage tingene fra bunden.

Hvad er dit problem på nuværende tidspunkt ?
Avatar billede jarimark Nybegynder
06. december 2001 - 09:38 #27
Jeg har endelig fundet en anden metode til at få det til at virke. Problem har nok været at jeg henter oplysninger osv. på en anden måde så det du har lavet har ikke virket på min side. Men jeg har bruget nget af det du har skrevet som udgangspunkt, så du får pointsene. Tak for hjælpen og undskyld at det har taget så lang tid, men det har været en utrolig besværlig proces...
Avatar billede disky Nybegynder
06. december 2001 - 09:42 #28
Det er bare helt okay, du sprøger bare her igen hvis det begynder at drille igen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester