BD_lektsia_Annotatsii_servlet3.pptx
- Количество слайдов: 42
Аннотации и Servlet 3. 0 Рогальчук В. В. Кафедра «Информационные и вычислительные системы»
Java Enterprise Edition
Сервисы JEE p p p JTA – java transaction API JPA – java persistence API JMS – java messaging system JNDI – java naming and directory interface Java. Mail и JAF – javabean activation framework Обработка XML – JAXP, JAXB, St. AX… JCA – java connector architecture Security – JAAS (J Authentication and Authorization Service), JACC Web Services – JAX-WS и JAX-RS Management – java management extensions …. .
Web-related технологии Servlet p JSP p EL p JSTL p JSF p
JEE 6 – Что нового? p p «Pruning» - подчищены устаревшие спецификации Профили – Web и Full – 8 vs 28 спецификаций Упрощение использования n Аннотации n Опциональные и фрагментированные XMLдескрипторы n CDI и DI n … «Горячие» технологии n RESTful Services n JSON n …
JEE 6 Web Profile Servlet 3. 0 n JSP 2. 2 n Expression Language 1. 2 n JSTL 1. 2 n JSF 2. 0 n JPA 2. 0 n JTA 1. 1 n EJB Lite 3. 1 n
Servlet 3. 0 Аннотации p Упрощение конфигурирования p Асинхронная обработка запросов p pluggability p
Аннотации p @Resource(mapped. Name=“jms. Name”) p Мета-описания элементов программного кода + p+ p «правильный java-doc» могут быть получены рефлексивно во время работы программы
Синтаксис объявления public @interface Some. Annotation { String string. A(); String string. B() default "Hello"; String. C() default "World"; int id(); }
Синтаксис использования @Some. Annotation(string. A=“HELLO”, string. B=“ 910” string. C=“ 911”, id=“ 12345”) public class Hello. Class { … }
Специальные аннотации p Маркерная аннотация n p аннотация без элементов-полей Аннотация с единственным полем n String value(); n public @interface Copyright { String value(); } n @Copyright(“ 2012 ИВС ПГУПС") public class Some. Class. From. PSTU {. . . }
Встроенные в язык аннотации p Используемые компилятором n n n p @Deprecated @Override @Suppress. Warnings Описывающие аннотации (мета-аннотации) n n @Retention @Target @Inherited @Documented
@Retention p Retention. Policy. SOURCE n p Retention. Policy. CLASS n p аннотация присутствует только в исходном коде аннотация сохраняется в. class файле, но недоступна в runtime Retention. Policy. RUNTIME n Аннотация сохраняется в. class и доступна в runtime
@Retention(Retention. Policy. RUNTIME) @interface My. Annotation { String author(); String date(); }
@Retention @My. Annotation(author="Rogalchuk V. ", date="14. 11. 2012") public class Just. ATest { @My. Annotation(author="Rogalchuk V. ", date="14. 11. 2012") public static void annotated. Method() { System. out. println("Welcome to Annotations!"); } public static void main(String args[]) { annotated. Method(); } }
Доступ к аннотациям public static void print. Annotations() { Just. ATest test=new Just. ATest(); try { Class c= test. get. Class(); My. Annotation annotation 1= (My. Annotation)c. get. Annotation(My. Annotation. class); System. out. println("Автор класса: "+annotation 1. author()); System. out. println("Дата создания класса: "+annotation 1. date()); Method m=c. get. Method("test. Method"); if (m. is. Annotation. Present(My. Annotation. class) { My. Annotation annotation 2=m. get. Annotation(My. Annotation. class); System. out. println("Автор метода: "+annotation 2. author()); System. out. println("Дата создания метода: "+annotation 2. date()); } } catch(No. Such. Method. Exception ex) { System. out. println("Invalid Method. . . "+ex. get. Message()); } }
@Target Element. Type. PACKAGE p Element. Type. ANNOTATION_TYPE p Element. Type. METHOD p Element. Type. CONSTRUCTOR p Element. Type. FIELD p Element. Type. LOCAL_VARIABLE p
@Target и все-все @Documented @Retention(Retention. Policy. RUNTIME) @Target({Element. Type. TYPE, Element. Type. METHOD, Element. Type. FIELD}) @Inherited public @interface Unfinished. Job { public enum Priority { LOW, MEDIUM, HIGH } String value(); String[] changed. By() default ""; Priority priority() default Priority. MEDIUM; String created. By() default "Vyacheslav Rogalchuk"; String last. Changed(); }
@Target и все-все … @Unfinished. Job( changed. By=“RVV”, value=“Do or die!”, priority=Priority. HIGH ) public void big. Tedious. Chunk. Of. Code() { …. } …
А теперь вернемся к сервлетам
Servlet 3. 0 Аннотации p Упрощение конфигурирования p Асинхронная обработка запросов p Pluggability – интеграция с фреймворками p
@Web. Servlet value p name p description p url. Patterns p init. Params p load. On. Startup p small. Icon p large. Icon p async. Supported p
@Web. Servlet(”/hi”) public class Privet. Servlet extends Http. Servlet{ //. . . }
@Web. Servlet(url. Patterns=”/hi”) public class Privet. Servlet extends Http. Servlet{ //. . . }
@Web. Servlet(url. Patterns={”/hi”, ”/hello”, ”/salut”}) public class Privet. Servlet extends Http. Servlet{ //. . . }
@Web. Servlet(name=“Saluting. Servlet” url. Patterns={”/hi”, ”/hello”, ”/salut”}) public class Privet. Servlet extends Http. Servlet{ //. . . }
@Web. Init. Param @Web. Servlet(url. Patterns=”/hi”, init. Params= { @Web. Init. Param(name=“abc", value=“ 123")} ) public class Privet. Servlet extends Http. Servlet {. . . }
@Multipart. Config @Web. Servlet(url. Patterns=”/hi”) @Multipart. Config( location="/tmp", max. Request. Size=2*10485760 L, max. File. Size = 10485760 L, file. Size. Threshold=8192 L) public class Privet. Servlet extends Http. Servlet{ //…где-то в do. Get Part img = request. get. Part(“uploaded. Image”); img. get. Size(); img. get. Input. Stream(); // обработка картинки… }
@Web. Filter filter. Name p description p display. Name p init. Params p servlet. Names p value p url. Patterns p dispatcher. Types p async. Supported p
@Web. Filter(“/some. Url”) public class My. Filter implements Filter { public void do. Filter(Http. Servlet. Request req, Http. Servlet. Response res) {…} }
@Web. Filter(url. Patterns={“/some. Url”}) public class My. Filter implements Filter { public void do. Filter(Http. Servlet. Request req, Http. Servlet. Response res) {…} }
@Web. Filter(servlet. Names={“Saluting. Servlet”}) public class My. Filter implements Filter { public void do. Filter(Http. Servlet. Request req, Http. Servlet. Response res) {…} }
@Web. Listener javax. servlet. Servlet. Context. Listener p javax. servlet. Servlet. Context. Attribute. Listener p javax. servlet. Servlet. Request. Attribute. Listener p javax. servlet. http. Http. Session. Attribute. Listener p
@Web. Listener public class My. Listener implements Servlet. Context. Listener{ public void context. Initialized(Servlet. Context. Event sce) { Servlet. Context sc = sce. get. Servlet. Context(); sc. add. Servlet(“Salut. Servlet", "Пример добавления сервлета", “Privet. Servlet", null, -1); sc. add. Servlet. Mapping(“Salut. Servlet", new String[] {“/hello“, ”/hi”, ”/salut”}); } }
@Servlet. Security((http. Method. Constraints = { @Http. Method. Constraint( value = "GET", roles. Allowed = "R 1"), @Http. Method. Constraint( value = "POST", roles. Allowed = "R 2", transport. Guarantee = Transport. Guarantee. CONFIDENTIAL) }) public class Secured. Servlet extends Http. Servlet { }
Асинхронная обработка запросов Non-blocking server p Comet p «push-style» p Позволяет освободить рабочий поток для обработки других запросов на время ожидания освобождения ресурса или выполнения задачи удаленным сервисом p Требует установки поля support. Async=“true” в @Web. Servlet или @Web. Filter p
Асинхронная обработка запросов СЦЕНАРИЙ 1. Сервлет получает запрос на обработку 2. …отправляет запросы к удаленным ресурсам (СУБД, веб-сервис итп), 3. . и завершает свою работу, передав обработчику запроса-ответа созданный асинхронный контекст 4. Когда запрошенный ресурс становится доступен, обработчик возобновляет обработку запроса. 5. Обработка завершается, ответ отправляется клиенту.
Асинхронная обработка запросов @Web. Servlet( name = "simple", value = {"/async. Example"}, async. Supported = true ) public class Simple. Async. Servlet extends Http. Servlet { public void service(Servlet. Request req, final Servlet. Response res) throws Servlet. Exception, IOException { Async. Context ctx = req. start. Async(); ctx. set. Timeout(30000); ctx. add. Listener(new Async. Listener() { public void on. Complete(Async. Event event) throws IOException { log("on. Complete called"); } public void on. Timeout(Async. Event event) throws IOException { log("on. Timeout called"); } public void on. Error(Async. Event event) throws IOException { log("on. Error called"); } public void on. Start. Async(Async. Event event) throws IOException { log("on. Start. Async called"); } }); ctx. start(new Runnable() { public void run() { try { ctx. get. Response(). get. Writer(). write(Мessage. Format. format( "
Асинхронная обработка запросов p Servlet. Request n n p start. Async(Servlet. Request req, Servlet. Response res) start. Async() is. Async. Supported() is. Async. Started() Async. Context n n n n n get. Request() get. Response() set. Timeout(long msec) add. Listener(async. Listener, req, res) dispatch(path) start(Runnable r) complete()
Асинхронная обработка запросов p Async. Listener n n public void on. Complete(Async. Event event) public void on. Timeout(Async. Event event) public void on. Error(Async. Event event) public void on. Start. Async(Async. Event event)
Асинхронная обработка запросов
На сегодня - ВСЁ Вячеслав Рогальчук 14. 11. 2012 Спасибо за внимание!