2

GWTとGoogleAppsを使用してアプリをホストしています。私はGWTとWebプログラミングの両方に慣れていないので(私の人生のほとんどをドライバーに費やしました)、うまくいけば、私は単に何かが欠けています。開発モードで完全に機能するサンプルコードをオンラインで見つけました。デプロイすると機能しません。Uploadクラスにコードを記述して、呼び出されたときにDBにデータを書き込みましたが、DBが変更されないため、サービスへの呼び出しが行われないようです。私が使用しているコードが含まれています。JSPコードを取り除くことができれば素晴らしいのですが、Blobstoreのものをインスタンス化することはできません。これをJavaに移行するのは素晴らしいことですが、まず最初に。

FileUpload.jsp:

<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %>
<%
    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
%>


<html>
    <head>
        <title>Upload Test</title>
    </head>
    <body>
        <form action="<%= blobstoreService.createUploadUrl("/upload") %>" method="post" enctype="multipart/form-data">
            <input type="text" name="foo">
            <input type="file" name="myFile" size="50">
            <input type="submit" value="Submit">
        </form>
    </body>
</html>

置き換える必要がある醜いダイアログですが、基本的にこれは機能します。ユーザーがファイル名を入力し、送信を押します。これで、サーバー側に次のコードがあります。

// Upload.java
public class Upload extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        DebugViaDb.writeDebugData("AA"); // I know my DB write code works as other parts of the code work with the DB
        HttpSession session = req.getSession(true);
        System.out.println("Session is " + session);

        Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req);
        BlobKey blobKey = blobs.get("myFile");

        if(blobKey == null) {
            res.sendRedirect("/");
        } 
        else {
            res.sendRedirect("/uploadServlet?blob-key=" + blobKey.getKeyString());
        }
    }
}

これはJSPによって呼び出され、JSPはアップロードサーブレットを呼び出します。

// UploadServlet.java
public class UploadServlet extends HttpServlet {    
            <edited>

        public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
            DebugViaDb.writeDebugData("BB");
            BlobKey blobKey = new BlobKey(req.getParameter("blob-key"));

        ...
        }
}

私のweb.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     version="2.5"
     xmlns="http://java.sun.com/xml/ns/javaee">

<!-- Servlets -->
<servlet>
  <servlet-name>myDataServiceImpl</servlet-name>
  <servlet-class>com.blah.server.MyDataServiceImpl</servlet-class>
</servlet>

<servlet>
  <servlet-name>Upload</servlet-name>
  <servlet-class>com.blah.server.Upload</servlet-class>
</servlet>

<servlet>
  <servlet-name>UploadServlet</servlet-name>
  <servlet-class>com.blah.server.UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>myDataServiceImpl</servlet-name>
  <url-pattern>/my/myData</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>Upload</servlet-name>
  <url-pattern>/upload</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>UploadServlet</servlet-name>
  <url-pattern>/uploadServlet</url-pattern>
</servlet-mapping>

<!-- Default page to serve -->
<welcome-file-list>
  <welcome-file>my.html</welcome-file>
</welcome-file-list>


</web-app>

したがって、問題は、これを開発モードで実行すると、すべてが完全に機能することです。デプロイすると、「アップロード」が呼び出されたようには見えません。サーバーでこれをデバッグするところまで行き詰まっているので、何が起こっているのかわかりません。ログファイルを取得する運はありません。

4

2 に答える 2

0

最初に頭に浮かぶのは、開発モードのURLにはコンテキストルートがないということです。したがって、warファイルの名前がmyapp.warの場合、URLは異なって見えます。ややこのように:

http://127.0.0.1:8888/index.jsp
http://localhost:8080/myapp/index.jsp

ページが更新されたときに、どこかに接続しようとすると、フォーム送信はどのhttpコードを返しますか?

于 2012-04-08T07:22:46.267 に答える
0

actionofformタグに設定されているURLに問題があるようです。

の値を印刷してみてください

   <%= blobstoreService.createUploadUrl("/upload") %>

開発モードと展開モードの両方で。

于 2012-04-09T03:55:40.013 に答える