Сервлет Java, созданный в Netbeans, добавляет что-то странное? - PullRequest
1 голос
/ 25 октября 2010

Это моя вторая попытка решить эту проблему. Моя первая попытка была здесь , но, возможно, мое объяснение моей проблемы было недостаточным, моя проблема заключалась в том, что апплет получил исключение:

java.io.StreamCorruptedException: invalid stream header: 0A0A0A3C at 
java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783) at  
java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)

извините, если я звучу как испорченная запись:)

Я пытаюсь установить связь между апплетом и сервлетом на одном компьютере. Я создал сервлет в Netbeans, создав новый проект - веб-приложение Java - и выбрав Glassfish Server 3 в качестве сервера. Он создает index.jsp, но мне не нужен интерфейс веб-страницы.

Я запускаю сервлет из NetBeans (нажимая клавишу f6), и он развертывается и открывает файл index.jsp сервлета в моем браузере. Затем я запускаю апплет (из другого проекта в Netbeans) и пытаюсь подключиться. Я до сих пор получаю добрый старый «недопустимый заголовок потока», поэтому я предполагаю, что ошибка кроется в том, что я сделал в Netbeans.

Я вставил некоторый код, который, как я полагаю, работает (старый код, но не нашел более полных примеров). Код явно украден у Ссылка

Итак, в конце я хотел бы отправить массив двухмерных объектов из сервлета в апплет, когда апплет запрашивает отправку массива. Примеры кода просто показывают неверный заголовок потока, который я получаю.

Я думаю / думаю, что апплет получает текстовый ответ от сервера, но я хочу, чтобы ответ был сериализованным объектом (просто строкой в ​​примере кода), это будет Object [] [] позже, если Я когда-нибудь получаю подсказку.

Спасибо за ваше терпение, гуру. :)

Код апплета (не стесняйтесь игнорировать init () со всем кодом макета):

package se.iot.recallapplet;

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

public class RecallApplet extends Applet {
private TextField inputField = new TextField();
private TextField outputField = new TextField();
private TextArea exceptionArea = new TextArea();

public void init() {
    // set new layout
    setLayout(new GridBagLayout());

    // add title
    Label title = new Label("Echo Applet", Label.CENTER);
    title.setFont(new Font("SansSerif", Font.BOLD, 14));
    GridBagConstraints c = new GridBagConstraints();
    c.gridwidth = GridBagConstraints.REMAINDER;
    c.weightx = 1.0;
    c.fill = GridBagConstraints.HORIZONTAL;
    c.insets = new Insets(5, 5, 5, 5);
    add(title, c);

    // add input label, field and send button
    c = new GridBagConstraints();
    c.anchor = GridBagConstraints.EAST;
    add(new Label("Input:", Label.RIGHT), c);
    c = new GridBagConstraints();
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 1.0;
    add(inputField, c);
    Button sendButton = new Button("Send");
    c = new GridBagConstraints();
    c.gridwidth = GridBagConstraints.REMAINDER;
    add(sendButton, c);
    sendButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            onSendData();
        }
    });

    // add output label and non-editable field
    c = new GridBagConstraints();
    c.anchor = GridBagConstraints.EAST;
    add(new Label("Output:", Label.RIGHT), c);
    c = new GridBagConstraints();
    c.gridwidth = GridBagConstraints.REMAINDER;
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 1.0;
    add(outputField, c);
    outputField.setEditable(false);

    // add exception label and non-editable textarea
    c = new GridBagConstraints();
    c.anchor = GridBagConstraints.EAST;
    add(new Label("Exception:", Label.RIGHT), c);
    c = new GridBagConstraints();
    c.gridwidth = GridBagConstraints.REMAINDER;
    c.weighty = 1;
    c.fill = GridBagConstraints.BOTH;
    add(exceptionArea, c);
    exceptionArea.setEditable(false);
}

/**
 * Get a connection to the servlet.
 */
private URLConnection getServletConnection()
    throws MalformedURLException, IOException {

    // Connection zum Servlet ˆffnen
            URL urlServlet = new URL("http://localhost:8080/Event_Servlet/");
    URLConnection con = urlServlet.openConnection();

    // konfigurieren
    con.setDoInput(true);
    con.setDoOutput(true);
    con.setUseCaches(false);
    con.setRequestProperty(
        "Content-Type",
        "application/x-java-serialized-object");

    return con;
}

/**
 * Send the inputField data to the servlet and show the result in the outputField.
 */
private void onSendData() {
    try {
        // get input data for sending
        String input = inputField.getText();

        // send data to the servlet
        URLConnection con = getServletConnection();
        OutputStream outstream = con.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(outstream);
        oos.writeObject(input);
        oos.flush();
        oos.close();

        // receive result from servlet
        InputStream instr = con.getInputStream();
        ObjectInputStream inputFromServlet = new ObjectInputStream(instr);
        String result = (String) inputFromServlet.readObject();
        inputFromServlet.close();
        instr.close();

        // show result
        outputField.setText(result);

    } catch (Exception ex) {
        ex.printStackTrace();
        exceptionArea.setText(ex.toString());
    }
}
}

Код сервлета:

package se.iot.eventservlet;

import java.io.*;

import javax.servlet.ServletException;
import javax.servlet.http.*;

public class Event_Servlet extends HttpServlet {

public void doPost(
    HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
    try {
        response.setContentType("application/x-java-serialized-object");

        // read a String-object from applet
        // instead of a String-object, you can transmit any object, which
        // is known to the servlet and to the applet
        InputStream in = request.getInputStream();
        ObjectInputStream inputFromApplet = new ObjectInputStream(in);
        String echo = (String) inputFromApplet.readObject();

        // echo it to the applet
        OutputStream outstr = response.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(outstr);
        oos.writeObject(echo);
        oos.flush();
        oos.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

StackTrace:

java.io.StreamCorruptedException: invalid stream header: 0A0A0A3C
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
    at se.iot.recallapplet.RecallApplet.onSendData(RecallApplet.java:114)
    at se.iot.recallapplet.RecallApplet.access$000(RecallApplet.java:12)
    at se.iot.recallapplet.RecallApplet$1.actionPerformed(RecallApplet.java:48)
    at java.awt.Button.processActionEvent(Button.java:392)
    at java.awt.Button.processEvent(Button.java:360)
    at java.awt.Component.dispatchEventImpl(Component.java:4714)
    at java.awt.Component.dispatchEvent(Component.java:4544)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:635)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

1 Ответ

1 голос
/ 29 октября 2010

Проблема заключалась в том, что апплет не мог подключиться к сервлету, поэтому код в сервлете здесь можно игнорировать.

Мне нужно было настроить server.xml следующим образом:

<Context path="/servletName" docBase="servletName" debug="0" reloadable="true"
   crossContext="true">
   </Context>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...