апплет сервлет связи - PullRequest
       16

апплет сервлет связи

1 голос
/ 21 августа 2011

Я пытаюсь прочитать XML в JSP и передать то же самое по сети, как char [] в апплет, но я получаю java.io.StreamCorruptedException: неверный заголовок потока: 3C3F786D

мой JSP:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import = "java.util.*" %> 
<%@ page import = "java.io.*" %> 
<%@ page trimDirectiveWhitespaces="true" %> 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<%  String xmlname=(String)request.getAttribute("xmlname");
     int ch;    
    System.out.println("the value of the xml is "+xmlname);
    String filepath="C:/Users/ashutosh_k/idoc/docRuleTool/WebContent/data/Malaria.xml";
    FileReader fis = new FileReader(new File(filepath));
    char bin[] = new char[(int) new File(filepath).length()];
    fis.read(bin);
    response.getWriter().write(bin);
    fis.close();
%>
</body>
</html>

Код моего апплета:

package com.vaannila.utility;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import prefuse.util.ui.JPrefuseApplet;

public class dynamicTreeApplet extends JPrefuseApplet {

    private static final long serialVersionUID = 1L;
    public static int i = 1;

    public void init() {
        System.out.println("the value of i is " + i);
        URL url = null;
        try {
            url = new URL("http://localhost:8080/docRuleTool/XmlResponseReading.jsp");
            URLConnection con = url.openConnection();
            con.setDoOutput(true);
            con.setDoInput(true);
            con.setUseCaches(false);
            //con.setRequestProperty("Content-TYpe", "application/octet-stream");
            ObjectOutputStream oos =  new ObjectOutputStream(con.getOutputStream());
            oos.writeObject("Malaria");
            oos.flush();
            oos.close();
            InputStream ois =  con.getInputStream();
        //  ByteArrayOutputStream bos = new ByteArrayOutputStream();
            while (true) {
                byte b[] = new byte[1024];
                int retval = ois.read(b);
                if (retval < b.length) {
                    if (retval > 0) {
                        byte b1[] = new byte[retval];
                        System.arraycopy(b, 0, b1, 0, retval);

                        ois.read(b1);
                        System.out.println(new String(b1));
                    }
                    break;
                } else {
                    ois.read(b);
                    System.out.println(new String(b));

                }

            }

//          ByteArrayInputStream bis = new ByteArrayInputStream(ois.toByteArray());
            this.setContentPane(dynamicView.demo(ois, "name"));
            ois.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException f) {
            f.printStackTrace();

        } catch (IOException io) {
            io.printStackTrace();
        }
        ++i;
    }

}

Ответы [ 2 ]

0 голосов
/ 21 августа 2011

В вашем коде много проблем:

  • Вы отправляете XML внутри HTML-страницы своему клиенту.Вы не должны иметь HTML разметки вокруг вашего XML.Иначе это больше не XML.
  • вы используете скриптлеты в своих JSP.JSP должны использоваться для генерации разметки и ничего больше.Поместите код, который читает параметры запроса, читает файл и т. Д., В сервлет, где код Java можно правильно писать, анализировать, реорганизовывать и разрабатывать, а не в JSP.JSP должны содержать разметку, теги JSP и выражения EL.Не Java-код.
  • Вы используете платформенную кодировку по умолчанию для чтения XML-файла, который, возможно, закодирован в какой-то другой кодировке.Вы должны прочитать XML-файл в байтах и ​​отправить его в ответ OutputStream.XML-файл определяет его кодировку, поэтому анализатор XML получателя может использовать соответствующую кодировку для преобразования потока байтов в XML-документ
  • Вы не читаете файл должным образом.Один вызов fis.read не гарантирует, что весь файл был прочитан.Прочитайте javadoc методов, которые вы используете, и прочитайте учебник Java по IO.
  • Вы используете ObjectOutputStream для отправки параметра запроса HTTP.ObjectOutputStream используется для отправки сериализованных объектов.Он не используется для отправки параметров HTTP.URL должен быть http://localhost:8080/docRuleTool/XmlResponseReading.jsp?xmlname=Malaria, и вы не должны ничего отправлять в потоке вывода соединения.Вы должны узнать, как работает HTTP.
  • код, который читает из потока ввода (в апплете), также неверен.Прочитайте учебник Java по IO.
  • еще раз, в апплете вы используете кодировку платформы по умолчанию для преобразования байтового массива в строку.Используйте синтаксический анализатор XML для чтения вашего XML.
0 голосов
/ 21 августа 2011

Для ответа на сервере необходимо установить тип контекста 'text / xml'.

...