
- •14. Применение Веб-методов. Технология Jasp
- •14.1. Веб-сервисы
- •14.1.1. Введение
- •14.1.2. Веб-службы в asp.Net
- •14.1.3. Доступ к Веб-сервисам в управляемом коде
- •14.1.3.1. Взаимодействие клиент-сервер для клиентов ajax
- •14.1.3.2. Клиентская архитектура технологии ajax
- •14.1.3.3. Серверная архитектура ajax
- •Xml-сериализация. Уровень связи Веб-служб поддерживает xml-сериализацию для soap-запросов к Веб-службам и возвращения типов xml по json-запросам к Веб-службам.
- •14.1.4. Создание Веб-сервиса
- •14.1.4.1. Директива обработки WebService
- •14.1.5. Выполнение http-запросов из клиентского сценария ajax
- •14.1.6. Предоставление доступа к Веб-службам в клиентском сценарии
- •14.1.6.1. Предоставление доступа к сервисам из клиентского сценария на Веб-странице asp.Net
- •14.1.6.2. Примеры
- •14.1.7. Ключевые термины
- •14.2. Технология Jasp
- •14.2.1. Введение
- •14.2.2. "Hello World" на Jasp
- •14.2.3. Создание страницы с разметкой, скриптом и стилями
- •14.2.4. Ресурсы в Jasp
- •14.2.4.1. Css ресурсы
- •14.2.4.2. JavaScript ресурсы
- •14.2.4.3. Html ресурсы
- •14.2.4.4. Бинарные ресурсы
- •14.2.5. Страницы и компоненты
- •14.2.5.1. Создание страниц
- •14.2.5.2. Создание компонент
- •14.2.5.2.1. Создание экземпляров компонент программно
- •14.2.5.2.2. Создание экземпляров компонент через разметку
- •14.2.5.2.3. Создание экземпляров компонент на JavaScript
- •14.2.6. Передача данных на клиентскую сторону
- •14.2.7. Наследование компонент и страниц
- •14.2.7.1. Наследование разметки
- •14.2.7.2. Наследование стилей
- •14.2.7.3. Наследование JavaScript
- •14.2.8. Конфигурирование Jasp
- •14.2.9. Ключевые термины
- •14.3. Краткие итоги
14.2.7.3. Наследование JavaScript
Наследование JavaScript в Jasp реализовано через прототипы. Оно очень похоже на классическое наследование в объектно-ориентированном программировании (ООП). При определении новых методов, они будут переопределять родительские. В новом методе можно вызвать базовый метод. Например, JavaScript базового компонента:
{
hi: function() {
alert('Базовый привет!');
}
}
И производного:
{
hi: function() {
alert('Привет!');
BaseFooControl.prototype.call(this);
}
}
Для библиотек, которые поддерживают наследование через прототипы (например, ExtJS) можно задать базовый класс для компонента из библиотеки с помощью атрибута ClientBaseAttribute:
[ClientBase("Ext.Window")]
public class FooControl : UserControl
{
//....
public FooControl(int fooId)
{
// подгружаем необходимые данные
}
}
Клиентский код:
{
onFooButtonClick: function() {
// Создаем FooControl
// происходит вызов серверного конструктора – в нем можно подгрузить необходимые данные
// и вызов $init – в нем инициализировать окно, подставить загруженные данные
var fooControl = new FooControl({
arg: [1] // параметры конструктора
});
// Показываем окно (метод show наследован из ExtJs)
fooControl.show();
}
// ...
}
Благодаря этому, компонент на Jasp будет являться одновременно и компонентом ExtJS (либо другой библиотеки). Чтобы не было конфликтов с другими библиотеками, каждое свойство или функция на клиентской стороне начинается с $. Так, например, удается избежать конфликтов идентификаторов (id) или часто распространенных имен функций (init).
14.2.8. Конфигурирование Jasp
Jasp конфигурируется с помощью собственной секции в файле web.config.
Также необходимо добавить HttpHadler и WebServer Hadler, чтобы ASP.NET начал обрабатывать запросы Jasp. Если параметры не определены, Jasp конфигурируется в зависимости от конфигурации сборки. Если сборка Jasp собрана в Debug режиме, параметры оптимизированы для отладки, если сборка собрана в Release режиме, то параметры оптимизированы для производительности. В табл. 11.3 перечислены параметры конфигурации, которые поддерживает Jasp.
Таблица 14.3. Параметры конфигурации Jasp | ||||
Название |
Описание |
Значение в Release |
Значение в Debug |
Тип |
deployPath |
Путь, относительный от корня сайта, куда "распаковывать" бинарные ресурсы сборки. |
deploy |
deploy |
String |
resourceFilter |
Полное имя класса, который фильтрует все текстовые ресурсы, обрабатываемые Jasp. |
Jasp.Resources.ResourceFilter, Jasp |
Jasp.Resources.ResourceFilter, Jasp |
String |
gzipEnabled |
Включен ли GZIP. |
True |
False |
Boolean |
watchResources |
Включено ли слежение за изменением текстовых ресурсов. |
False |
True |
Boolean |
compressJavaScript |
Включено ли сжатие JavaScript (удаление комментариев, лишних пробелов и т.п.). |
True |
False |
Boolean |
clientCaching |
Включена ли отправка HTTP заголовков кэширования. |
True |
False |
Boolean |
indentHtml |
Включено ли форматирование HTML. |
False |
True |
Boolean |
exceptionFormatter |
Полное имя класса, занимающегося форматирование исключения в JSON-объект. |
Jasp.Web.ExceptionFormatter, Jasp |
Jasp.Web.ExceptionFormatter, Jasp |
String |
Параметр resourceFilter определяет класс, экземпляр которого будет заниматься фильтрацией текстовых ресурсов. Если нам нужно как-то отформатировать текстовый ресурс, например, удалить лишние пробелы или подменить ссылки, то можно создать класс, наследованный от класса Jasp.Resources.ResourceFilter и переопределять метод Filter(string name, StringBuilder data). Отфильтрованный ресурс впоследствии кэшируется. Для примера, переопределив этот параметр, можно производить замену путей в CSS-файлах библиотеки ExtJS автоматически, чтобы при обновлении этих файлов ничего не забыть.
Параметр exceptionFormatter используется для указания класса, экземпляр которого форматирует исключение при RPC-вызовах в JSON-объект. Если вам необходимо при возникновении исключения выводить дополнительные данные, например лог nHibernate, то это без труда можно сделать, переопределив метод Format класса Jasp.Web.ExceptionFormatter.
Узнав, что все ресурсы в Jasp должны быть embedded resource, многие думают, что для вступления в силу изменений в HTML, CSS или в JavaScript необходимо перекомпиляция проекта. За это отвечает параметр watchResources. Если он установлен в True, то Jasp следит за ресурсами, и при изменении автоматически их "подхватывает".