2012-02-02 14 views
0

まず、Googleで時間を検索して、そのトピックについては何も検索しませんでした。 これは、私が間違ったやり方をしている、あるいは私が解決策を見越した理由かもしれません。XMLファイルのアップロードと解析(GWT経由)

私はGWTとAppengineを使用するアプリを持っていました。 XMLファイルをアップロードし、SAX-Parserで解析し、そのエントリをページに戻してArrayListを返します。

ローカルテストでは、Appengineの一部を削除しました。 私はGWTのセットアップ、commons-io & commons-fileuploadを持っていました。

これまでのところ、私はEntrypointとファイルアップロードを扱うためのサーブレットを作成しました。 XMLファイルのString表現を返すことは可能です。しかし、XMLファイルから情報を抽出して解析し、FlexTableに表示したいと考えています。だから私は、XMLファイルの私の要素を持つArrayListを作成し、私のエントリポイントクラスに返したいと思います。

エントリポイント:

public class XMLParser implements EntryPoint { 

    private static final String UPLOAD_ACTION_URL = GWT.getModuleBaseURL() + "upload"; 

    @SuppressWarnings("unused") 
    private Logger logger = Logger.getLogger("XMLParserLogger"); 

    private VerticalPanel mainPanel = new VerticalPanel(); 
    private FlexTable articleFlexTable = new FlexTable(); 
    private FileUpload fileUpload = new FileUpload(); 
    private FormPanel form = new FormPanel(); 


    /** 
    * This is the entry point method. 
    */ 
    public void onModuleLoad() { 


     fileUpload.setName("uploadFormElement"); 

     form.setAction(UPLOAD_ACTION_URL); 
     form.setEncoding(FormPanel.ENCODING_MULTIPART); 
     form.setMethod(FormPanel.METHOD_POST); 
     form.add(fileUpload); 


     //Table for Articles 
     articleFlexTable.setText(0, 0, "ID"); 
     articleFlexTable.setText(0, 1, "Amount"); 
     articleFlexTable.setText(0, 2, "Start Amount"); 
     articleFlexTable.setText(0, 3, "PCT"); 
     articleFlexTable.setText(0, 4, "Price"); 
     articleFlexTable.setText(0, 5, "Stock Value"); 

     mainPanel.add(form); 
     mainPanel.add(new Button("Submit", new ClickHandler() { 
      public void onClick(ClickEvent event) { 
        form.submit(); 
       } 
      })); 
     mainPanel.add(articleFlexTable); 

        form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() { 
         public void onSubmitComplete(SubmitCompleteEvent event) { 

          String xml = event.getResults(); 
          logger.info(xml); 
          Window.alert(xml); 
         } 
        }); 

     RootPanel.get("parser").add(mainPanel); 


    } 
} 

サーブレット:

public class FileUploadServlet extends HttpServlet { 

    private static final long serialVersionUID = -5897221701350776117L; 
    private static final Logger log = Logger.getLogger(FileUploadServlet.class 
      .getName()); 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
     super.doGet(req, resp); 
    } 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 

     // process only multipart requests 
     if (ServletFileUpload.isMultipartContent(req)) { 

      ServletInputStream sis = req.getInputStream(); 

      BufferedReader bufferedReader = new BufferedReader(
        new InputStreamReader(sis)); 
      StringBuilder stringBuilder = new StringBuilder(); 
      String line = null; 

      while ((line = bufferedReader.readLine()) != null) { 
       stringBuilder.append(line); 
      } 

      bufferedReader.close(); 

      String xml = stringBuilder.toString(); 

      log.info(xml); 
      resp.setContentType("text/html"); 
      resp.setStatus(HttpServletResponse.SC_CREATED); 
      resp.getWriter().print(xml); 
      resp.flushBuffer(); 

     } else { 
      resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, 
        "Request contents type is not supported by the servlet."); 
     } 
    } 

のweb.xml:

<!-- Servlets --> 
    <context-param> 
    <!-- max size of the upload request --> 
    <param-name>maxSize</param-name> 
    <param-value>3145728</param-value> 
    </context-param> 

    <servlet> 
    <servlet-name>uploadServlet</servlet-name> 
<servlet-class>net.mybecks.gwt.server.FileUploadServlet</servlet-class> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>uploadServlet</servlet-name> 
    <url-pattern>/xmlparser/upload</url-pattern> 
    </servlet-mapping> 

私はgwtupload、upload4gwtのようなLIBSを使用してみましたが、彼らは私の問題を解決しません文書化されていない。

私は、XMLファイルをアップロードしてコールバックとしてリストを返す方法を知りたいと思っています。私はすでに知っているSAXを介してファイルの解析。

BR、あなたのコードから mybecks

+0

を(あなたが望むようまたはJSONObjectJsonUtilsJavascript Overlay Typesを使用してJSONの出力を解析して、ArrayListを作成していますか? XMLを解析するには?どのようにサーバーからエントリポイントにArrayListを送信するには?何らかの理由でコードが機能しないのですか? – jusio

+0

さて、XMLファイルをサーバーにアップロードしてリストを返す方法を知りたい。私はすでに知っているこのファイルの解析方法。私はそれを質問に追加しました – mybecks

答えて

2

あなたが既にサーバーにファイルを取得し、それを取り戻すことができているようです。今、あなたは実際にサーバからクライアントに配列リストを送ることができないという面白い部分です。クライアントはjavascriptですが、arraylistは何もわかりません。サーバーは何らかの形式で応答を返す必要があり、クライアントはそれを独自のArrayListに解析する必要があります。 Json形式を使用するのが最も簡単な方法です。

だから、ワークフローは次のとおりです。

  1. クライアントは、ファイルを送信します。
  2. サーバーがファイルを解析し、JSON出力を生成しています。
  3. クライアントは、あなたが知りたい、まさにそれに基づいて
+0

これは、entrypointクラスでxml解析を行うことができるので、ファイルを2回解析する必要はありませんか? – mybecks

+0

@mybecksはい、エントリポイントクラスで解析することは可能です。問題は、すべてのブラウザがローカルファイルの読み込みをサポートしているわけではなく、GWTがデフォルトでこのAPIのバインディングを持っていないということです。また、サーバー側でXMLを解析し、JSONを使用してクライアントに結果を送信するよりも時間がかかることがあります(たとえば、XML解析の場合、クライアントでは利用できない情報が必要な場合があります。非常に複雑で、そこからの情報のほんの一部が必要です) – jusio

+0

あなたの助けに感謝します。それは魅力的です:) – mybecks

関連する問題