# Automatisch JSP generieren?



## Phenix (29. Aug 2009)

Hallo an alle. Ich habe mal testweise ein Gästebuch geschrieben. Die Daten werden in einer DB gespeichert, bei bedarf ausgelesen und angezeigt. Nun passen immer höchstens 4 Einträge auf eine Seite, um weitere anzuzeigen müsste man automatisch eine JSP generieren lassen, einen Link hinzufügen und die Einträge anzeigen lassen. Hat jemand ne Ahnung ob und wie das Ganze in Java zu realisieren ist?

So wie hier im Forum halt, wenn mehr als eine bestimmte Anzahl an Beiträgen pro topic ist, wird ja auch automatisch eine zweite Seite eingefügt und die weiteren Einträge darauf angezeigt. Danke schonmal im Voraus.


----------



## Schandro (29. Aug 2009)

warum willst du dafür jeweils ne eigene JSP Datei erstellen?
Mach doch 1 JSP, die als Argument den Bereich an Einträgen bekommt die sie anzeigen soll. (z.b. 5 bis 8)


----------



## Phenix (30. Aug 2009)

Wie genau meinst du das? Sorry, versteh' nicht genau worauf du hinaus willst. Meinst du, ich soll in einer JSP immer nur sagen wir mal die letzten 4 Einträge anzeigen? Ginge natürlich, wäre aber nicht das, was ich beabsichtige.


----------



## Noctarius (30. Aug 2009)

