谢谢@xi-chen 和@richard-wallis
部分解决方案已在 gwt-storage github repo (https://github.com/seanchenxi/gwt-storage/issues/8#issuecomment-68443910)
上进行了讨论
所以使用 GWT RPC 机制 + gwt-storage 完全有可能:
index.jsp
<%@page import="com.google.gson.Gson"%>
<%@page import="com.learnkeeper.server.ServiceImpl"%>
<%@page import="com.google.gwt.user.server.rpc.RPC"%>
<%@page import="com.learnkeeper.shared.entities.User"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<%
Object user = request.getSession().getAttribute("user");
String serialized_user = new Gson().toJson(RPC.encodeResponseForSuccess(ServiceImpl.class.getMethod("getUser"), user).substring("//OK".length()));
%>
<script type="text/javascript">var serialized_user=<%=serialized_user%>;</script>
</head>
<body>
请注意,您必须删除 RPC.encodeResponseForSuccess 结果开头的 //OK 子字符串。
User.java
public class User implements IsSerializable {
}
注意你必须实现 IsSerializable(Serializable 是不够的)
HostPageUtils.java
public class HostPageUtils {
private static final native String getSerializedUser() /*-{
return $wnd.serialized_user;
}-*/;
public static User getUser() {
final String serializedUser = getSerializedUser();
StorageSerializer storageSerializer = GWT.create(StorageSerializer.class);
try {
return storageSerializer.deserialize(User.class, serializedUser);
} catch (Exception e) {
throw new RuntimeException();
}
}
}