Heiner Kücker

JSP Spreadsheet

Home

Java-Seite

   ASM Improved

   heterogene
   Map, HMap

   Constraint
   Code Generator

   JSP WorkFlow
   PageFlow FlowControl
   Page Flow Engine
   Web Flow Engine
   Control_and_Command

   JSP_Spreadsheet

   Code-Generator
   für Option-Either-Stil
   in Java

   verbesserter
   Comparator

   Fluent-Interface
   Code-Generator
   auf Basis
   einer Grammatik

   Visitor mit Multidispatch

   for-Schleife mit
   yield-return

   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

   WebCam_Demo

   Weiterentwicklung_Java

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.