applet mit servlet kommunizieren wie

mrno

Erfahrenes Mitglied
Wie kann ich daten an ein servlet übergeben sie bearbeiten und dann wieder zurück holen
hat da jemand eine lösung. Vielleicht auch ein kleines beispiel wäre sehr dankbar darüber.
MFG mrno
 
Hallo!

Es gibt prinzipiell mehrere Möglichkeiten über ein Applet mit einem Servlet zu kommunizieren.

Wie etwa:
1) Sockets
2) HTTP
3) RMI
4) Corba
usw.

Hier mal beispielhaft die HTTP Variante:

Unser Applet:
( Hieran sei auch nochmal exemplarisch gezeigt wie man von java aus einen GET und POST HTTP Request versenden kann. )
Code:
/*
 * Created on 14.02.2005@17:41:04
 *
 * TODO Licence info
 */
package de.tutorials;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTextField;

/**
 * @author Administrator
 *
 * TODO Explain me
 */
public class SimpleMathApplet extends JApplet {

    private static final String serviceUrl = "http://localhost:8088/tutorials/MathServlet";

    private JTextField txtZahl1, txtZahl2, txtErgebnis;

    private JLabel lblZahl1, lblZahl2, lblErgebnis, lblMethod;

    private JButton btnSubmit;

    private JComboBox cboMethod;

    public void init() {
        super.init();
        Container c = getContentPane();
        GridLayout gl = new GridLayout(5, 2);
        c.setLayout(gl);

        lblZahl1 = new JLabel("Zahl1: ");
        txtZahl1 = new JTextField(10);
        c.add(lblZahl1);
        c.add(txtZahl1);

        lblZahl2 = new JLabel("Zahl2: ");
        txtZahl2 = new JTextField(10);
        c.add(lblZahl2);
        c.add(txtZahl2);

        lblErgebnis = new JLabel("Ergebnis: ");
        txtErgebnis = new JTextField(20);
        c.add(lblErgebnis);
        c.add(txtErgebnis);

        lblMethod = new JLabel("Methode:");
        cboMethod = new JComboBox(new Object[] { "POST", "GET" });
        cboMethod.setEditable(false);
        cboMethod.setSelectedIndex(0);
        c.add(lblMethod);
        c.add(cboMethod);

        btnSubmit = new JButton("Submit");
        btnSubmit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String method = (String) cboMethod.getSelectedItem();
                if (method.equals("POST")) {
                    try {
                        HttpURLConnection con = (HttpURLConnection) new URL(
                                serviceUrl).openConnection();

                        con.setDoOutput(true);
                        con.setRequestMethod("POST");

                        BufferedWriter bw = new BufferedWriter(
                                new OutputStreamWriter(con.getOutputStream()));

                        StringBuffer data = new StringBuffer("zahl1=");
                        data.append(txtZahl1.getText());
                        data.append('&');
                        data.append("zahl2=");
                        data.append(txtZahl2.getText());

                        bw.write(data.toString());
                        bw.flush();
                        bw.close();

                        con.disconnect();

                        BufferedReader br = new BufferedReader(
                                new InputStreamReader(con.getInputStream()));
                        String ergebnis = br.readLine();
                        txtErgebnis.setText(ergebnis);
                        br.close();

                    } catch (MalformedURLException e1) {
                        e1.printStackTrace();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }

                } else if (method.equals("GET")) {
                    try {
                        StringBuffer url = new StringBuffer(serviceUrl);
                        url.append('?');
                        url.append("zahl1=");
                        url.append(txtZahl1.getText());
                        url.append('&');
                        url.append("zahl2=");
                        url.append(txtZahl2.getText());

                        HttpURLConnection con = (HttpURLConnection) new URL(url
                                .toString()).openConnection();

                        con.disconnect();

                        BufferedReader br = new BufferedReader(
                                new InputStreamReader(con.getInputStream()));
                        String ergebnis = br.readLine();
                        txtErgebnis.setText(ergebnis);
                        br.close();

                    } catch (MalformedURLException e1) {
                        e1.printStackTrace();
                    } catch (IOException e2) {
                        e2.printStackTrace();
                    }
                }
            }
        });
        c.add(btnSubmit);
    }
}

hier unser Servlet:
Code:
/*
 * ASW Berufsakademie
 * 
 * Created on 14.02.2005 / 17:43:03
 * 
 */
package de.tutorials.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author Administrator
 *
 * TODO Explain what I do
 * @web.servlet-mapping url-pattern="/MathServlet"
 * @web.servlet description="A simple Math Servlet"
 *              display-name="MathServlet"
 *              name="MathServlet"
 */
public class MathServlet extends HttpServlet {

    /* (non-Javadoc)
     * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        processRequest(req, resp);
    }

    /* (non-Javadoc)
     * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        processRequest(req, resp);
    }

    private void processRequest(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String z1 = req.getParameter("zahl1");
        String z2 = req.getParameter("zahl2");

        if (z1 != null && !z1.equals("") && z2 != null && !z2.equals("")) {
            int i = Integer.parseInt(z1);
            int j = Integer.parseInt(z2);

            resp.getWriter().println(String.valueOf(i + j));
        }
    }
}

Zur Kommunikation über HTTP empfehle ich jedoch dingenst den Einsatz der HttpClient Software aus den Jakarta Commons:
http://jakarta.apache.org/commons/httpclient/

HTH,
Gruß Tom
 
Wenn ich es über params mache, kann es sein das ich die maximale länge überschreite. Es können sehr viele Werte oder sehr lange Strings sein die ich übergeben will. Wie löse ich es dann.
 
Hallo!

Du könntest dann beispielsweise deine Daten ganz einfach per Stream von Hand oder per Serialisierung vom Applet zum Servlet schicken, dort die Verarbeitung anwerfen und dann das Ergebnis wieder per Stream oder per Serialisierung zurück zum Applet schicken.

Gruß Tom
 
hast du vieleicht auch davon ein beispiel. Ich habe leider keine ahnung wie ich daten per stream an das servlet übergeben kann
 
Hallo!

Schau mal hier:

Servlet:
Code:
/*
 * ASW Berufsakademie
 * 
 * Created on 14.02.2005 / 17:43:03
 * 
 */
package de.tutorials.servlet;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.math.BigInteger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author Administrator
 *
 * TODO Explain what I do
 * @web.servlet-mapping url-pattern="/MathServlet"
 * @web.servlet description="A simple Math Servlet"
 *              display-name="MathServlet"
 *              name="MathServlet"
 */
public class MathServlet extends HttpServlet {

    /* (non-Javadoc)
     * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        processRequest(req, resp);
    }

    /* (non-Javadoc)
     * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        processRequest(req, resp);
    }

    private void processRequest(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(
                req.getInputStream()));
        try {
            BigInteger bi1 = (BigInteger) ois.readObject();
            BigInteger bi2 = (BigInteger) ois.readObject();

            BigInteger biErg = bi1.add(bi2);

            ObjectOutputStream oos = new ObjectOutputStream(
                    new BufferedOutputStream(resp.getOutputStream()));

            oos.writeObject(biErg);
            oos.flush();
            oos.close();

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Applet:
Code:
/*
 * Created on 14.02.2005@17:41:04
 *
 * TODO Licence info
 */
package de.tutorials;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.math.BigInteger;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTextField;

/**
 * @author Administrator
 *
 * TODO Explain me
 */
public class SimpleMathApplet extends JApplet {

    private static final String SERVICE_URL = "http://localhost:8088/tutorials/MathServlet";

    private JTextField txtZahl1, txtZahl2, txtErgebnis;

    private JLabel lblZahl1, lblZahl2, lblErgebnis, lblMethod;

    private JButton btnSubmit;

    private JComboBox cboMethod;

    public void init() {
        super.init();
        Container c = getContentPane();
        GridLayout gl = new GridLayout(5, 2);
        c.setLayout(gl);

        lblZahl1 = new JLabel("Zahl1: ");
        txtZahl1 = new JTextField(10);
        c.add(lblZahl1);
        c.add(txtZahl1);

        lblZahl2 = new JLabel("Zahl2: ");
        txtZahl2 = new JTextField(10);
        c.add(lblZahl2);
        c.add(txtZahl2);

        lblErgebnis = new JLabel("Ergebnis: ");
        txtErgebnis = new JTextField(20);
        c.add(lblErgebnis);
        c.add(txtErgebnis);

        lblMethod = new JLabel("Methode:");
        cboMethod = new JComboBox(new Object[] { "POST", "GET" });
        cboMethod.setEditable(false);
        cboMethod.setSelectedIndex(0);
        c.add(lblMethod);
        c.add(cboMethod);

        btnSubmit = new JButton("Submit");
        btnSubmit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    URLConnection con = new URL(SERVICE_URL).openConnection();

                    con.setDoInput(true);
                    con.setDoOutput(true);

                    ObjectOutputStream oos = new ObjectOutputStream(
                            new BufferedOutputStream(con.getOutputStream()));

                    BigInteger bi1 = new BigInteger(String.valueOf(txtZahl1
                            .getText()));
                    BigInteger bi2 = new BigInteger(String.valueOf(txtZahl2
                            .getText()));

                    oos.writeObject(bi1);
                    oos.writeObject(bi2);

                    oos.flush();
                    oos.close();

                    ObjectInputStream ois = new ObjectInputStream(
                            new BufferedInputStream(con.getInputStream()));

                    BigInteger biErg = (BigInteger) ois.readObject();
                    ois.close();

                    txtErgebnis.setText(biErg.toString());

                } catch (MalformedURLException e1) {
                    e1.printStackTrace();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (ClassNotFoundException e1) {
                    e1.printStackTrace();
                }
            }
        });
        c.add(btnSubmit);
    }
}

HTH,

Gruß Tom
 
