我的Google App Engine平台上的JSF程序存在问题。我几乎完成了在Java EE中实现聊天应用程序,当我读到GAE不支持类 FileOutputStream 时。 通过这个类对象我创建文件,在其中写入聊天消息,并通过scirpt这个文件在index.xhtml网站上加载和刷新。
我需要帮助,因为我不知道哪个类可以替换 FileOutputStream 来完成此应用程序。我发现example in Python所以我知道这是可能的,但是如何用Java实现呢?
我将不胜感激任何帮助。
下面我使用 FileOutputSream 操作粘贴类ChatBean:
@Stateful
@ApplicationScoped
@ManagedBean(name="Chat")
public class ChatBean {
private List<String> users = new ArrayList<String>();
private String newUser;
FileOutputStream chatHtmlBufferWriter;
public ChatBean () throws IOException {
ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
String chatHtmlPath = ctx.getRealPath("/") + "chat";
try {
this.chatHtmlBufferWriter = new FileOutputStream(chatHtmlPath);
this.chatHtmlBufferWriter.write("Start chatu ąęć. <br />".getBytes("UTF-8"));
} catch (IOException ex) {
this.chatHtmlBufferWriter.close();
throw ex;
}
users.add("Admin");
}
@PreDestroy
public void closeFileBuffor() throws Exception {
this.chatHtmlBufferWriter.close();
}
public String addMessage(String msg) throws IOException {
this.chatHtmlBufferWriter.write(msg.getBytes("UTF-8"));
FacesContext.getCurrentInstance().getExternalContext().redirect("index.xhtml");
return "index";
}
...
}
index.xhtml文件中的脚本:
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
var currPos = 0;
var loadChat = function() {
$("#chatForm\\:chatbox").load('chat');
currPos = $(".chat")[0].scrollHeight;
$(".chat").scrollTop(currPos);
}
var scrollChat = function() {
$("#chatForm\\:chatbox").load('chat');
$(".chat").scrollTop(currPos);
}
var currPos;
$(document).ready(function() {
$("#chatForm\\:chatbox").load('chat', function(){
loadChat();
});
var refreshId = setInterval(function() {
scrollChat();
}, 1000);
$.ajaxSetup({ cache: false });
$("#chatForm\\:chatbox").scroll(function() {
currPos = $(".chat").scrollTop();
});
});
</script>
答案 0 :(得分:1)
基本上,你不能直接写入文件系统(尽管你可以阅读)。
您需要使用现有的GAE存储API之一,例如具有File like API的blobstore。其他选项详见Storing Data page。
然而,我不确定你是否正确地考虑过这个问题;您只想创建一个返回当前消息的GET方法,并由您的脚本调用。消息永远不会写入文件。首先,您可以将消息存储在内存中。我怀疑你链接的教程是一样的。
(更新:我最初说FileOutputStream在白名单中,但我看着FilterOutputStream
。哎呀。)