GWT fileUploader HTTP错误:404

时间:2014-08-05 09:25:00

标签: java google-app-engine gwt

我一直有 HTTP错误:404_Problem访问/Gwtuploader.html。原因:_notfound 在开发模式下运行我的应用程序时。我打算稍后上传到google_appengine。

我的控制台显示以下内容:

    Initializing App Engine server
Aug 05, 2014 12:13:16 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
INFO: Successfully processed C:\Users\user\workspace\gwtuploader\war\WEB-INF/appengine-web.xml
Aug 05, 2014 12:13:16 PM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
INFO: Successfully processed C:\Users\user\workspace\gwtuploader\war\WEB-INF/web.xml
Aug 05, 2014 12:13:16 PM com.google.appengine.tools.development.SystemPropertiesManager setSystemProperties
INFO: Overwriting system property key 'java.util.logging.config.file', value 'C:\Dev\eclipse\plugins\com.google.appengine.eclipse.sdkbundle_1.9.7\appengine-java-sdk-1.9.7\config\sdk\logging.properties' with value 'WEB-INF/logging.properties' from 'C:\Users\user\workspace\gwtuploader\war\WEB-INF\appengine-web.xml'
Aug 05, 2014 12:13:16 PM com.google.apphosting.utils.jetty.JettyLogger info
INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger
Aug 05, 2014 12:13:16 PM com.google.apphosting.utils.jetty.JettyLogger info
INFO: jetty-6.1.x
Aug 05, 2014 12:13:17 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed uploadServlet: java.lang.NoClassDefFoundError: javax/servlet/Servlet
Aug 05, 2014 12:13:17 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed com.google.appengine.tools.development.DevAppEngineWebAppContext@2f81fbd2{/,C:\Users\user\workspace\gwtuploader\war}: java.lang.NoClassDefFoundError: javax/servlet/Servlet
Aug 05, 2014 12:13:17 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed JettyContainerService$ApiProxyHandler@6907e6cb: java.lang.NoClassDefFoundError: javax/servlet/Servlet
Aug 05, 2014 12:13:17 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Error starting handlers
java.lang.NoClassDefFoundError: javax/servlet/Servlet
    at java.lang.ClassLoader.findBootstrapClass(Native Method)
    at java.lang.ClassLoader.findBootstrapClassOrNull(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.google.appengine.tools.development.DevAppServerClassLoader.loadClass(DevAppServerClassLoader.java:92)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:175)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:216)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.mortbay.util.Loader.loadClass(Loader.java:91)
    at org.mortbay.util.Loader.loadClass(Loader.java:71)
    at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:254)
    at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:288)
    at com.google.appengine.tools.development.AutomaticInstanceHolder.startUp(AutomaticInstanceHolder.java:26)
    at com.google.appengine.tools.development.AbstractModule.startup(AbstractModule.java:87)
    at com.google.appengine.tools.development.Modules.startup(Modules.java:105)
    at com.google.appengine.tools.development.DevAppServerImpl.doStart(DevAppServerImpl.java:258)
    at com.google.appengine.tools.development.DevAppServerImpl.access$000(DevAppServerImpl.java:47)
    at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:213)
    at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:211)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:211)
    at com.google.appengine.tools.development.gwt.AppEngineLauncher.start(AppEngineLauncher.java:97)
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:522)
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1104)
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:844)
    at com.google.gwt.dev.DevMode.main(DevMode.java:322)

Aug 05, 2014 12:13:17 PM com.google.apphosting.utils.jetty.JettyLogger info
INFO: Started SelectChannelConnector@0.0.0.0:8888
Aug 05, 2014 12:13:17 PM com.google.appengine.tools.development.AbstractModule startup
INFO: Module instance default is running at http://localhost:8888/
Aug 05, 2014 12:13:17 PM com.google.appengine.tools.development.AbstractModule startup
INFO: The admin console is running at http://localhost:8888/_ah/admin
Aug 05, 2014 12:13:17 PM com.google.appengine.tools.development.DevAppServerImpl doStart
INFO: Dev App Server is now running

我的文件如下:

uoloaderservlet.java文件

package gwtuploader.mygwt.server;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.List;

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

import org.apache.commons.fileupload.FileItem;

import gwtupload.server.UploadAction;
import gwtupload.server.exceptions.UploadActionException;
import gwtupload.shared.UConsts;

public class uploaderservlet extends UploadAction {

    private static final long serialVersionUID = 1L;

      Hashtable<String, String> receivedContentTypes = new Hashtable<String, String>();


      Hashtable<String, File> receivedFiles = new Hashtable<String, File>();


