Конфигурация на стороне сервера для GWT - PullRequest
6 голосов
/ 18 сентября 2009

Попытка не изобретать колесо здесь. У меня есть страница Google Web Toolkit, которую я готовлю к развертыванию, но веб-сервис, с которым я общаюсь, будет иметь другой относительный адрес на развернутом сервере, чем мой локальный тестовый компьютер.

В связи с этим я ищу простой способ развертывания с помощью некоторого легко редактируемого файла конфигурации, в который я могу поместить основные настройки на стороне сервера. У меня есть пара идей о том, как это сделать, но они кажутся несколько странными, и мне кажется, что уже должно быть решение для такого рода проблем (в конце концов, настройки для каждого сервера ОЧЕНЬ распространены!)

Есть идеи?

Редактировать: Поскольку это, кажется, не привлекает большого внимания, позвольте мне изложить мои первоначальные мысли: сохранить статический файл локально для файлов GWT, которые я запрашиваю с помощью вызова AJAX, перед любой другой логикой , Когда файл возвращается, я анализирую свои данные и сохраняю их как глобально доступные переменные, затем позволяю запустить логику построения страницы. Кажется неуклюжим, и есть большой недостаток в ожидании возврата AJAX перед любой загрузкой, но это сработает. Есть лучшие предложения? (Пожалуйста?)

Мое решение: Я нашел решение самостоятельно, но оно довольно специфично для моего точного сценария, поэтому я не знаю, насколько оно будет полезным для обычного пользователя. В любом случае я опубликую это здесь, если кто-то найдет это полезным.

Страница, над которой я работаю, на самом деле является элементом управления GWT, встроенным в сайт ASP.net. Воспользовавшись этим и открыв класс словаря GWT, я собрал систему «настроек», подобную этой:

Во-первых, нужный мне параметр (в данном случае адрес веб-службы) задается в файле ASP.net Web.Config

<appSettings>
    <add key="serviceUrl" value="http://mySite.com/myService.asmx"/>
</appSettings>

На странице ASP, в которую встроен элемент управления GWT, я добавляю «статический» объект javascript, содержащий необходимые мне параметры конфигурации:

<head runat="server">
    <title>Picklist Manager</title>

    <script type="text/javascript" language="javascript">
        var AppConfig = {
            serviceUrl: "<%= ConfigurationManager.AppSettings["serviceUrl"] %>"
        };
    </script>
    <script type="text/javascript" language="javascript" src="gwtcontrol.nocache.js"></script> <!-- Include my GWT control -->
</head>

Наконец, в GWT я создаю статический класс «AppConfig», который предоставляет этот параметр следующим образом:

public class AppConfig {
    public static String serviceUrl = "defaultUrl";

    public static void Initialize() {
        Dictionary appConfig = Dictionary.getDictionary("AppConfig");
        if(appConfig == null) { return; }

        servicePath = appConfig.get("serviceUrl");
    }
}

Оттуда я могу вызвать AppConfig.serviceUrl в любом месте моего кода, чтобы получить настройку ... Вот как! Так что да, это довольно длинный и сложный способ, но он работает для меня. Из ответов, данных Александром, кажется наиболее подходящим к тому, что я искал, так что награда достается ему, но спасибо всем, кто решил мою маленькую липкую проблему!

Ответы [ 3 ]

5 голосов
/ 21 сентября 2009

Не стесняйтесь меня поправлять, но, похоже, вам не требуется конфигурация на стороне сервера. В случае, если вам действительно нужна такая гибкость или вы хотите использовать один .zip для всех развертываний, вы можете использовать методику, приведенную в Правилах производительности Yahoo - (см. Раздел «Добавление устаревших или Cache-Control»). Заголовок) '- далекое будущее истекает заголовки. Это означает, что запрос AJAX будет сильно кэшироваться браузером и вызывать лишь незначительное замедление при первом запросе.

Вместо того, чтобы делать это, я бы фактически предложил использовать флаги времени компиляции и систему свойств, которую предлагает GWT. Чтобы упростить это, я сделал небольшой пакет под названием auto-config, доступный на github . Использование этого делает доступ к конфигурации развертывания очень простым. Добавьте следующий класс:

public interface MyConfiguration extends AutoConfiguration {
    public String getFoobar();
}

Чтобы получить доступ к значению из кода GWT, добавьте этот простой помощник:

private MyConfiguration getMyConfiguration() {
    return (MyConfiguration) GWT.create(MyConfiguration.class);
}

Создайте несколько разных файлов .gwt.xml, по одному для каждого сервера развертывания. Затем минимизируйте дублирование, используя родительский файл .gwt.xml. Для получения дополнительной информации по этой теме читайте CompileOnePermutation на GWT Wiki

В итоге добавьте следующий фрагмент в файл .gwt.xml для каждого развертывания (и обязательно добавьте строку необходимых наследов):

<set-configuration-property name="foobar" value="whee1234" />

Надеюсь, что помог:)

1 голос
/ 23 сентября 2009

Я немного озадачен тем, что вы просите.

Если вам нужно один раз скомпилировать и запустить приложение GWT на разных серверах с разными опциями, а также использовать опции на стороне клиента при сборке графического интерфейса, есть несколько опций.

Получить информацию в вашу программу, используя:

  • Переменная окружения
  • Системное свойство
  • Etc

Получите информацию на стороне клиента по:

  • AJAX-вызов файла (как вы указали)
  • Служите вашему графическому интерфейсу из JSP вместо статического HTML. Сделайте так, чтобы JSP включил информацию в переменную JS, к которой ваш GUI может получить доступ с помощью вызова JSNI. Это спасает вас от поездки туда и обратно.
1 голос
/ 21 сентября 2009

Кажется, что самый простой способ - хранить эту информацию о конфигурации где-нибудь доступным для кода server, т. Е. Ваши ServiceImpl классы.

У вас есть несколько вариантов для этого, как правило:

  • установить переменную окружения;
  • установить системное свойство;
  • поместить файл свойств в путь к классам;
  • найдите бин JNDI.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...