Avatar billede zorci Nybegynder
02. maj 2003 - 18:20 Der er 23 kommentarer og
1 løsning

Rendering af JSP-sider

Hej.

Jeg vil gerne udsende en stribe HTML formatterede emails. Disse emails skal blive til på baggrund af en jsp-side i samspil med javaobjekter, primært lister med data.

Mit problem er at finde noget funktionalitet til at gøre det. I princippet har jeg brug for noget der kan sige:

String myHTML = JSP_Parsing.parseJspPage("urlToPage", objectWithData);

Således at den rendering som eksempelvis Tomcat laver når den spytter HTML ud på baggrund af en JSP-side, i stedet kommer tilbage til mig som en String, jeg så selv kan bruge i min email.

Jeg er klar over at det sikkert ikke er så simpelt som jeg her skitserer, men det er også mere for at anskueliggøre det jeg er ude på.

Jeg har ledt og ledt på Nettet for at finde eksempler, men har ikke rigtig kunnet finde noget....
Avatar billede arne_v Ekspert
02. maj 2003 - 18:25 #1
Der er flere mulige løsninger.

Jeg tror at den nemmeste er at, du henter en JSP siden med HttpURLConnection,
læse svaret og sende det i emailen.
Avatar billede zorci Nybegynder
02. maj 2003 - 18:27 #2
Har du mulighed for at uddybe? Eventuelt med et kort eksempel?
Avatar billede arne_v Ekspert
02. maj 2003 - 18:28 #3
Lyder det en brugbar løsning ?

Har du brig for kode eksempler til HttpURLConnection eller til at sende
HTML email ?
Avatar billede arne_v Ekspert
02. maj 2003 - 18:28 #4
Ja - jeg kan godt lave et eksempel.
Avatar billede zorci Nybegynder
02. maj 2003 - 18:38 #5
Email kan jeg godt sende. Det er mere den generering ved hjælp af JSP-sider som jeg gerne vil kunne lave.
Avatar billede arne_v Ekspert
02. maj 2003 - 18:42 #6
Følgende eksempel henter http://www.eksperten.dk/ og email den:

import java.util.*;
import java.net.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;

public class GetJSPandSendEmail {
    public static void main(String[] args) {
        try {
          StringBuffer sb = new StringBuffer("");
          URL url = new URL("http://www.eksperten.dk/");
          HttpURLConnection con = (HttpURLConnection)url.openConnection();
          con.connect();
          if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
              InputStream is = con.getInputStream();
              byte[] b = new byte[1000];
              int n;
              while((n = is.read(b)) >= 0) {
                sb.append(new String(b,0,n));
              }
              is.close();
          }
          con.disconnect();
          Properties props = System.getProperties();
          props.put("mail.smtp.host", "192.168.1.10");
          Session session = Session.getDefaultInstance(props, null);
          MimeMessage message = new MimeMessage(session);
          message.setFrom(new InternetAddress("arne@xxxxxx.dk"));
          message.addRecipient(Message.RecipientType.TO, new InternetAddress("arne@xxxxxx.dk"));
          message.setSubject("Test");
          message.setContent(sb.toString(),"text/html");
          Transport.send(message);
        } catch (MalformedURLException e) {
          e.printStackTrace();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (AddressException e) {
            e.printStackTrace();
      } catch (MessagingException e) {
          e.printStackTrace();
      }
    }
}
Avatar billede arne_v Ekspert
02. maj 2003 - 18:43 #7
Du kan hente en vilkårlig side på den måde inkl. den JSP side
du skal have fat i.

Og det er nemt.
Avatar billede arne_v Ekspert
02. maj 2003 - 18:45 #8
Hvis performance er ekstremt vigtigt kan du jo prøve at compile
en JSP side til en servlet og kalde service metode med
nogle fake argumenter der implementerer de rigtige interfaces.

Men der betyder altså en del mere arbejde !
Avatar billede zorci Nybegynder
02. maj 2003 - 19:04 #9
Interessant. Måske skal du have hele historien med.

Fakta er, at jeg om natten skal generere en masse mails baseret på brugeres indstillinger. Således ligger min javamaskine inde med disse data og skal have på baggrund af dem have genereret noget HTML output. Men hmm, jeg kan måske sende dette data med som parametre til den side jeg henter på den måde du skitserer. Eller?
Avatar billede arne_v Ekspert
02. maj 2003 - 19:09 #10
Det kan du sagtens.

Hvis URL'en hedder:
  http://localhost:8080/appnavn/side.jsp?f1=abc&f2=xyz
så vil request.getParameter("f1") og request.getParameter("f2")
returnere henholdsvis "abc" og "xyz".

(ligesom en submit af form med 2 felter)
Avatar billede arne_v Ekspert
02. maj 2003 - 19:10 #11
Alternativt kan du hvis de pågældende data ligger i en database
lade din JSP side læse direkte fra databasen.