hi
habe dein code ausprobiert. Leider wird mir jedesmal im applet die IOException ausgeführt.
Sie lautet
java.io.IOException:Server returned HTTP response code: 500 for URL: http://localhost:8080/write/write

kann mir irgendjeman helfen. Hier ist mein applet:
Code:
package applet1;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
import java.net.*;

public class write extends Applet {
  TextArea tA1 = new TextArea();
  TextField url = new TextField();
  Button button1 = new Button();
  Label ergebnis = new Label();
  String writePath;
  public void start()
  {
    writePath= ""+ getDocumentBase();
    writePath=writePath.substring(0,writePath.length()-10)+"write";
    url.setText(writePath);
  }
  public write() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  private void jbInit() throws Exception {
    tA1.setText("Kommentar:");
    tA1.setVisible(true);
    tA1.setBounds(new Rectangle(18, 76, 360, 213));
    this.setLayout(null);
    url.setText("URL");
    url.setBounds(new Rectangle(16, 7, 365, 31));
    button1.setLabel("senden");
    button1.setBounds(new Rectangle(13, 40, 84, 25));
    button1.addActionListener(new write_button1_actionAdapter(this));
    ergebnis.setText("Ergebnis");
    ergebnis.setBounds(new Rectangle(132, 41, 252, 26));
    this.add(tA1, null);
    this.add(url, null);
    this.add(button1, null);
    this.add(ergebnis, null);
  }

  void button1_actionPerformed(ActionEvent e) {
    try
    {
      URLConnection con = new URL(writePath).openConnection();
      con.setDoInput(true);
      con.setDoOutput(true);
      
      ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(con.getOutputStream()));
      oos.writeObject("hallo ");
      oos.writeObject("welt");
      
      oos.flush();
      oos.close();
      
      ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(con.getInputStream()));
      String s=""+ois.readObject();
      ois.close();
      tA1.append("\n"+s);
    }
    catch(MalformedURLException e1){tA1.append("\n MalformedURLException:"+e1);}
    catch(IOException e1){tA1.append("\n IOException:"+e1);}
    catch(ClassNotFoundException e1){tA1.append("\n ClassNotFoundException:"+e1);}
  }


}

class write_button1_actionAdapter implements java.awt.event.ActionListener {
  write adaptee;

  write_button1_actionAdapter(write adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.button1_actionPerformed(e);
  }
}

und hier ist der servletcode:

Code:
package write;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class write extends HttpServlet {
  private static final String CONTENT_TYPE = "text/html; charset=UTF-8";

  //Initialize global variables
  public void init() throws ServletException {
  }

  //Process the HTTP Get request
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType(CONTENT_TYPE);
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head><title>write</title></head>");
    out.println("<body bgcolor=\"#ffffff\">");
    out.println("<p>The servlet has received a " + request.getMethod() + ". This is the reply.</p>");
    out.println("</body></html>");
    try
    {
      ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(
          request.getInputStream()));
      String s1 = "" + ois.readObject();
      String s2 = ""+ ois.readObject();
      ois.close();
      ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(response.getOutputStream()));
      oos.writeObject(s1+s2);
      oos.flush();
      oos.close();
    }catch(ClassNotFoundException e){}
  }

  //Process the HTTP Post request
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
  }

  //Clean up resources
  public void destroy() {
  }
}

beide dateien befinden sich bei Tomcat unter webapps im ordner write.

Die web.xml sieht so aus.
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <display-name>write</display-name>
  <servlet>
    <servlet-name>write</servlet-name>
    <servlet-class>write.write</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>debugjsp</servlet-name>
    <description>Added to compile JSPs with debug info</description>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
      <param-name>classdebuginfo</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>write</servlet-name>
    <url-pattern>/write</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>debugjsp</servlet-name>
    <url-pattern>*.jsp</url-pattern>
  </servlet-mapping>
</web-app>

kann mir einer weiterhelfen. Sieht einer mein fehler
Wäre sehr dankbar dafür

MFG mrno
 
Hallo!

mein Beispiel sollte eigentlich tadellos funktionieren...
aber hier mal ein paar Anmerkungen zu deinem Versuch:
1) Klassennamen werden nach Konvention groß geschrieben...
2) Wenn man bei einem Servlet init() überschreibt sollte man auch unbedingt dort super.init() aufrufen.
3) Man sollte niemals Exception Blöcke einfach leer lassen, bzw. alle Exceptions nach oben weiterreichen... sonst werden nämlich etwaige wichtige Fehlermeldungen die zur Aufklärung der Fehlerursache dienen könnten einfach verschluckt.

Änder das ganze mal meinen Anmerkungen gemäß ab und stell uns doch mal die Fehlermeldung des Tomcats zur Verfügung ...(die dann (hoffentlich) auf der Konsole ausgegeben wird.)

Gruß Tom
 
wie gebe ich des in tomcat aus. Bei mir läuft tomcat als ein hintergrundprogramm unter linux.
 
Zurück