Heiner Kücker

JSP Spreadsheet

Home

Java-Seite

 . Weiterentwicklung_Java

 . WebCam_Demo

 . JSP WorkFlow
 . PageFlow FlowControl
 . Page Flow Engine
 . Web Flow Engine
 . Control_and_Command

 . JSP_Spreadsheet

 . Kognitions-Maschine
 . semantisches Netz

 . Domain Parser

 . Codegenerator_für
 . hierarchische
 . Datenstrukturen

 . Expression_Engine
 . Formula_Parser

 . Thread Preprocessor

 . State Transition Engine

 . AspectJ

 . Java_Explorer

 . DBF_Library

 . Kalender_Applet

 . SetGetGen

 . BeanSetGet

 . CheckPackage

 . LineNumbers

 . GradDms

 . Excel-Export

 . StringTokenizer

 . JspDoc

 . JspCheck

 . JSP-Schulung
 . Java Server Pages
 . Struts

 . Ascii-Tabellen-
 . Layouter

 . Ascii-Baum-
 . Layouter

 . Ascii-Art-Fluss-
 . Diagramm-
 . Parser

 . AsciiArt
 . AssignmentMatrix
 . Layouter

 . StringSerial

 . Silbentrennung

 . JDBC_Schlüssel-
 . Generierung

 . bidirektional/
 . unidirektional
 . gelinkte Liste

 . Java_Sitemap
 . Generator

 . XmlBuilder

 . RangeMap

 . StringFormatter

 . VersionSafe
 . XCopy

 . JTextField

 . CommandLine-
 . ParamReader

 . Bitmap-Grafik

 . MultiMarkable-
 . Buffered-
 . InputStream

 . JavaCache

 . JdomUtil

 . CollectionUtil

 . XML Really
 . Pull Parser

 . Log-Filter

 . Remote-Protokoll

 . Sudoku-Generator

 . Delegation statt
 . Mehrfachvererbung

 . Disjunct
 . Interval Set

 . Constraint Class

 . Code Generator

Alaska-XBase++-Seite

Projekte

Philosophien
Techniken


Konzepte

Sudoku

Kontakt /
Impressum


Links

SiteMap





Letzte Aktualisierung:
02.12.2004
JSP Spreadsheet

Im Javamagazin 12.2004, Seite 83 ist ein Artikel über Tabellen in Struts.

Als Beispiel dient eine Tabelle mit Aktien, ein Depot.

Natürlich ist dies kein Spreadsheet im eigentlichen Sinne, den die Anzahl Spalten ist nicht variabel, aber der Autor hat es nun mal so genannt.

Name Anzahl Preis Gesamtwert
117,75
77,98
98,76
Summe     294,49


Dieses zugegebenermassen simple Beispiel will ich nun mit meinem CnC-Framework nachvollziehen. Der Link zum Download der Sourcen und des ausführbaren WAR-Files befindet sich am unteren Ende dieser Seite.

1. Schritt: web.xml

Eintragen des zentralen Servlets der Applikation, JspSpreadsheetServlet, sonst alles von CncDemo übernommen.
  <servlet>
    <servlet-name>cncaction</servlet-name>
    <servlet-class>de.jspspread.servlet.JspSpreadsheetServlet</servlet-class>


2. Schritt: JspSpreadsheetServlet.java

Festlegung Action-Package (für die Action-Methoden)
    public String getActionPackage()
    {
        return "de.jspspread.actions.";
    } // end method getActionPackagePrefix


Festlegung Default-Action-Methoden-Klasse
    public String getDefaultActionClassName()
    {
        return "JspSpreadsheetDefaultActions";
    } // end method getDefaultActionClassName


Festlegung Name der Applikation.
    public String getApplicationName()
    {
        return "JspSpreadsheet";
    }


Alle weiteren Optionen sind hier nicht von Bedeutung.

3. Schritt: AktieFormBean.java

Anlegen der FormBean. Die set- und get-Methoden erzeugt die IDE.
public final class AktieFormBean {

    private String name;

    private int anzahl;

    private double preis;
Dazu eine Methode für Wert je Position.
    /**
     * Für Ausgabe Gesamtpreis in der Liste .
     *
     * @return
     */
    public double getGesamt()
    {
        return anzahl * preis;
    }



4. Schritt: JspSpreadsheetDefaultActions.java

Kopieren der Klasse CncDemoDefaultActions auf JspSpreadsheetDefaultActions.

Umbenennen der alten FormBean in AktieFormBean durch Suchen + Ersetzen.

Vorbelegen der Werte als Demo für das Lesen von der Datenbank.
  public static String load(
      final int iPaIndex,
      final HttpServletRequest request,
      final HttpServletResponse response,
      final CncContext cncContext)
   {
    ArrayList arrList = new ArrayList();

    for (int i = 0; i < 4; i++) {
      AktieFormBean aktie = new AktieFormBean();

      aktie.setName("Aktie " + (i + 1));
      aktie.setPreis(i + 1);
      aktie.setAnzahl(i + 1);

      arrList.add(aktie);
    }// end for

    HttpSession session = request.getSession(true);

    session.setAttribute(SessionKeys.CNC_LIST_KEY, arrList);

    return null;
  }// end method load


Speichern nur als Demo.
  public static String save(
      final int iPaIndex,
      final HttpServletRequest request,
      final HttpServletResponse response, // --
      final CncContext cncContext)
  {
    CncUtil.setMessage(request, "Speichern in dieser Demoversion nicht möglich");
    return null;
  }// end method save


5. Schritt: jsp_spreadsheet.jsp