Der er mange muligheder.
Avatar billede arne_v Ekspert
02. maj 2003 - 19:11 #12
En helt anden tilgangs-vinkel.

Har du overvejet noget simplere end JSP f.eks. noget
template baseret ?
Avatar billede zorci Nybegynder
02. maj 2003 - 19:18 #13
Egentlig lyder det brugbart det du siger. Jeg har bare nogle ArrayList'er som indeholder objekter med data som brugeren skal have listet i emailen. Det vil være lidt voldsomt at sende som en del af URL'en.

Nej, jeg har ikke overvejet noget template baseret?
Avatar billede arne_v Ekspert
02. maj 2003 - 19:21 #14
Hvor kommer de array-lister fra ?

Hvis de læses fra databsen, så kan du jo lade JSP siden selv læse dem
op af databasen i.s.f. at lade mail sende programmet læse dem op
og sende til JSP siden.
Avatar billede zorci Nybegynder
02. maj 2003 - 19:55 #15
Ja, jeg har sådan en statistikklasse, og en timer. Når timeren når et bestemt tidspunkt på døgnet, beder den statistikklassen finde alle de statistikker der skal køres. Dem tager vi en efter en og for hver finder vi de brugere der skal have statistik af den pågældende type. Statistikken køres, og alt efter hvad det er for en type statistik, får vi en del data fra databasen som laves til lister af den pågældende type.
  Alt efter typen af statistik ville jeg lave en jsp-side som kunne "vise" den data der kom ud af den enkelte statistik. Den skulle bare ikke vise det i en browser, men returnere det genererede HTML til mig, så jeg kunne sende det som en HTML-mail.

Til hver en tid ville jeg jo kunne putte data i session eller request og returnere det til jsp-siden som normalt. Men sådan kan jeg jo ikke gøre.

Jeg tror dog din idé er god, selv om jeg på den måde kalder min egen server, men jeg er ikke så tryg ved at lægge databasekald ind på en JSP-side. Har heller aldrig prøvet det. Jeg ville egentlig hellere gøre objekterne tilgængelig for siden, og så benytte mig af din idé.
Avatar billede zorci Nybegynder
02. maj 2003 - 19:56 #16
I øvrigt. Mange tak fordi du er så kvik (hurtig) til at svare på mine spørgsmål.
Avatar billede zorci Nybegynder
02. maj 2003 - 20:16 #17
Ved nærmere eftertanke, så vil antallet af emails nok være for stort til denne løsning med HttpURLConnection. Serveren vil komme på overarbejde med alle de kald...
  Men det var faktisk rigtig godt tænkt.
Avatar billede arne_v Ekspert
02. maj 2003 - 20:19 #18
Det lyder meget som om at enten:
  noget template baseret
eller
  noget XML + XSLT
måske var mere hensigtsmæssigt end JSP.
Avatar billede arne_v Ekspert
02. maj 2003 - 20:20 #19
Nu er JSP altså ikke så ringe.

Lad os sige at din server kan vise 100 sider/sekund, så er det 6000 sider/minut.

Det er trods alt en del.
Avatar billede arne_v Ekspert
02. maj 2003 - 20:21 #20
Det er rimeligt nemt at bruge XSLT til at konvertere noget
XML data til HTML med fra et Java program.
Avatar billede zorci Nybegynder
02. maj 2003 - 20:22 #21
Så man kan altså ikke sige:

Lav et objekt af typen JSP_Side.
Og til det objekt sige: Tag denne JSP-side og den her data. Render og returner HTML-resultat til mig som en String.
Avatar billede arne_v Ekspert
02. maj 2003 - 20:25 #22
Jo men så skal du compiler JSP siden med JSPC og kalde dens
service metode med nogle kompatible argumenter.

Det kan godt lade sig gøre. Men det vil kræve en del
kode. Fordi det er ikke en måde JSP er beregnet til
at blivebrugt.
Avatar billede zorci Nybegynder
02. maj 2003 - 20:26 #23
Ja, jeg kender XML og XSLT.

Jeg vil bare så gerne benytte JSP-sider da hele sitet er bygget sådan op. Og flere af de eksisterende sider kan omskrives ganske lidt og derefter fungere som statistiksider.

Men det kan være jeg skal prøve at implementere din idé. Jeg vil tænke lidt over det i aften. Hvis ikke en anden kommer med en løsning som den jeg skitserer får du alle 200 point. OK?
Avatar billede arne_v Ekspert
02. maj 2003 - 20:32 #24
OK.

En JSP side bliver compilet til noget der indeholder en metode:

public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

Og det du skal gøre er at lave to objekter som implementerer
interfacene HttpServletRequest og HttpServletResponse tilstrækkeligt
til at du kan kalde metoden med dem.
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