Kaip aš dariau išsaugojimą į failą:
// Pavyzdys imtas iš Tvarkaraščio
uždavinio. Pas jus gali skirtis duomenys, bei
// apdorojantis juos skriptas.
Tarkime turiu String masyvų masyvą
public String [][] Mokytojai0 = new String[eMo][sMo];
// Dabar truputi apie apletus.
Kai paleidinėjame apletą iš HTML, mes jame nurodome
// codebase, t.y. darbinę vietą,
kurioje būna arba apleto archyvas ar duomenų failas.
// Taigi paleidus apletą, tą
nurodytą kelią mes galime sužinoti šios funkcijos
// GlobalTools.getCodeBase()
pagalba. Taigi su žemiau esančia eilute aš apsirašau
// kelią į write.cgi skriptą,
kuris apdoros mano siunčiamus duomenis. Pastaba: perkėlus
// apletą į kitą serverį automatiškai
keisis ir šis kelias, todėl jums visai nereikės
// perkompiliuoti programos.
Bet būtina žinoti, kad toje vietoje kurią aprašo žymė
// codebase turi būti šis skriptas
write.cgi. Apie jį šiek tiek vėliau. Beje apletas
// gali kreiptis tik į tą skriptą
iš kurio serverio jis ir pats buvo užkrautas.
public String write_program_url=new String(GlobalTools.getCodeBase()+"write.cgi" );
// Čia mano išvedinėjimo programa.
Trumpai apie jos veikimą. Ji į vieną eilutę surašo
// visus duomenis iš String masyvų
masyvo į StringBuffer tipo kintamąjį su atitinkamais
// skyrikliais, kuriuos žino
mano apdorojantis skriptas write.cgi.
private
void Output() throws IOException
{
// Toks buferio ilgis nes POST
metodas nepalaiko daugiau simbolių.
StringBuffer
all = new StringBuffer(8096);
// Pagalbinis kintamasis
String
temp;
int i,
j;
// Su šių ciklų pagalba visas eilutes iš String masyvų masyvo perrašau į
vieną
// StringBuffer tipo kintamąjį su skyrikliais ::. Kai baigiamas pirmojo
masyvo
// pirmojo nario masyvas (viena matricos eilutė) rašomas skyriklis &&,
galima
// sakyti jis atitinka rezultatų faile naują eilutę.
for (i=0; i<eMo; i++){
for (j=0; j<sMo; j++){
if (j != (sMo-1)) temp = "::"; else temp = "";
all.append(URLEncoder.encode(Mokytojai0[i][j]+temp));
}
if (i != (eMo-1)) {temp = "&&"; all.append(URLEncoder.encode(temp));}
}
// Visą turinį iš StringBuffer kintamojo perrašau į kintamąjį, kurio duomenys
jau
// bus siunčiami skriptui, funkcijos toString() pagalba. Taigi turiu ištisą
// duomenų seką su skyrikliais :: ir &&. Pvz.:
// Blonskis::15::48::65&&Bukšnaitis::89::74::12 ir t.t.
String stringas = all.toString();
// Toliau susikuriu URL tipo kintamąjį mūsų aukščiau susikurtam kintamąjam
// write_program_url. Ir atidarau jungtį su tuo URL.
try {
URL url = new URL(write_program_url);
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
// Atidaromas rašymo srautas į tą URL. Ir įrašomas tenai suformuota duomenų
sekas
// su raktu string. Tai yra skriptui paduodama tokia informacija:
// string=Blonskis::15::48::65&&Bukšnaitis::89::74::12. Uždaroma
jungtis. Jūsų
// problemos susijusios su duomenų perdavimu baigtos. Dabar darbą belieka
atlikti
// jūsų CGI skriptui write.cgi
PrintWriter out = new PrintWriter(connection.getOutputStream());
out.println("string=" + stringas);
out.flush();
out.close();
}
catch (MalformedURLException e){System.out.println(e);} catch (IOException
e){System.out.println(e);};
}
Mano write.cgi skriptas:
// Kelias iki Perl interpretatoriaus
#!/usr/local/bin/perl
// Naudojamos bibliotekos. Pirmoji
duomenų paėmimui iš CGI formų, antroji failų // rakinimui.
use CGI;
use Fcntl
':flock';
// Rezultatų failo pavadinimas
$file="mokytojai.rez";
// Sukuriamas naujas objektas
$q=new
CGI;
// Į masyvą @mas surašomi atsiųsti
duomenys
// string=Blonskis::15::48::65&&Bukšnaitis::89::74::12
atskirti && simboliais. Tai
// yra pirmasis masyvo narys
bus $mas[0]=Blonskis::15::48::65, o antrasis
// $mas[1]= Bukšnaitis::89::74::12.
@mas =
split('&&',$q->param('string'));
// Tikrinama ar yra nors vienas
duomuo.
if ($mas[0]
ne undef){
// Atidaromas failas rašymui >
ir iš karto rakinamas.
open (R,">$file");
flock(R,LOCK_EX);
// Parenkamas išvedimo srauto
deskriptorius
select(R);
// Kiekvienas masyvo @mas narys
vėl skaidomas į kitą masyvą, tik šį karta skyriklis
// :: ir rašomas į failą apjungus
su skyrikliu , tai yra tarpu. Gale dedamas
// naujos eilutės simbolis.
foreach
(@mas){
@eil=split('::',$_);
print join(' ',@eil);
print "\n";
}
// Uždaromas failas, atrakinamas.
Pakeičiami failo atributai, kadangi jis turės būti
// perskaitomas per naršyklę.
close(R);
flock(R,LOCK_UN);
system("chmod
655 $file");
}
exit(0);
By Termas
Ó 2000
[email protected]