Несколько учебных руководств по страницам в Google Web Toolkit (GWT)

Реляционные базы данных - пустая трата времени. Вместо этого используйте объектные базы данных!

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

Конечно, иногда в хорошо поддерживаемой базе данных они предлагают быстрый ответ на сложный запрос. Но цена, которую вы платите за это, слишком высока! Вы должны выбирать между написанием необработанного SQL каждый раз, когда хотите прочитать запись ваших данных, что опасно. Или используйте объектный реляционный картограф, который добавляет больше сложности и вещей вне вашего контроля.

Что еще более важно, вам активно запрещается придумывать интеллектуальные алгоритмы поиска, потому что каждый проклятый обходной путь к базе данных стоит вам около 11 мс. Это слишком много. Представьте, что вы знаете этот алгоритм суперграфа, который ответит на конкретный вопрос, который в свое время может даже не выразиться в SQL !, Но даже если ваш алгоритм линейный, а интересные алгоритмы не линейные, не забудьте объединить его с реляционной базой данных, поскольку перечисление большой таблицы займет у вас часы!

Сравните это с SandstoneDb или Gemstone для Smalltalk! Если вы в Java, попробуйте db4o.

Итак, мой совет: используйте объектную базу данных. Конечно, они не идеальны, и некоторые запросы будут выполняться медленнее. Но вы будете удивлены, сколько будет быстрее. Потому что загрузка объектов не потребует всех этих странных преобразований между SQL и данными вашего домена. И если вам действительно нужна скорость для определенного запроса, в объектных базах данных есть оптимизатор запросов, которому вы должны доверять: ваш мозг.

60
задан Mat 30 April 2012 в 12:10
поделиться

4 ответа

В подобных ситуациях я обычно сначала разрабатываю структуру веб-страницы. У меня будет div для заголовка, бокового меню и нижнего колонтитула. У меня также будет div в моем HTML для основного содержимого.

Пример:

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta name='gwt:module' content='org.project.package.Core=org.project.package.Core'>
    </head>
    <body>
        <!-- Load the JavaScript code for GWT -->
        <script language="javascript" src="ui/org.project.package.ui.Core.nocache.js"></script>

        <!-- For some unknown reason in Internet Explorer you have to have cellpadding/spacing ON THE ELEMENT and not on the STYLE if it is in the body tag like this -->
        <table id="wrapper" cellpadding="0" cellspacing="0" style="width: 100%;height: 100%;">

             <!-- Header row -->
             <tr style="height: 25%;">
                 <td colspan="2" id="header"></td>
             </tr>

             <!-- Body row and left nav row -->
             <tr style="height: 65%;">
                 <td id="leftnav"></td>
                 <td id="content"></td>
             </tr>

             <!-- Footer row -->
             <tr style="height: 10%;">
                <td colspan="2" id="footer"></td>
             </tr>

        </table>

        <!-- This iframe handles history -->
        <iframe id="__gwt_historyFrame" style="width:0;height:0;border:0"></iframe>
    </body>
</html>

(Если вам нравятся макеты на основе

, не стесняйтесь использовать их вместо этого.)

Затем вы создаете свою точку входа (в моем случае Core.java ), как обычно, устанавливая каждый из элементов по мере необходимости.

RootPanel.get("header").add(new Header());
RootPanel.get("leftnav").add(new NavigationMenu());
RootPanel.get("footer").add(new Footer());

Конечно, можно иметь статический нижний колонтитул и заголовок, но это ни здесь, ни там.

У меня также есть абстрактный класс под названием «Content». Объекты содержимого расширяют "Composite" и будут иметь различные методы для упрощения создания и макета новой страницы. Каждая страница, которую я создаю для этого приложения, будь то экран справки, экран поиска, корзина для покупок или что-то еще имеет тип Content .

Теперь я создаю класс под названием ContentContainer. Это синглтон, отвечающий за управление элементом «контент». У него есть один метод setContent, который принимает объекты типа Content. Затем он в основном удаляет все, что находится в "content" , и заменяет его любым виджетом (Composite), который вы назначаете с помощью метода "setContent". Метод setContent также обрабатывает историю и управление строкой заголовка. По сути ContentContainer служит для объединения всех различных точек привязки, которые вам, возможно, придется сделать, если содержимое каждой страницы должно «знать» обо всех функциях, которые оно должно выполнять.

Наконец, вам нужен способ добраться до этой страницы, право? Это просто:

ContentContainer.getInstance().setContent(new Search());

Поместите вышеуказанное в событие по щелчку где-нибудь, и вы станете золотым.

Единственное, к чему должны быть привязаны другие ваши виджеты, - это ContentContainer и тип контента, который они добавляют.

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

Единственное, что он предлагает по сравнению с моим подходом, - это то, что все варианты выбора страниц являются довольно централизованными. Я бы использовал какой-то Enum или, по крайней мере, статический класс со значениями String, чтобы я не собирал ссылки.

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

74
ответ дан 24 November 2019 в 17:47
поделиться

Я бы использовал классы HyperLink и History. В классе Hyperlink хорошо то, что он устанавливает этот токен (например, # foobar), и все, что вам нужно сделать, это поймать событие, которое запускается при изменении значения токена (ValueChangeEvent). Затем в eventHandler вы замените страницы.

Пример: адрес страницы приветствия: www.yourpage.com/#home на этой странице будет ссылка на страницу "Обзор книги", при нажатии на ссылку новый адрес будет примерно таким: www.yourpage.com/#browse

И вот код:


public class MainEntryPoint implements EntryPoint, ValueChangeHandler {
    VerticalPanel panel = new VerticalPanel();
    Label label=new Label();
    public void onModuleLoad() {
        Hyperlink link1 = new Hyperlink("books", "browse");
        Hyperlink link2 = new Hyperlink("user details", "details");
        panel.add(link1);
        panel.add(link2);
        panel.add(label);
        RootPanel.get().add(panel);
        History.addValueChangeHandler(this);
        //when there is no token, the "home" token is set else changePage() is called.
        //this is useful if a user has bookmarked a site other than the homepage.
        if(History.getToken().isEmpty()){
            History.newItem("home");
        } else {
            changePage(History.getToken());
        }
    }

public void onValueChange(ValueChangeEvent event) {
    changePage(History.getToken());
}
public void changePage(String token) {
    if(History.getToken().equals("browse")) {
        label.setText("Here would be some books");
    } else if (History.getToken().equals("details")) {
        label.setText("Here would be the user details");
    } else {
        label.setText("Welcome page");
    }
}

}

20
ответ дан 24 November 2019 в 17:47
поделиться

Если вы хотите, чтобы оно было ПОЛНЫМ AJAXified (как настольное приложение), конечно, вам понадобится только одна страница. Затем просто измените содержимое тела в зависимости от ссылки.

Кроме того, существует очень активная группа Google по GWT, и я знаю, что об этом уже спрашивали раньше, вам просто нужно использовать функцию «поиска».

5
ответ дан 24 November 2019 в 17:47
поделиться

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

-2
ответ дан 24 November 2019 в 17:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: