Avatar billede mecky Nybegynder
15. marts 2005 - 23:30 Der er 8 kommentarer

Hjælp til kalender

Hej eksperter.
Jeg har lavet en kalender i JSP hvor man kan oprette en besked(note) i datoen. beskeden bliver gemt i en XML fil.
Det jeg vil have, er at den skal gemme beskederne i MySQL databasen i stedet for XML.
Den anden ting er, at kalenderen kan kun bruges af en bruger lige nu, og vil have at hver bruger får sin egen kalender, da jeg har forskellige bruger i MySQL databasen.
Herunder har i koden:
(((((kalender.jsp))))
<%-- Knyt bønnen Bruger til brugerens session under navnet b --%>
<jsp:useBean id="b" class="kalender.Bruger" scope="session" />
<%-- Overfør parametre til b, der svarer til egenskaber --%>
<jsp:setProperty name="b" property="*" />

<html>
<head><title>Kalender</title></head>
<body>
<h1>Fælleskalender for <%= b.getDatostr() %></h1>
<a href="kalender.jsp?maaned=<%= b.getMaaned()-1 %>">forrige</a> måned -
<a href="kalender.jsp?maaned=<%= b.getMaaned()+1 %>">næste</a> måned -
<%
if (b.isRediger()) { // redigering - vis en input-formular
%>

<a href="kalender.jsp?rediger=false">vis</a> kalenderen.<br>
<br>
<form action="kalender.jsp" method="post">
    Tryk <input type="submit" value="OK"> når du vil gemme ændringer.<br>

    <% b.udskrivDagsprogram(out); %>

    <br><br>
    <input type="submit" value="OK">
</form>
<%
    } else {            // fremvisning
%>
<a href="kalender.jsp?rediger=true">redigér</a> kalenderen.<br>

<% b.udskrivDagsprogram(out); %>
<%
    }
%>
</body>
</html>

(((((Bruger.java))))))
package kalender;
import java.util.*;
import java.text.*;
import java.io.*;

public class Bruger {
    private SimpleDateFormat månedFormat;
    private SimpleDateFormat dagugedagFormat;

    public void setLocale(Locale sproget) {
        månedFormat = new SimpleDateFormat("MMMM yyyy",sproget); // f.x. 'maj 2004'
        dagugedagFormat = new SimpleDateFormat("dd EE",sproget); // f.x. '31 ma'
    }

    // tom konstruktør - ellers er det ikke en javabønne
    public Bruger() { setLocale(new Locale("da","DK")); }

    private boolean redigering;
    public void setRediger(boolean r) { redigering = r; }
    public boolean isRediger() { return redigering; }

    private GregorianCalendar dato = new GregorianCalendar();

    public void setMaaned(int m) {
        dato.set(Calendar.MONTH, m);
        dato.set(Calendar.DAY_OF_MONTH, 1); // første dag, så hele måneden ses
    }
    public int getMaaned() { return dato.get(Calendar.MONTH); }

    /** Giver aktuelle måned og år som en streng */
    public String getDatostr() { return månedFormat.format(dato.getTime()); }

    /** Egenkaben dagsprogram er et array af strenge, en for hver dag.
    *  der kaldes videre i det fælles Kalender-objekt                  */
    public void setDagsprogram(String[] dagsprogram) {
        redigering = false;
        int start = Kalender.instans.beregnIndex(dato);
        for (int i=0; i<dagsprogram.length; i++)
            Kalender.instans.sætDagstekst(start+i,dagsprogram[i]);
    }

    /** Producerer HTML-kode der viser et dagsprogram */
    public void udskrivDagsprogram(Writer out) throws IOException {
        GregorianCalendar kal = (GregorianCalendar) dato.clone();
        int start = Kalender.instans.beregnIndex(kal);
        int antal = 1 + dato.getActualMaximum(Calendar.DAY_OF_MONTH)
                      - dato.get(Calendar.DAY_OF_MONTH);
        for (int i=0; i<antal; i++) {
            String dagugedag = dagugedagFormat.format(kal.getTime());
            out.write("<br>\n<code>");
            out.write(dagugedag);
            out.write("</code> ");
            if (!redigering) out.write(Kalender.instans.hentDagstekst(i+start));
            else out.write("<input type='text' size=30 name='dagsprogram' value='"
                + Kalender.instans.hentDagstekst(i+start).replace('\'','\"') + "'>");
            kal.roll(Calendar.DAY_OF_MONTH,1);
        }
    }
}

