Java 2012 SAP AG All rights reserved Public
Какво е Java Сървлет? © 2012 SAP AG. All rights reserved. Public 4
Общи сведения • Java Servlet – http: //www. oracle. com/technetwork/java/index-jsp-135475. html • Част е от Java EE стека - http: //www. oracle. com/technetwork/javaee/tech/index. html • Java Servlet API спецификацията http: //docs. oracle. com/cd/E 17802_01/products/servlet/2. 5/docs/servlet-2_5 -mr 2/javax/servlet/packagesummary. html • Основна уеб технология в Java света - (JSP, JSF, Spring MVC, Struts, GWT, Velocity, SOAP, REST) © 2012 SAP AG. All rights reserved. Public 5
„Здравей, Свят“ @Web. Servlet("/Hello. World. Servlet") public class Hello. World. Servlet extends Http. Servlet { protected void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { response. get. Writer(). println("<H 1> Wazzaaaap!</H 1>"); } Контекст път } Сървлет път http: //localhost: 8080/Hello. Servlet/Hello. World. Servlet © 2012 SAP AG. All rights reserved. Public 6
Дескрипторът web. xml http: //docs. oracle. com/cd/E 13222_01/wls/docs 81/webapp/web_xml. html <? xml version="1. 0" encoding="ISO-8859 -1" ? > <web-app xmlns="http: //java. sun. com/xml/ns/j 2 ee" xmlns: xsi="http: //www. w 3. org/2001/XMLSchema-instance" xsi: schema. Location="http: //java. sun. com/xml/ns/j 2 ee/web-app_2_4. xsd" version="2. 4"> <display-name>Hello. World </display-name> <description> This is a simple web application </description> <servlet-name> Life. Cycle. Servlet </servlet-name> <servlet-class> package. Life. Cycle. Servlet servlet-class> </servlet> <servlet-mapping> <servlet-name> Life. Cycle. Servlet </servlet-name> <url-pattern> /Life. Cycle. Servlet </url-pattern> </servlet-mapping> </web-app> © 2012 SAP AG. All rights reserved. Public 10
Жизнен цикъл на Сървлет – Пример @Web. Servlet("/Life. Cycle. Servlet") public class Life. Cycle. Servlet extends Http. Servlet { private File. Input. Stream content. Storage. Writer; private File. Output. Stream content. Storage. Reader; public void init() throws Servlet. Exception{ File content. Storage = new File("c: \storage. db"); try { content. Storage. Writer = new File. Input. Stream(content. Storage); content. Storage. Reader = new File. Output. Stream(content. Storage); } catch (Exception e) {// handle the exception } } © 2012 SAP AG. All rights reserved. Public 12
Жизнен цикъл на Сървлет – Пример public void destroy(){ try { if (content. Storage. Reader != null) {content. Storage. Reader. close(); } if (content. Storage. Writer != null) {content. Storage. Writer. close(); } } catch (Exception e) { // handle the exception } } protected void service(Servlet. Request req, Servlet. Response res){ // Извиквате подходящ „глагол“ на Http. Servlet } }//End of Life. Cycle. Servlet © 2012 SAP AG. All rights reserved. Public 13
Жизнен цикъл на Сървлет – Пример public void destroy(){ try { if (content. Storage. Reader != null) {content. Storage. Reader. close(); } if (content. Storage. Writer != null) {content. Storage. Writer. close(); } } catch (Exception e) { // handle the exception } } protected void service(Servlet. Request req, Servlet. Response res){ // Извиквате подходящ „глагол“ на Http. Servlet } }//End of Life. Cycle. Servlet © 2012 SAP AG. All rights reserved. Какви глаголи … …какви 5 лева Public 14
javax. servlet. http. Http. Servlet http: //www. w 3. org/Protocols/rfc 2616. html „Глаголите“ на javax. servlet. http. Http. Servlet : do. XXX(Http. Servlet. Request req, Http. Servlet. Response res) GET /Request. Example. Srvlet? name=Nikolay HTTP/1. 1 © 2012 SAP AG. All rights reserved. Public 15
javax. servlet. http. Http. Servlet. Request – HTTP Заявка Обектна резпрезентация на HTTP заявка. Предоставя методи за: 1. Четене на параметри – от „низа на заявката“ или тялото. ? name=Nikolay 2. String name = request. get. Param(“name”) Информация за хедъри String host. Name = request. get. Header(“Host”) 3. Информация за сесия Http. Session session = request. get. Session(); 4. Стрийм за четене Input. Stream request. Body. Input = request. get. Input. Stream(); © 2012 SAP AG. All rights reserved. Public 16
Работа с HTTP Заявка (кодът е част от do. Get()) String name = request. get. Parameter("name"); String user. Agent = request. get. Header("User-Agent"); String. Buffer buffer = new String. Buffer(); buffer. append("<h 1>Hello, " + name + "!<h 1> "); buffer. append("<h 2>Your request has been triggered via: " + user. Agent + "<h 2>"); response. set. Content. Type("text/html"); response. get. Writer(). write(buffer. to. String()); © 2012 SAP AG. All rights reserved. Public 17
javax. servlet. http. Http. Servlet. Response – HTTP отговор Обектна резпрезентация на HTTP отговора, който сървлетът ще изпрати до клиента. Предоставя методи за: 1. Писане в тялото (В HTML или друг формат): http. Response. get. Writer(). write("<h 1> Hello World! </h 1>"); 2. Добавяне на хедъри: http. Response. set. Header(“Server”, “My. Test. Server”) 3. Мета-информация за съдържанието: http. Response. set. Content. Type("text/html"); 4. Поставяне на статус кодове: http. Response. set. Status(Http. Servlet. Response. SC_NOT_MODIFIED); © 2012 SAP AG. All rights reserved. Public 18
Работа с HTTP отговор protected void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { Print. Writer writer = response. get. Writer(); response. set. Content. Type("text/plain"); response. add. Header("Server", "My. Server. Extension"); writer. println("<h 1>This is not a <B>HTML</B> file <BR> and no formating should be available "); } © 2012 SAP AG. All rights reserved. Public 19
Конкурентен достъп - Пример @Web. Servlet("/Counter. Servlet") public class Counter. Servlet extends Http. Servlet { private int counter = 0; protected void do. Get(Http. Servlet. Request req, Http. Servlet. Response resp) throws Servlet. Exception, IOException { do. Post(req, resp); Трябва да е в синхронизирана секция } protected void do. Post(Http. Servlet. Request req, Http. Servlet. Response resp) throws Servlet. Exception, IOException { counter++; } © 2012 SAP AG. All rights reserved. Public 21
Пренасочване – Пример (кодът е част от do. Get()) response. set. Content. Type("text/html"); response. get. Writer(). println("<h 1>In the controller servlet</h 1>"); String dispatch = request. get. Parameter("dispatch"); if (dispatch != null) { if (dispatch. equals. Ignore. Case("forward")) { Request. Dispatcher rd = request. get. Request. Dispatcher("/Forward. Servlet"); rd. forward(request, response); } else if (dispatch. equals. Ignore. Case("include")) { Request. Dispatcher rd = request. get. Request. Dispatcher("/Include. Servlet"); rd. include(request, response); } } © 2012 SAP AG. All rights reserved. Public 23
Резултати от пренасочването © 2012 SAP AG. All rights reserved. Public 24
Параметри на Servlet javax. servlet. Servlet. Config – обект, създаван след инициализацията на сървлета, който пазят конфигурационни данни за дадения сървлет. <servlet> <servlet-name> Life. Cycle. Servlet </servlet-name> <servlet-class> package. Life. Cycle. Servlet servlet-class> <init-param> <param-name>admin. Email</init-param > <param-value>admin@sap. teachers. com</param-value > </init-param > </servlet> <servlet-mapping> <servlet-name> Life. Cycle. Servlet </servlet-name> <url-pattern> /Life. Cycle. Servlet </url-pattern> </servlet-mapping> String e_mail = get. Servlet. Config(). get. Init. Parameter(“admin. Email"); © 2012 SAP AG. All rights reserved. Public 25
Параметри на приложение javax. servlet. Servlet. Context - за всяко едно уеб приложение WEB контейнерът създава точно една инстанция на този обект. Той служи като обща конфигурация на всички сървлети, част от това приложение. <web-app> … <context-param> <param-name>admin. Email</init-param > <param-value>admin@sap. teachers. com</param-value > </context-param > … </ web-app> String e_mail = get. Servlet. Context(). get. Init. Parameter(“admin. Email"); © 2012 SAP AG. All rights reserved. Public 26
Филтри javax. servlet. Filter Request – а се обработва от филтъра преди да стигне до Servlet - а WEB Server WEB Container Servlet © 2012 SAP AG. All rights reserved. Public 27
Филтри javax. servlet. Filter class Logging. Filter implements javax. servlet. Filter { … } <filter> <filter-name> Log. Filter </filter-name> <filter-class> package. Logging. Filter </filter-class> </filter> <filter-mapping> <filter-name> Log. Filter </filter-name> <url-pattern> /* </url-pattern> </filter-mapping> © 2012 SAP AG. All rights reserved. Public 28
@Web. Servlet – Пример @Web. Servlet(name="Dummy. Name", url. Patterns={"/dummy", "/DUMMY"}, init. Params={@Web. Init. Param(name="Param 1", value="Value 1"), @Web. Init. Param(name="Param 2", value="Value 2")}) public class Deployment. Descriptors extends Http. Servlet { protected void do. Get(Http. Servlet. Request req, Http. Servlet. Response resp) { Servlet. Config config = get. Servlet. Config(); resp. set. Content. Type("text/html"); resp. get. Writer(). println("<H 1>" + config. get. Init. Parameter("Param 1")); resp. get. Writer(). println("<H 1>" + config. get. Init. Parameter("Param 2")); } } © 2012 SAP AG. All rights reserved. Public 31
Анотацията @Web. Filter - Пример @Web. Filter(url. Patterns={"/*"}) class Logging. Filter implements javax. servlet. Filter { private Map<String, Integer> visitors. Count = new Hash. Map<String, Integer>(); public void do. Filter(Servlet. Request request, Servlet. Response response, Filter. Chain chain) throws IOException, Servlet. Exception { String user = request. get. Parameter("user"); if (user != null) { Integer visits = visitors. Count. get(user); if (visits == null) { visitors. Count. put(user, 1); } else { visitors. Count. put(user, visits. int. Value() + 1); } } ((Http. Servlet. Response)response). set. Content. Type("text/html"); ((Http. Servlet. Response)response). get. Writer(). println(print. Visitor. Count()); chain. do. Filter(request, response); } © 2012 SAP AG. All rights reserved. Public 32
Сесии HTTP Request Сесия 1 Сесия 2 Клиент Web Server HTTP Response © 2012 SAP AG. All rights reserved. Public 36
Интерфейс на javax. servlet. http. Http. Session public String get. Id(); public Object get. Attribute(String name); public void set. Attribute(String name, Object value); public void remove. Attribute(String name); public Enumeration get. Attribute. Names(); public long get. Creation. Time(); public long get. Last. Accessed. Time(); public int get. Max. Inactive. Interval(); public void set. Max. Inactive. Interval(int interval); public void invalidate(); public boolean is. New(); © 2012 SAP AG. All rights reserved. Public 38
Пример за поддръжка на сесия public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { // Create a session object if it is already not created. Http. Session session = request. get. Session(true); Integer visit. Count = new Integer(0); String visit. Count. Key = new String("visit. Count"); if (!session. is. New()) { visit. Count = (Integer)session. get. Attribute(visit. Count. Key); visit. Count = visit. Count + 1; } session. set. Attribute(visit. Count. Key, visit. Count); … } © 2012 SAP AG. All rights reserved. Public 39
Пример за JSP <html> <head> <title>This is my first JSP</title> </head> <body> <UL> <LI>Current time: <%=new java. util. Date()%> <LI>Server: <%=application. get. Server. Info() %> </UL> </body> </html> © 2012 SAP AG. All rights reserved. Public 43
JSP Expressions (изрази) пример и сървлет форма <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859 -1"> <title>Insert title here</title> </head> <body> <%= Math. random() %> </body> </html> © 2012 SAP AG. All rights reserved. Public 46
JSP Expressions (изрази) пример и сървлет форма public void _jsp. Service(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { response. set. Content. Type("text/html"); Http. Session session = request. get. Session(); Jsp. Writer out = response. get. Writer(); out. println("<H 1>A Random Number</H 1>"); out. println(Math. random()); . . . } © 2012 SAP AG. All rights reserved. Public 47
JSP Declarations (декларации) пример и сървлет форма <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859 -1"> <title>Insert title here</title> </head> <body> <%! private static double generate. Random. Digit() { return Math. random(); } %> </body> </html> © 2012 SAP AG. All rights reserved. Public 48
JSP Declarations (декларации) пример и сървлет форма public class xxxx implements Http. Jsp. Page { private static double generate. Random. Digit() { return Math. random() ; } public void _jsp. Service(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { response. set. Content. Type("text/html"); Http. Session session = request. get. Session(); Jsp. Writer out = response. get. Writer(); … } } © 2012 SAP AG. All rights reserved. Public 49
JSP Scriplets (декларации) пример и сървлет форма <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859 -1"> <title>Insert title here</title> </head> <body> <%! private static double generate. Random. Digit() { return Math. random(); } %> <% generate. Random. Digit(); %> </body> </html> © 2012 SAP AG. All rights reserved. Public 50
JSP Scriplets (декларации) пример и сървлет форма public class xxxx implements Http. Jsp. Page { private static double generate. Random. Digit() { return Math. random(); } public void _jsp. Service(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { response. set. Content. Type("text/html"); Http. Session session = request. get. Session(); Jsp. Writer out = response. get. Writer(); generate. Random. Digit(); … } } © 2012 SAP AG. All rights reserved. Public 51
Предефинирани промениливи в _jsp. Service метода ? application – Servlet. Context config – Servlet. Config out – Jsp. Writter page – this page. Context – Page. Context request – Http. Servlet. Request response – Http. Servlet. Response session – Http. Session Какво ще стане ако се опитаме да използваме някоя от изброените променливи в таг различен от scriplet? Отговор – servlet-a, който бива създаден няма да може да се компилира! © 2012 SAP AG. All rights reserved. Public 52
Page директивата се използва в JSP-то за да укаже на контейнера как да бъде транслирано (parse-нато) в сървлет. Атрибути в page директива: auto. Flush - Controls the behavior of the servlet output buffer. content. Type - Defines the character encoding scheme. import - Specifies a list of packages or classes for use in the JSP as the Java import statement does for Java classes. language - Defines the programming language used in the JSP page. session - Specifies whether or not the JSP page participates in HTTP sessions buffer - Specifies a buffering model for the output stream. error. Page - Defines the URL of another JSP that reports on Java unchecked runtime exceptions. is. Error. Page - Indicates if this JSP page is a URL specified by another JSP page's error. Page attribute. extends - Specifies a superclass that the generated servlet must extend info - Defines a string that can be accessed with the servlet's get. Servlet. Info() method. is. Thread. Safe - Defines the threading model for the generated servlet. is. ELIgnored - Specifies whether or not EL expression within the JSP page will be ignored. is. Scripting. Enabled - Determines if scripting elements are allowed for use. © 2012 SAP AG. All rights reserved. Public 55
Пример за java bean и ползването му в JSP package mypackage; public class String. Bean { private String message = "No message specified"; public String get. Message() { return message; } public void set. Message(String message) { this. message = message; } } © 2012 SAP AG. All rights reserved. Public 58
Пример за java bean и ползването му в JSP <jsp: use. Bean id="string. Bean" class=“mypackage. String. Bean" /> <OL> <LI>Initial value (from jsp: get. Property): <I><jsp: get. Property name="string. Bean“ property="message" /></I> <LI><jsp: set. Property name="string. Bean" property="message" value="Best string bean: TU" /> Value after setting property with jsp: set. Property: <I> <jsp: get. Property name="string. Bean" property="message" /></I> </OL> © 2012 SAP AG. All rights reserved. Public 59
Благодаря за вниманието! За контакти: silviya. brayanova@sap. com nikolay. landzhev@sap. com SAP Labs Bulgaria София 1618 бул. Цар Борис III, 136 А тел: 02 91 57 690
Линкове • Официалния сървлет tutorial на “Oracle” за Java EE 6 http: //docs. oracle. com/javaee/6/tutorial/doc/bnafd. html • Tutorial за jsp-та който дава дефиниция всички елементи/действия/директиви http: //www. tutorialspoint. com/jsp/index. htm • Директиви и обяснение на отделните атрибути: http: //www. tutorialspoint. com/jsp_directives. htm • Tutorial за инсталиране и конфигуриране на tomcat + eclipse http: //www. vogella. com/articles/Eclipse. WTP/article. html • Tutorial за jsp (tag libirary частта е опционална, тя не се изисква за изпита, но може да бъде прегледана ) : http: //www. javatpoint. com/creating-jsp-in-eclipse-ide http: //www. zentut. com/jsp-tutorial/ Head First Servlets and JSP, 2 nd Edition: http: //it-ebooks. info/book/375/ © 2012 SAP AG. All rights reserved. Public 62
- Slides: 59