    <cnc:form/>
     <cnc:iterate>
      <tr>
       <td align="left">
        <cnc:listwrite property="name"/>
       </td>
       <td align="left">
        <cnc:input type="text" indexed="true" property="anzahl"/>
       </td>
       <td align="right">
        <cnc:input type="text" indexed="true" property="preis"/>
       </td>
       <td align="right">
        <cnc:listwrite property="gesamt"/>
       </td>
      </tr>
     </cnc:iterate>
     <tr>
      <td colspan="3">
       <cnc:button name="save" value="Speichern"/>
      </td>
     </tr>
     </form>


6. Schritt: welcome.jsp

Wird ohne wesentliche Änderungen übernommen.

7. Schritt: Fluss-Steuerdatei flow.cnc

procedure main()
{
  logon
  {
    // im Body der logon-Deklaration ist die User-Validierung ausgeschalten

    while ( true )
    {
      if ( session.CNC_LIST_KEY == null )
      {
        //Daten von Datenbank holen
        action( 'load' );
      }

      jsp( "/jsp_spreadsheet.jsp" );

      if ( cnc_button == 'save' )
      {
        action ( 'save' );
      }
    } // end while
  } // end logon
} // end procedure main


8. Schritt: Erweiterungen

Einbau der Features Datensatz Löschen, Einfügen und Hinzufügen sowie Blättern.

    Name Anzahl Preis Gesamtwert
1.0
4.0
9.0
16.0
    Summe     30.0


procedure main()
{
  logon
  {
    // im Body der logon-Deklaration ist die User-Validierung ausgeschalten

    while ( true )
    {
      if ( session.CNC_LIST_KEY == null )
      {
        //Daten von Datenbank holen
        action( 'load' );
      }

      jsp( "/jsp_spreadsheet.jsp" );

      if ( cnc_button == 'save' )
      {
        action ( 'save' );
      }
      else if ( cnc_button == 'add' )
      {
        add( session.CNC_LIST_KEY , newObject( 'de.jspspread.formbeans.AktieFormBean' ) );

        // zum Ende der Liste blättern
        invokeMethod( session.CNC_BROWSE_CTRL_KEY , "goLast" );
      }
      else if ( cnc_button == 'ins' )
      {
        add( session.CNC_LIST_KEY , newObject( 'de.jspspread.formbeans.AktieFormBean' ) , cnc_button_index );
      }
      else if ( cnc_button == 'del' )
      {
        // Zwischenspeichern Button-Index, weil der Button-Index nach dem Anzeigen der nächsten JSP nicht mehr im Request ist
        session.listIndex := cnc_button_index;

        //Löschfrage
        session.CNC_MESSAGE_KEY := "Aktie " + session.CNC_LIST_KEY[ cnc_button_index ] + " wirklich löschen?";

        jsp( 'del_ask.jsp' );

        if ( cnc_button == 'del' )
        {
          remove( session.CNC_LIST_KEY , session.listIndex );
        }
        session.listIndex := null ;
      }
    } // end while
  } // end logon
} // end procedure main


WAR-File für Tomcat5 unter JDK 1.4

Download jsp_spreadsheet.war

Das war-File können Sie in das Verzeichnis TOMCAT_HOME/webapps kopieren.

Tomcat (re)starten.

Ansehen mit http://localhost:8080/jsp_spreadsheet .



Source-Code

Download der Quelldateien jsp_spreadsheet.zip

Installation:

Entpacken in Verzeichnis Ihrer Wahl (z.B. G:\CnC)

Kompilieren mit ANT (build.bat oder build.xml)

Start im Tomcat 5 mit http://localhost:8080/jsp_spreadsheet

Achtung: Erweiterungen und Fixes stelle ich ohne Historie und ohne Ankündigung hier bereit.
Deshalb am besten immer die letzte Version runterladen.

Lizenzbedingungen:

Die Programme, Quelltexte und Dokumentationen können ohne irgendwelche Bedingungen kostenlos verwendet werden.
Sie sind Freeware und Open Source. Für Fehler und Folgen wird keinerlei Haftung übernommen.

Hinweise zur Fehlerbeseitigung und Verbesserung sind mir willkommen.

Ich freue mich auch über Feedback bezüglich der erfolgreichen Verwendung meiner Sourcen.

Bei Fragen helfe ich gern mit Hinweisen oder zusätzlicher Dokumentation, falls ich dafür Zeit habe.