2011-07-20 1 views
1

В большинстве моих приложений GWT-RPC использует связь между сервисом и клиентом. Однако несколько классов нужно построить запрос GET вручную «строка разбив» в URL с различным Params, как это ...Путь к marshall/unmarchall Строки/объекты через механизм RPC в GWT без использования реального сервлета RPC

public static String getTemplateImage(String templateInstanceId, PageImage pageImage) { 
    return GWT.getHostPageBaseURL() + TEMPLATE_INSTANCE_IMAGE_SERVLET_PATH 
      + "?templateInstanceId=" + templateInstanceId 
      + "&fileName=" + pageImage.getImageId() 
      + "&isBackground=false" 
      + "&cropX=" + pageImage.getCropX() 
      + "&cropY=" + pageImage.getCropY() 
      + "&cropWidth=" + pageImage.getCropWidth() 
      + "&cropHeight=" + pageImage.getCropHeight(); 
} 

мне было интересно, есть ли способ контрейлерных довольно удивительный объект GWT-RPC GWT в маршаллер, чтобы сделать это?

public static String getTemplateImage(String templateInstanceId, PageImage pageImage) { 
    return GWT.getHostPageBaseURL() + TEMPLATE_INSTANCE_IMAGE_SERVLET_PATH 
      + "?templateInstanceId=" + templateInstanceId 
     + "&pageImage=" + SomeGWTClass.toRpcString(pageImage) 
     ; 
} 

Тогда на стороне сервлета это сделать ...

@Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     final String templateInstanceId = req.getParameter("templateInstanceId"); 
     final String strPageImage= req.getParameter("pageImage"); 
     **final PageImage pageImage = SomeGWTClass.unmarshallString(PageImage.class,strPageImage);**  
} 

ответ

0

Я не будет ли GWT RPC быть хорошей идеей использовать этот способ. Классы сериализации GWT, расположенные в пакетах com.google.gwt.user.client.rpc и com.google.gwt.server.rpc, являются внутренними классами GWT, и вы не должны называть его кодом приложения (это нормально, если вы пишете структуру общего назначения, и вы готовы настроить его, когда новая версия корабля GWT, возможно, с нарушением изменений в API этих классов).

Причина, по которой такая универсальная функциональность трудно найти в GWT, заключается в том, что ей не хватает поддержки отражения Java. Однако вы можете перейти на JavaScript, чтобы вернуть часть этой гибкости. Например, если вы можете превратить свой класс PageImage в тип Overlay GWT, вы можете использовать new JSONObject(pageImage).toString() для маршалирования объекта в json. Библиотека JSON, такая как XStream, может превратить эту строку обратно в объект Java на сервере.

См. Это question для получения более подробной информации о технике наложения типа GWT.

0

В принципе, можно сделать что-то подобное, но это будет довольно сложно реализовать. Серверная часть довольно проста, проблема будет на стороне клиента.

Поскольку GWT не имеет отражения, он генерирует в классах времени компиляции, таких как FieldSerializer. Для любого класса, переданного через службу GWt-RPC, GWT создаст FieldSerializer, который знает, как сериализовать/десериализовать объект.

Для того, чтобы использовать эту функциональность, вам необходимо создать какую-то инфраструктуру, где вы укажете, что хотите сериализовать/десериализовать какой-либо объект, определить пользовательский генератор, который будет генерировать все необходимое, и т. д.

Но есть и простой способ (но это очень грязный хак, я не рекомендую его использовать, но кто заботится =). Добавьте классы, которые вы хотите сериализовать, к некоторому сервису GWT-RPC, чем запустить компилятор с опцией -gen. Он будет записывать все эти FieldSerializer на диск. Чем вы можете просто включить их в свое приложение и использовать их. Но вам придется восстанавливать их каждый раз, когда вы меняете сериализованный класс. Это довольно хак, но мы использовали его несколько раз для целей отладки.

Так что выбор за вами. Я лично рекомендовал бы забыть о Mecahnism GWT-RPC и использовать наложение-тип + JSON parse/stringify

 Смежные вопросы

  • Нет связанных вопросов^_^