      public String executeAction(HttpServletRequest request, List<FileItem> sessionFiles) throws UploadActionException {
            String response = "";
            for (FileItem item : sessionFiles) {
              if (false == item.isFormField()) {
                try {
                  /// Create a new file based on the remote file name in the client
                  // String saveName = item.getName().replaceAll("[\\\\/><\\|\\s\"'{}()\\[\\]]+", "_");
                  // File file =new File("/tmp/" + saveName);

                  /// Create a temporary file placed in /tmp (only works in unix)
                  // File file = File.createTempFile("upload-", ".bin", new File("/tmp"));

                  /// Create a temporary file placed in the default system temp folder
                  File file = File.createTempFile("upload-", ".bin");
                  item.write(file);

                  /// Save a list with the received files
                  receivedFiles.put(item.getFieldName(), file);
                  receivedContentTypes.put(item.getFieldName(), item.getContentType());

                  /// Send a customized message to the client.
                  response += "File saved as " + file.getAbsolutePath();

                } catch (Exception e) {
                  throw new UploadActionException(e);
                }
              }
            }

            /// Remove files from session because we have a copy of them
            removeSessionFileItems(request);

            /// Send your customized message to the client.
            return response;
          }

          /**
           * Get the content of an uploaded file.
           */
          @Override
          public void getUploadedFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
            String fieldName = request.getParameter(UConsts.PARAM_SHOW);
            File f = receivedFiles.get(fieldName);
            if (f != null) {
              response.setContentType(receivedContentTypes.get(fieldName));
              FileInputStream is = new FileInputStream(f);
              copyFromInputStreamToOutputStream(is, response.getOutputStream());
            } else {
              renderXmlResponse(request, response,ERROR_ITEM_NOT_FOUND);
           }
          }

          /**
           * Remove a file when the user sends a delete request.
           */
          @Override
          public void removeItem(HttpServletRequest request, String fieldName)  throws UploadActionException {
            File file = receivedFiles.get(fieldName);
            receivedFiles.remove(fieldName);
            receivedContentTypes.remove(fieldName);
            if (file != null) {
              file.delete();
            }
          }}

GWTuploader.java 文件

package gwtuploader.mygwt.client;

import gwtupload.client.IFileInput.FileInputType;
import gwtupload.client.IUploadStatus.Status;
import gwtupload.client.IUploader;
import gwtupload.client.IUploader.OnFinishUploaderHandler;
import gwtupload.client.ModalUploadStatus;
import gwtupload.client.SingleUploader;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.RootPanel;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class Gwtuploader implements EntryPoint {


    Button dou = new Button("Do Upload");

    FlowPanel flow = new FlowPanel();

    @Override
    public void onModuleLoad() {

        SingleUploader uploader = new SingleUploader(FileInputType.LABEL, new ModalUploadStatus(), dou);
        //uploader.setServletPath("dou.file");
        flow.add(uploader);
        RootPanel.get().add(flow);
        uploader.addOnFinishUploadHandler(new uploaderOnFinishUploaderHandler());

    }


    private class uploaderOnFinishUploaderHandler implements OnFinishUploaderHandler{

        @Override
        public void onFinish(IUploader uploader) {
             if (uploader.getStatus() == Status.SUCCESS) {
                  Window.alert("Server response: \n" + uploader.getServerResponse());
                  uploader.reset();     
             }
        }

    }
}

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 -->

  <context-param>
    <!-- max size of the upload request -->
    <param-name>maxSize</param-name>
    <param-value>3145728</param-value>
  </context-param>
  <context-param>
    <!-- Useful in development mode to slow down the uploads in fast networks.
         Put the number of milliseconds to sleep in each block received in the server.
         false or 0, means don't use slow uploads  -->
    <param-name>slowUploads</param-name>
    <param-value>200</param-value>
  </context-param>

  <servlet>
    <servlet-name>uploadServlet</servlet-name>
    <servlet-class>gwtuploader.mygwt.server.uploaderservlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>uploadServlet</servlet-name>
    <url-pattern>*.gupld</url-pattern>
  </servlet-mapping>

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

</web-app>

最后 GWTuploader.gwt.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
  When updating your version of GWT, you should also update this DTD reference,
  so that your app can take advantage of the latest GWT module capabilities.
-->
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.6.0//EN"
  "http://google-web-toolkit.googlecode.com/svn/tags/2.6.0/distro-source/core/src/gwt-module.dtd">
<module rename-to='gwtuploader'>
  <!-- Inherit the core Web Toolkit stuff.                        -->
  <inherits name='com.google.gwt.user.User'/>

  <!-- Inherit the default GWT style sheet.  You can change       -->
  <!-- the theme of your GWT application by uncommenting          -->
  <!-- any one of the following lines.                            -->
  <inherits name='com.google.gwt.user.theme.clean.Clean'/>
  <!-- <inherits name='com.google.gwt.user.theme.standard.Standard'/> -->
  <!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
  <!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/>     -->

  <!-- Other module inherits                                      -->

  <inherits name="gwtupload.GWTUpload"/>
  <!-- Load dinamically predefined styles in the library when the application starts -->
  <stylesheet src="Upload.css"/>

  <!-- Specify the app entry point class.                         -->
  <entry-point class='gwtuploader.mygwt.client.Gwtuploader'/>

  <!-- Specify the paths for translatable code                    -->
  <source path='client'/>
  <source path='shared'/>

  <!-- allow Super Dev Mode -->
  <add-linker name="xsiframe"/>
</module>

0 个答案:

没有答案