Java GWT使用RequestFactory命中HTTP servlet
如果可能的话,我想将GWT的Java GWT使用RequestFactory命中HTTP servlet,java,gwt,servlets,requestfactory,Java,Gwt,Servlets,Requestfactory,如果可能的话,我想将GWT的RequestFactory用于所有客户机-服务器通信。我的理解是,您必须在web.xml中将/gwtServlet映射到RequestFactoryServlet,然后使用@Service注释告诉RequestFactoryServlet如何将客户端请求映射到相应的服务 有人能在客户端和服务器端提供此过程的完整代码示例吗?我想将小部件对象从客户端发送到服务器端的WidgetProcessor服务: public class Widget { // This
RequestFactory
用于所有客户机-服务器通信。我的理解是,您必须在web.xml
中将/gwtServlet
映射到RequestFactoryServlet
,然后使用@Service
注释告诉RequestFactoryServlet
如何将客户端请求映射到相应的服务
有人能在客户端和服务器端提供此过程的完整代码示例吗?我想将小部件
对象从客户端发送到服务器端的WidgetProcessor
服务:
public class Widget {
// This is a domain object (POJO).
}
public class WidgetProcessor {
public void processWidget(Widget w) {
// Inspect the Widget. If certain properties contain certain
// values, place it on a queue. Else "process" the Widget
// and persist it to a DB.
if(w.containsSpecialValues())
QueueManager.sendToQueue(w);
else {
// Process widget...
WidgetDAO.save(w);
}
}
}
在非GWT上下文中,我只需定义一个WidgetProcessorServlet
,将其映射到/processWidget
,并使其看起来像:
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
WidgetProcessor widgetProcessor = new WidgetProcessor();
widgetProcessor.processWidget(getWidgetFromRequest(request));
}
这在
RequestFactory
-land中是如何工作的?提前感谢。您对RequestFactory场景有点困惑
你需要从这里开始-
浏览示例RequestFactory demo@DynatableRF代码-
下载示例RequestFactory demo@DynatableRF代码-
编辑-
RequestFactory示例与MVP、活动和编辑器框架纠缠在一起。需要花费大量的精力才能得出您的场景需要哪些RF、编辑器、MVP和活动的组合。您的小部件类将位于服务器端。在客户端,您将使用一个接口来表示小部件;此接口将是实际小部件对象的代理。您可以使用@ProxyFor注释将代理接口与类相关联。例如,如果服务器上有Widget类,则客户端上可以有WidgetProxy接口:
@ProxyFor(value = Widget.class)
public interface WidgetProxy extends EntityProxy {
}
代理包含实体属性的getter和setter,这些getter和setter在服务器上的类中镜像。请求工厂还需要一种方法来定位代理所关联的类,为此我使用了一个“定位器”类(尽管还有其他方法)。定位器也在@Proxy注释中指定:
@ProxyFor(value = Widget.class, locator = WidgetLocator.class)
WidgetLocator类也在服务器端。对于要插入或更新的每个小部件,需要创建RequestContext。RequestContext标识将对实体进行操作的方法。这些方法的实际实现还是在服务器端。。。您可以引入包含这些方法的单独类,也可以将它们添加到实体类(在您的示例中是小部件)。我更喜欢将它们划分为一个“DAO”类,将实体类(即小部件)限制为一个简单的bean。(您的DAO类名为WidgetProcessor)。客户端的RequestContext是扩展RequestContext接口的接口。RequestContext接口告诉请求工厂在服务器上的何处找到DAO,这就是您使用@Service注释的地方
看看Thomas Broyer的博客,可以得到一个很好的介绍:。我还发现《GWT在行动》(第二版)是一本有用的资源。我根据自己的学习经验创建了一个示例,这可能对您也很有用:;同样,这可能有用,也可能无用 这在RequestFactorys中是可能的,但在GWT-RPC中也是可能的。我更喜欢工厂 您将拥有以下类和接口: 在服务器上:
package com.foo.bar.server;
public class Widget {
//Your methods
public void yourInstanceMethod(){
//foo
}
public static void yourStaticMethod(){
//bar
}
public static void processWidget(Widget w){
WidgetProcessor widgetProcessor = new WidgetProcessor();
widgetProcessor.processWidget(getWidgetFromRequest(request));
}
}
WidgetProcessor
package com.foo.bar.server;
public class WidgetProcessor {
public void processWidget(Widget w) {
// Inspect the Widget. If certain properties contain certain
// values, place it on a queue. Else "process" the Widget
// and persist it to a DB.
if(w.containsSpecialValues())
QueueManager.sendToQueue(w);
else {
// Process widget...
WidgetDAO.save(w);
}
}
}
WidgetProxy
package com.foo.bar.server;
import com.foo.bar.server.Widget;
@ProxyFor(value = Widget.class)
public interface WidgetProxy extends EntityProxy{
//Your getter and Setter methods
}
WidgetRequest
package com.foo.bar.client;
import com.foo.bar.server.Widget;
@Service(value = Widget.class)
public interface WidgetRequest extends RequestContext{
InstanceRequest<WidgetProxy, Void> yourInstanceMethod();
Request<Void> yourStaticMethod();
Request<Void> widgetProcessor(WidgetProxy widget);
}
WidgetPresenter
package com.foo.bar.client;
public class WidgetPresenter {
private final WidgetRequestFactory rf = GWT.create(WidgetRequestFactory.class);
public WidgetPresenter() {
rf.initialize(new EventBus());
rf.widgetRequest().widgetProcessor().fire(new Receiver<Void>() {
@Override
public void onSuccess() {
//Do what you want to confirm to user...
}
});
}
}
package com.foo.bar.client;
公共类WidgetPresenter{
私有最终WidgetRequestFactory rf=GWT.create(WidgetRequestFactory.class);
公共WidgetPresenter(){
初始化(neweventbus());
rf.widgetRequest().widgetProcessor().fire(新接收器(){
@凌驾
成功时的公共无效(){
//执行您要向用户确认的操作。。。
}
});
}
}
另外:
如果您再次将处理后的小部件回复给用户,您会这样做:
@Service(value = Widget.class)
public interface WidgetRequest extends RequestContext{
...
Request<WidgetProxy> widgetProcessor(WidgetProxy widget);
}
public class Widget {
...
public static void processWidget(Widget w){
WidgetProcessor widgetProcessor = new WidgetProcessor();
return widgetProcessor.processWidget(getWidgetFromRequest(request));
}
}
public class WidgetProcessor {
public Widget processWidget(Widget w) {
// Inspect the Widget. If certain properties contain certain
// values, place it on a queue. Else "process" the Widget
// and persist it to a DB.
if(w.containsSpecialValues())
QueueManager.sendToQueue(w);
else {
// Process widget...
WidgetDAO.save(w);
}
return w;
}
}
public class WidgetPresenter {
private final WidgetRequestFactory rf = GWT.create(WidgetRequestFactory.class);
public WidgetPresenter() {
rf.initialize(new EventBus());
rf.widgetRequest().widgetProcessor().fire(new Receiver<WidgetProxy>() {
@Override
public void onSuccess(WidgetProxy response) {
WidgetView v = new WidgedView(response);
RootPanel.get().add(view);
}
});
}
}
package com.foo.bar.client;
public class WidgetView {
public WidgetView(WidgetProxy widget) {
//paint widget with widget
// widget.getSomeProperty(); etc.
}
}
import com.google.gwt.user.client.rpc.RemoteService;
public interface WidgetRPCInterface extends RemoteService
{
public Widget widgetProcessRPC(Widget myWidget);
}
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface WidgetRPCInterfaceAsync
{
public void widgetProcessRPCWidget myWidget, AsyncCallback callback);
}
@Service(value=Widget.class)
公共接口WidgetRequest扩展了RequestContext{
...
请求widgetProcessor(WidgetProxy小部件);
}
公共类小部件{
...
公共静态void processWidget(Widget w){
WidgetProcessor WidgetProcessor=新的WidgetProcessor();
返回widgetProcessor.processWidget(getWidgetFromRequest(request));
}
}
公共类WidgetProcessor{
公共小部件processWidget(小部件w){
//检查小部件。如果某些属性包含某些
//值,将其放置在队列中。否则“处理”小部件
//并将其保存到数据库中。
如果(w.包含特殊值())
QueueManager.sendToQueue(w);
否则{
//进程小部件。。。
保存(w);
}
返回w;
}
}
公共类WidgetPresenter{
私有最终WidgetRequestFactory rf=GWT.create(WidgetRequestFactory.class);
公共WidgetPresenter(){
初始化(neweventbus());
rf.widgetRequest().widgetProcessor().fire(新接收器(){
@凌驾
成功时公共无效(WidgetProxy响应){
WidgetView v=新WidgedView(响应);
RootPanel.get().add(视图);
}
});
}
}
包com.foo.bar.client;
公共类WidgetView{
公共WidgetView(WidgetProxy小部件){
//使用小部件绘制小部件
//getSomeProperty()等。
}
}
我认为没有必要为此对请求工厂进行头脑风暴
根据我的意见,使用Gwt-RPC
可以非常简单
简而言之,简单的RPC结构如下所示:
GWT Code <===> InterfaceAsync <===> Interface (Synchronous)<===> Server Code
异步接口(Ke)
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface WidgetRPCInterfaceAsync
{
public void widgetProcessRPCWidget myWidget, AsyncCallback callback);
}
public class WidgetRPCImpl extends RemoteServiceServlet implements RPCInterface
{
private static final long serialVersionUID = 1L;
public Widget widgetProcessRPCWidget myWidget)
{
//Process your widget here (CRUD operations)
//You can change return type and return what ever you want to client .
}
**you can override doget,doPost,doDelete....etc along with your methods
}
<servlet>
<servlet-name>widgetrpc</servlet-name>
<servlet-class>com.server.WidgetRPCImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>widgetrpc</servlet-name>
<url-pattern>/widgetrpc</url-pattern>
</servlet-mapping>
private final WidgetRPCInterfaceAsync widgetService =
GWT.create(WidgetRPCInterface.class);
ServiceDefTarget endpoint = (ServiceDefTarget) service;
endpoint.setServiceEntryPoint('widgetrpc');
widgetService.widgetProcessRPC(widgetFromClient, callback);
AsyncCallback callback = new AsyncCallback()
{
public void onFailure(Throwable caught)
{
//Do on fail
}
public void onSuccess(Object result)
{
//Process successfully done with result (result is which you
returned in impl class) .
}
};