(((((((Kalender.java))))))
package kalender;

import java.util.*;
import java.text.*;
import java.beans.*;
import java.io.*;

public class Kalender
{
    private boolean ændret;
    private List liste;
    /**
    * @param kal Datoen vi ønsker at kende indekset i listen på
    * @returns indekset der skal bruges i kald til sæt() og hent().
    */
    public int beregnIndex(Calendar kal) {
        int år = kal.get(Calendar.YEAR);
        int dag = kal.get(Calendar.DAY_OF_YEAR);
        // det vigtigste er at to dage aldrig får samme indeks
        return (år-2003)*366+dag;
    }

    /**
    * Sæt teksten for en bestemt dag.
    * @see #beregnIndeks(Calendar)
    * @param indeks Indekset i listen. Skal først findes med beregnIndeks()
    * @param tekst Teksten for dagen
    */
    public void sætDagstekst(int indeks, String tekst) {
        // Fyld op med tomme strenge hvis der gås ud over listen
        while (indeks>=liste.size()) liste.add("");
        liste.set(indeks,tekst);
        ændret = true;
    }

    /**
    * Hent teksten for en bestemt dag.
    * @see #beregnIndeks(GregorianCalendar)
    * @param index Indekset i listen. Skal først findes med beregnIndeks()
    * @return tekst Teksten for dagen
    */
    public String hentDagstekst(int indeks) {
        if (indeks<0 || liste.size()<=indeks) return "";
        else return (String) liste.get(indeks);
    }

    public static final Kalender instans = new Kalender(); // singleton med

    private Kalender() {                                  // privat konstruktør
        try { // indlæs kalenderen fra XML-fil på disken (hvis den findes)
            XMLDecoder kal = new XMLDecoder(new FileInputStream("kalender.xml"));
            // alternativ: hent serialiseret objekt i stedet for XML-data
            //ObjectInputStream kal = new ObjectInputStream(
            //                        new FileInputStream("kalender.ser"));
            liste = (ArrayList) kal.readObject();
            kal.close();
            System.out.println("Kalender indlæst: "+liste);
        } catch (Exception e) {
            System.out.println("Kalender ikke indlæst, opretter ny: "+e);
            liste = new ArrayList();
        }
        GemRegelmæssigt g = new GemRegelmæssigt(); // gemmer kalenderen på disken
    }

    /** Sørger for at gemme kalenderen regelmæssigt (i en separat tråd) */
    class GemRegelmæssigt extends Thread
    {
        public GemRegelmæssigt() {
            setDaemon(true);  // systemet må godt stoppe selvom tråden stadig kører
            setPriority(MIN_PRIORITY);
            start();
        }

        public void run() {
            while (true) try {
                Thread.sleep(1*60*1000); // hvert minut,
                if (ændret) {            // hvis kalenderen er ændret
                    ændret = false;        // gem kalenderen på disken
                    // gem som XML
                    XMLEncoder kal = new XMLEncoder(new FileOutputStream("kalender.xml"));
                    // alternativ: gem som serialiseret objekt i stedet for XML
                    //ObjectOutputStream kal = new ObjectOutputStream(
                    //                        new FileOutputStream("kalender.ser"));
                    kal.writeObject(liste);
                    kal.close();
                    System.out.println("Kalender gemt: "+liste);
                }
            } catch (Exception e) { e.printStackTrace(); }
        }
    }
}

Jeg håber at jeg har beskrevet det rigtig. tak på forhånd.
Avatar billede arne_v Ekspert
16. marts 2005 - 08:21 #1
Jeg er ikke sikker på at jeg forstår spørgsmålet.

Der hvor du nu bruger XmlDecoder og XmlEncoder skal du bruge JDBC
til at lave SELECT og INSERT/UPDATE i databasen med.

Men hvor er du kørt fast henne ?
Avatar billede mecky Nybegynder
16. marts 2005 - 21:37 #2
Hej Arne.
1- I stedet for at gemme beskederne som xml skal de gemmes som MySQL.
2- Kalenderen kan kun bruges af en bruger lige nu. hvordan kan jeg kode den til at den ku bruges af forskellige bruger. DVS. når en bruger er logget ind og han taste en besked så skal den gemmes i hans database.
Avatar billede arne_v Ekspert
16. marts 2005 - 21:51 #3
Har du arbejdet med JDBC før ?
Avatar billede mecky Nybegynder
16. marts 2005 - 21:51 #4
nej det har jeg ikke?
Avatar billede arne_v Ekspert
16. marts 2005 - 22:00 #5
Avatar billede arne_v Ekspert
16. marts 2005 - 22:01 #6
Eksempel på connection til MySQL:

        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost/Test", "", "");
Avatar billede mecky Nybegynder
16. marts 2005 - 23:37 #7
problemmet er ikke hvordan jeg kan programmere mysql. problemmet er hvordan jeg kan får min kalender til at sende bruger id, dato og beskeden.
Avatar billede mecky Nybegynder
17. marts 2005 - 18:15 #8
hjælp hjælp.
Er der nogen der har en kalender, der køre i JSP og gemme beskeder i MySQL database.
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