Avatar billede jally72 Nybegynder
09. maj 2003 - 11:16 Der er 12 kommentarer og
2 løsninger

Sende dataset mellom applet og servlet

Hei, holder på med en applet som skal kommunisere med en Http Servlet. I fra appleten skal man kunne opprette, slette og kopiere dataer fra en eller flere tabeller. Bruker streaming imellom appleten og servleten, og servleten ligger på samme maskin som sql serveren hvor databasen er. Det jeg gjør er: får kontakt med servleten, kjører et sql kall fra servleten mottar 4 rader, og prøver å sende disse tilbake til appleten, men på applet siden så er det ingen rader i dataset'et. Er ganske fersk i java så det er sikkert noen grunnleggendes feil her... Her er koden:

Appletsiden:

  private DataSet getDetailUsingHttpObject() {
// Retrieve the current time using an HTTP object-based connection
    try {
// Construct a URL referring to the servlet
      URL url = new URL(getCodeBase(), "http://localhost:8080/XXXXX/ZZZZZ");
// Create a servlet.HttpMessage to communicate with that URL
      HttpMessage msg = new HttpMessage(url);
// Construct a Properties list to say format=object
      Properties props = new Properties();
      props.put("format", "object");
// Send a GET message to the servlet, passing "props" as a query string
// Get the response as an ObjectInputStream
      InputStream in = msg.sendGetMessage(props);
      ObjectInputStream result = new ObjectInputStream(in);
// Read the Date object from the stream
      Object obj = result.readObject();
      detail = (com.borland.dx.sql.dataset.QueryDataSet)obj;
      int test3 = detail.columnCount();

    return detail;
    }
**********************************************************
På serverside:

if ("object".equals(request.getParameter("format"))) {
      DataSet ars = SqlTools.getDetailSection(dm.getDatabase());
      int test2 = ars.columnCount();
      Array test = null;
      test2 = ars.columnCount();
      ObjectOutputStream out2 = new ObjectOutputStream(response.getOutputStream());
      out2.writeObject(ars);
    }
***********************************************************
HTTPMESSAGE programmet:

public class HttpMessage {
URL servlet = null;
String args = null;
public HttpMessage(URL servlet) {
this.servlet = servlet;
}
// Performs a GET request to the previously given servlet
// with no query string.
public InputStream sendGetMessage() throws IOException {
return sendGetMessage(null);
}
// Performs a GET request to the previously given servlet.
// Builds a query string from the supplied Properties list.
public InputStream sendGetMessage(Properties args) throws IOException {
String argString = ""; // default
if (args != null) {
argString = "?" + toEncodedString(args);
}
URL url = new URL(servlet.toExternalForm() + argString);
// Turn off caching
URLConnection con = url.openConnection();
con.setUseCaches(false);
return con.getInputStream();
}
// Performs a POST request to the previously given servlet
// with no query string.
public InputStream sendPostMessage() throws IOException {
return sendPostMessage(null);
}
// Performs a POST request to the previously given servlet.
// Builds post data from the supplied Properties list.
public InputStream sendPostMessage(Properties args) throws IOException {
String argString = ""; // default
if (args != null) {
argString = toEncodedString(args); // notice no "?"
}
    URLConnection con = servlet.openConnection();
// Prepare for both input and output
    con.setDoInput(true);
    con.setDoOutput(true);
// Turn off caching
    con.setUseCaches(false);
// Work around a Netscape bug
    con.setRequestProperty("Content-Type",
    "application/x-www-form-urlencoded");
// Write the arguments as post data
    DataOutputStream out = new DataOutputStream(con.getOutputStream());
    out.writeBytes(argString);
    out.flush();
    out.close();
    return con.getInputStream();
    }
// Converts a Properties list to a URL-encoded query string
    private String toEncodedString(Properties args) {
    StringBuffer buf = new StringBuffer();
    Enumeration names = args.propertyNames();
    while (names.hasMoreElements()) {
    String name = (String) names.nextElement();
    String value = args.getProperty(name);
    buf.append(URLEncoder.encode(name) + "=" + URLEncoder.encode(value));
    if (names.hasMoreElements()) buf.append("&");
    }
    return buf.toString();
    }
    }
Avatar billede disky Nybegynder
09. maj 2003 - 11:23 #1
Du kan kun snakke med den server du har hentet applet'en fra, ellers skal du til at rode med sikkerhedscertifikater.

Lav det hellere som en Java Application det er meget nemmere.
Avatar billede jally72 Nybegynder
09. maj 2003 - 11:26 #2
Det er den serveren som appleten er hentet fra, vet at kommunikasjonen funker da jeg har sent andre objecter i mellom applet'en og servleten (serveren). Må gjøre det på denne måten pga at det bare er et tillegg til servleten som inneholder veldig mye annet....
Avatar billede disky Nybegynder
09. maj 2003 - 11:37 #3
Vil du bare havde dit kode vurderet ?
Eller er der specifikke fejl i det ?

p.s. Hvis du satta kommentarerne efter linierne, og lavede lidt mellemrum imellem linierne passende steder, var det meget mere overskueligt.
Avatar billede arne_v Ekspert
09. maj 2003 - 11:39 #4
Jeg kender ikke com.borland.dx.sql.dataset.QueryDataSet
(det er ikke standard Java).

Men jeg vil gætte på at det svarer lidt til et java.sql.ResultSet.

Og så er svaret simpelt: det kan du ikke.

Du kan ikke sende et objekt som refererer til en åben database
connection over i et andet program.

Du skal lade dit server-program hente alle data, gemme dem
i en Vector/ArrayList/HashMap/whatever og sende det
over til appletten.
Avatar billede jally72 Nybegynder
09. maj 2003 - 11:42 #5
Arne V, du nærmer deg poengene, men hvordan gjør jeg det, og hvorfor kan man da lage appleter som (ser ut som om) virker som om du nesten editerer direkte på tabellene, vil ikke det bli veldig tregt å gjøre om dataset'ene. Er det noen dataset som kan sende over og andre ikke?
Avatar billede disky Nybegynder
09. maj 2003 - 11:45 #6
Du kan gøre det på 2 måde.

Enten connecter appleten direkte til databasen og gør alt direkte, eller du løber hele dine resultset igennem på server siden, og gemmer data i f.eks. en ArrayList indeholdende objekter der er data fra basen. Denne liste sender du så til applet'en.

Da du gerne vil editerer direkte, ville jeg gøre det via direkte forbindelse til serveren,s database.
Avatar billede arne_v Ekspert
09. maj 2003 - 11:48 #7
Hvis du f.eks. laver en klasse med samme felter som rækkerne i
tabellen, så vil et objekt være en række.

Disse objekter gemmer du i en ArrayList, således at den svarer
til alle rækkerne.

Det må være overkommeligt at repræsentere den datastruktur som
en tabel i appletten.

række i felt x  bliver så:

((Row)list.get(i)).getX()
Avatar billede jally72 Nybegynder
09. maj 2003 - 11:49 #8
Hva viss det da er flere som har appleten oppe samtidig, vil databasen takle det med hensyn på låsing av kolonner osv. Da må jeg vel også bruke en rein javadriver eller?
Avatar billede jally72 Nybegynder
09. maj 2003 - 11:53 #9
Siden jeg er ganske fersk i gamet så skjønner jeg ikke alt. Kan du vise viss jeg f.eks har et dataset inneholder en rad med følgende data: Felt1: kake, Felt2: lodd, Felt3: fisk. Så skal jeg legge dette inn i en Arraylist på serversiden...  Og deretter tilbake (????) til et dataset på appletsiden???
Avatar billede disky Nybegynder
09. maj 2003 - 11:54 #10
Du laver en klasse der indeholder get/set metoder til alle felter, og så fylder du sådanne et objekt ud med data fra en DB record, og add'er dem til arraylisten, næste record er et nyt objekt.

Det med låsning af DB'en er noget du selv styrer.
Avatar billede jally72 Nybegynder
09. maj 2003 - 12:01 #11
Kan jeg gi begge poeng??? Blir resultset'et slettet viss jeg closer det, og viss ikke går det fortsatt ikke ant å sende det over???
Avatar billede disky Nybegynder
09. maj 2003 - 12:02 #12
Ja du kan godt give begge point, men ikke hvis du afviser alle svar.
Avatar billede arne_v Ekspert
09. maj 2003 - 12:03 #13
import java.io.*;

public class Data implements Serializable {
    private String felt1;
    private String felt2;
    public Data() {
        this.felt1 = "";
        this.felt2 = "";
    }
    public Data(String fel1, String felt2) {
        this.felt1 = felt1;
        this.felt2 = felt2;
    }
    public String getFelt1() {
        return felt1;
    }
    public String getFelt2() {
        return felt2;
    }
    public void setFelt1(String felt1) {
        this.felt1 = felt1;
    }
    public void setFelt2(String felt2) {
        this.felt2 = felt2;
    }
    public String toString() {
        return "[" + felt1 + " " + felt2 + "]";
    }
}
Avatar billede arne_v Ekspert
09. maj 2003 - 12:05 #14
server:

ArrayList list = new ArrayList();
list.add(new Data("abc", "xyz"));
list.add(new Data("def", "abc123"));
//send list

client:

ArrayList list;
//receive list
for(int i = 0; i < list.size(); i++) {
    Data do = (Data)list.get(i);
    String felt1 = do.getFelt1();
    String felt2 = do.getFelt2();
    // use felt1 and felt2
}
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