Nein du übergibst dem JSP z.B. eine Seitennummer als Parameter (z.B. http://www.foo.bar/gb.jsp?page=3) und das JSP berechnet aus dieser Seitennummer Start- und Endindex der Seite (in SQL z.B. SELECT * FROM entries ORDER BY entryId DESC LIMIT [x * entrynumberPerPage + 1], entrynumberPerPage);  - wobei entrynumberPerPage durch die Anzahl gleichzeitig angezeigter Einträge und x durch die Seitennummer ersetzt werden müsste).


----------



## faulelotte (30. Aug 2009)

Noctarius hat gesagt.:


> (in SQL z.B. SELECT * FROM entries ORDER BY entryId DESC LIMIT [x * entrynumberPerPage + 1], entrynumberPerPage);



Das hat nur einen Haken. Wenn auf der ersten Seite 4 Einträge angezeigt werden. 
Ich auf die zweite Seite gehe und jemand in der Zwischenzeit einen Eintrag gemacht hat.
Dann sehe ich auf einmal den letzten Eintrag der ersten Seite als ersten Eintrag auf der zweiten Seite.
Besser wäre daher sich die Id's für die anzuzeigenden Beiträge am Stück zu besorgen und darin herumzuscrollen.


----------



## Noctarius (30. Aug 2009)

Ja und? Was ist daran so schlimm? 1. haben das "Problem" viele Seiten, 2. sehe ich dann direkt oh das ist was neues gekommen


----------



## faulelotte (30. Aug 2009)

Ok, mein Einwand war wahrscheinlich zu spekulativ. 
Kommt auf die Anforderungen der jeweiligen Anwendung an.


----------



## Phenix (30. Aug 2009)

Oh das mit den Argumenten habe ich auf diese Art und Weise noch nicht gemacht. Habt ihr denn da vielleicht ein Beispiel für mich?

An die Argumente komme ich doch mit der doGet- bzw. doPost-Methode in einem Servlet oder?!? Bin d grad etwas durcheinander. Vielleicht hilfts da, meinen code mal zu posten 

Seite Gästebuch:

```
<%--
    Document   : Members
    Created on : 17.08.2009, 00:43:36
    Author     : Phenix
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">


<%@page import="Utility.*" %>
   <%=PrintLayout.printHtmlTags()%>
   <%=PrintLayout.printLeftSide()%>

<div id="content">
    <div id="headline">Gästebuch</div><br><br>
<font>
    Hier könnt ihr etwas ins Gästebuch schreiben, wenn euch was auf dem Herzen liegt.
</font>
      <%=GBUtility.printEntries()%>




      <div style="position:absolute; top:610px; left:350px;">
            Neuen Eintrag einfügen:
            <form action="<%=Links.SERV_GB%>" method="post">
                <input type="text" name="gbAuthor" size="25" maxlength="25"> Name (max. 25 Zeichen) <br>
                <textarea cols="50" name="gbContent" rows="5">Hier Grüße hinterlassen (max. 300 Zeichen)</textarea><br>
                <input type="submit" value="Abschicken!" style="background-color:#000099; color:white; margin-left:10px;">
            </form>
            <br><font id="error"><%=ErrorBean.getSecureErrorText()%></font
      </div>
</div>
</html>
```


Die Klasse, die den Code zusammenfriemelt:

```
public static String printEntries() {
        String temp = "";
        if(gbGate.getNumberOfEntries()==0){
            return "Kein Gästebucheintrag vorhanden.";
        }
        else{
        for (int i = 1; i <= gbGate.getNumberOfEntries(); i++) {
            temp += "<div id=\"newsLine\"><u>"+gbGate.getGBEntryDate(i)+"</u><br><br>"+ gbGate.getGBEntry(i) + "<br><br><font color=\"yellow\">Verfasst von: "+gbGate.getGBEntryAuthor(i)+"</font></div>";
        }
        return temp;
    }}
```


Das Gateway mit den SQL-Statement für das rausholen aus der DB:

```
public String getGBEntry(int id){
        String query="SELECT GBCONTENT FROM GUESTBOOK WHERE GBID="+id;
        String line="";
        ResultSet result=null;

        try {

            result = stmt.executeQuery(query);
        } catch (SQLException ex) {
            Logger.getLogger(NewsGateway.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            while (result.next()) {
                line += result.getString("GBCONTENT");
            }
        } catch (SQLException ex) {
            Logger.getLogger(NewsGateway.class.getName()).log(Level.SEVERE, null, ex);
        }
        return line;
    }
```

So und die Seite Gästebuch soll dann quasi öfter existieren und jeweil 4 Beiträge anzeigen. Dazwischen is ja kein Servlet wo ich einen Parameter entgegen nehmen könnte. Oder bin ich da auf dem Holzweg?

Aber schonmal danke :toll:


----------



## Noctarius (30. Aug 2009)

```
<%--
    Document   : Members
    Created on : 17.08.2009, 00:43:36
    Author     : Phenix
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">


<%@page import="Utility.*" %>
<%
String param = request.getParameter("page");
int page = 0;
try {
    page = Integer.parseInt(param);
} catch(NumberFormatException e) {
    // ignore and use page 0 (entry 1 - 10 for example);
}
%>
   <%=PrintLayout.printHtmlTags()%>
   <%=PrintLayout.printLeftSide()%>

<div id="content">
    <div id="headline">Gästebuch</div><br><br>
<font>
    Hier könnt ihr etwas ins Gästebuch schreiben, wenn euch was auf dem Herzen liegt.
</font>
      <%=GBUtility.printEntries(page)%>




      <div style="position:absolute; top:610px; left:350px;">
            Neuen Eintrag einfügen:
            <form action="<%=Links.SERV_GB%>" method="post">
                <input type="text" name="gbAuthor" size="25" maxlength="25"> Name (max. 25 Zeichen) <br>
                <textarea cols="50" name="gbContent" rows="5">Hier Grüße hinterlassen (max. 300 Zeichen)</textarea><br>
                <input type="submit" value="Abschicken!" style="background-color:#000099; color:white; margin-left:10px;">
            </form>
            <br><font id="error"><%=ErrorBean.getSecureErrorText()%></font
      </div>
</div>
</html>
```


----------



## Phenix (31. Aug 2009)

oh vielen Dank, wieder was gelernt 

Eine weitere Frage hätte ich noch:

Wenn ich auf meinem Server (Tomcat) mein war-Archiv deploye klappt das alles wunderbar.Wenn ich jetzt aber eine Aktion ausführe, wofür ein Datenbankzugriff benötigt wird (ich habe dafür eine library eingebunden) bekomme ich folgende Meldung. Lokal passiert das aber nicht. Läuft da was bei der Erstellung der war-datei falsch? Wenn ich die library hinzufüge steht da immer ein relativer pfad: /web/ojdbc.jar. Allerdings habe ich mal im Archiv geguckt, da ist kein Ordner /web vorhanden. Muss ich den Pfad ändern und wenn ja, wo mache ich das? Steht der in einer xml-datei? Danke schonmal.


```
type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /Neuerungen.jsp at line 19

16: <div id="content">
17:     <div id="headline">News</div><br>
18: <font>
19:      <%=NewsUtility.printNews()%>
20: </font>
21: </div>
22: </body>


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:398)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:616)
	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
	java.security.AccessController.doPrivileged(Native Method)
	javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)

root cause

javax.servlet.ServletException: java.lang.ExceptionInInitializerError
	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:852)
	org.apache.jasper.runtime.PageContextImpl.access$1100(PageContextImpl.java:71)
	org.apache.jasper.runtime.PageContextImpl$12.run(PageContextImpl.java:768)
	java.security.AccessController.doPrivileged(Native Method)
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:766)
	org.apache.jsp.Neuerungen_jsp._jspService(Neuerungen_jsp.java:84)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:616)
	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
	java.security.AccessController.doPrivileged(Native Method)
	javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)
...
```


----------



## Phenix (1. Sep 2009)

Hat echt keiner ne Idee wo da der Fehler liegt?


----------

