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.
