我正在使用GWT和Google Apps托管我的应用。由于我不熟悉GWT和网络编程(我的大部分时间都在做司机),希望我只是遗漏了一些东西。 我在网上找到了一些示例代码,它在开发模式下运行良好。部署时,它不起作用。我已经将代码放在Upload类中,以便在调用时将数据写入数据库,但看起来我的服务调用永远不会发生,因为数据库永远不会更改。 包括我正在使用的代码。如果我能摆脱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调用,后者又调用我的上传servlet:
// 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>
所以,问题是,当我在开发模式下运行时,一切都很完美。当我部署时,看起来好像没有调用“上传”。我在服务器上调试这个问题很困难,所以我不确定是怎么回事。没有运气获得日志文件。
答案 0 :(得分:0)
首先想到的是,开发模式中的任何URL都缺少上下文根。因此,如果您的war文件名为myapp.war,则网址会有所不同。有点像这样:
http://127.0.0.1:8888/index.jsp
http://localhost:8080/myapp/index.jsp
在刷新页面时,表单提交会返回什么http代码,假设它确实尝试连接某个地方?
答案 1 :(得分:0)
问题似乎与action
form
标记 <%= blobstoreService.createUploadUrl("/upload") %>
中设置的网址有关。
尝试打印
的值{{1}}
在开发和部署模式中。