Java
Apply
Синтаксисapply(thisArg, argArray)
Параметры
thisArg ( вызываемый объект )
arg1, arg2, ... ( параметры вызываемого объекта )
apply позволяет применять методы одних объектов в контексте других ( вызывающих ). Так же как и в call объект this может принимать заданное значение ( this будет указывать на текущий, вызвавший объект ). Apply очень напоминает call, отличие лишь в типах параметров ( аргументов ) вызываемого объекта. В методе apply возможно использование любых типов массивов. Например: apply(this, new Array(name, value)). Разрешается так же использовать свойства вызываемого объекта. Можно использовать arguments для передачи всех параметров вызываемому обекту.
Пример:
function product(name, value) { this.name = name; if(value > 1000) this.value = 999; else this.value = value; } function prod_dept(name, value, dept) { this.dept = dept; product.apply(product, arguments); } prod_dept.prototype = new product(); cheese = new prod_dept(feta, 5, food); car = new prod_dept(honda, 5000, auto);
Архитектура сервлета
Разобьем нашу программу на две части. Первая часть - сервлет - отвечает за обработку HTTP запроса и возвращает клиенту требуемое изображение, если это возможно. Вторая часть, класс, формирующий картинку. Для простоты реализации, в качестве параметра при обращении к сервлету будет передаваться имя используемого класса. Соответствующий Java класс должен реализовывать определенный интерфейс для общения с сервлетом. Приведем описание этого интерфейса:public interface ImageProducer {
/** * MIME тип создаваемого изображения. * * @return MIME тип изображения. */ public String getMIMEType();
/** * Создает изображение и записывает его в указанный поток. * * @param stream Куда писать картинку. */ public void createImage(OutputStream stream) throws IOException; }
Интерфейс ImageProducer содержит метод для определения типа изображения и метод для формирования изображения. Полученная картинка отправляется клиенту.
Следующий код демонстрирует, как сервлет работает с классами, реализующими интерфейс ImageProducer:
ImageProducer imageProducer =
(ImageProducer) Class.forName(request.getQueryString()).newInstance(); response.setContentType(imageProducer.getMIMEType()); imageProducer.createImage(response.getOutputStream());
Сервлет создает (загружается) класс с именем, указанным в параметрах запроса - части URL справа после "?". Полученный класс приводится к типу ImageProducer. Затем, обращаясь к соответствующим методам, сервлет получает тип и формирует изображение. В случае если нет ошибок, картинка пересылается клиенту.
Приведенный код может вызвать несколько исключений, наиболее распространенные из них: ClassNotFoundException и ClassCastException. Первое вызвано тем, что класс, имя которого передано в качестве параметра запроса, не доступен загрузчику (ClassLoader), второе же тем, что указанный класс не реализует интерфейс ImageProducer. В случае ошибки клиент, конечно же, не получает картинку, и броузер выводит изображение, показывающее, что сервер не ответил на запрос. Программа тестировалась с использованием Java Server Web Development Kit (JSWDK 1.0.1), но вы должны получить аналогичные результаты на большинстве других Веб серверах, поддерживающих Java.