Tworzenie usług internetowych Servlety cz. 1
Aplikacje WEB Aplikacje WEB to zestaw komponentów programistycznych, działających po stronie serwera i dynamicznie reagujących na zlecenia ze strony programów klienckich, zgłaszane za pośrednictwem protokołu sieciowego (najczęściej HTTP). Technologie tworznia aplikacji WEB w Javie Servlet (Java Servlet Technology) JSP (Java Server Page) JSF (Java Server Face)
Apliakcje Web w Javie
Serwlety Serwlet podstawowa technologia służąca do tworzenia apliakcji WEB (Java Servlet Technology) Serwlet jest klasą Javy, rozszerzającą funkcjonalność serwerów w przetwarzaniu zleceń programów klienckich. Przy programowaniu serwletów wykorzystujemy klasy z pakietu javax.servlet - stanowiącego interfejs programistyczny Servlet API. Klasy te i ich metody dostarczają różnorodnych środków odbierania i reagowania na zlecenia klientów oraz przesyłania im wyników (odpowiedzi).
Java Server Pages Pierwotnie język skryptowy odpowiedzialny za widok Obecnie obsługuje znaczniki, wywołujące odpowiednie procedury Java Server Pages Standard Tag Library pozwala na tworzenie stron osobom nie znającym się na programowaniu w Javie JSP są tak naprawdę servletami, które są kompilowane do klas Java
Java Server Faces Java Server Faces Technologia przeznaczona do elastycznego generowania GUI aplikacji WEB po stronie serwera, ale przede wszystkim umożliwiająca lepszą separację modeli i widoków, której - mimo wszystko - JSP do końca nie zapewnia. Wersje 1.1, 1.2 aktualnie 2.0, 2.X Odpowiednik ASP.NET
Apache Tomcat serwer http://tomcat.apache.org/ - strona projektu Aktualna wersja Tomcat 7.0.68, 8.0.33, 9.0.0 Servlet 3.0 JSP 2.2 Niezbędna jest Java SE w wersji min.6 (http://www.oracle.com/technetwork/java/) Możliwe jest podłączenie Tomcat a do serwera Apache lub IIS możliwe jest zatem równoległe działanie kilku serwerów na jednym porcie (np. PHP i Java).
Pierwszy serwlet import java io *; import javax.servlet.*; import javax.servlet.annotation.*; import javax.servlet.http.*; @WebServlet("/hello") public class HelloWorld extends HttpServlet { @Override public void doget ( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getwriter(); out.println("hello World");
Pierwszy serwlet @WebServlet("/address") Adres URL tworzony jest następująco http://hostname/appname/address doget Kod do obsługi żądania HTTP GET. Analogicznie istnieje funkcja dopost HttpServletRequest Obiekt zawierający wszystko, co przychodzi do serwera. Żądanie wysłane z przeglądarki HttpServletResponse Obiekt używany do wysłania różnych rzeczy do serwera. Często używaną funkcją jest getwriter, zwracająca obiekt klasy PrintWriter (ten sam co System.out). @Override Zaznaczenie, że napisywana jest funkcja jest wirtualna
Konfiguracja Eclipse
Generowanie strony HTML @WebServlet("/test1") public class TestServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<html>"); out.println("<head><title>a Test Servlet</title></head>"); out.println("<body bgcolor=\"#fdf5e6\">"); out.println("<h1>test</h1>"); out.println("<p>simple servlet for testing.</p>" ); out.println("</body></html>");
Wdrożenie aplikacji Wdrażanie aplikacji (deployment) Utworzenie dyskryptora wdrożenia web.xml Umiejscowienie wszystkich klas, plików HTML, JSP w odpowiednich katalogach o określonej strukturze Poinformowanie serwera o kontekście aplikacji (miejsce, gdzie się znajduje) Skopiowanie aplikacji do katalogu webapps Utworzenie pliku *.war Utworzenie deskryptora kontekstu
Katalogi /mojaapplikacja WEB-INF classes pakiet/klasa.class *.class lib *.jar web.xml *.jsp *.html *.xml *.gif
web.xml <?xml version="1.0" encoding="utf-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="webapp_id" version="3.0"> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
Definiowanie serwletów Annotacje pojawiły się w wersji 3.0 We wcześniejszych <=2.5 serwlety definiowało się w web.xml Java package mypackage; public class MyServlet extends HttpServlet { web.xml <servlet> <servlet-name>myname</servlet-name> <servlet-class>mypackage.myservlet</servlet-class> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name>myname</servlet-name> <url-pattern>/my-address</url-pattern> </servlet-mapping> W rezultacie: http://hostname/appname/my-address Teraz (wersja 3.0) @WebServlet("/my-address") public class MyServlet extends HttpServlet {
Parametry Są przesyłane jako tzw. query-string w adresie URL (GET) lub dołączone są po nagłówku protokołu HTTP (POST), np. http://host/path?user=marty+hall&origin=bwi&dest=lax Najczęściej pochodzą z formatek, np. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD><TITLE>A Sample Form Using GET</TITLE></HEAD> <BODY BGCOLOR="#FDF5E6"> <H2 ALIGN="CENTER">Przykładowa formatka z GET</H2> <FORM ACTION="http://localhost:8088/Test/test.html" METHOD="GET > <CENTER> Imie: <INPUT TYPE="TEXT" NAME="imie" VALUE="Jan"><BR/> Nazwisko: <INPUT TYPE="TEXT" NAME="nazwisko" VALUE="Kowalski"> <P><INPUT TYPE="SUBMIT"></P> </CENTER> </FORM> </BODY> </HTML>
Czytanie parametrów w serwletach request.getparameter("name") Zwraca pierwszą wartość o nazwie name zakodowaną w querystring Działa dla żądania GET i POST request.getparametervalues("name") Zwaraca tablicę wartości parametów o nazwie name request.getparameternames() lub request.getparametermap() Zwraca enumerację lub mapę parametrów
Przykład Formularz na stronie HTML <FORM ACTION="trzyParametry"> Pierwszy parametr: <INPUT TYPE="TEXT" NAME="param1" > <BR/> Drugi parametr: <INPUT TYPE="TEXT" NAME="param2"><BR/> Trzeci parametr: <INPUT TYPE="TEXT" NAME="param3"><BR/> <CENTER> <INPUT TYPE="SUBMIT"> </CENTER> </FORM>
Przykład Serwlet trzyparametry protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getwriter(); out.println("<html>\n"); out.println("<head><title>test 3 parametrow</title></head>"); out.println("<body BGCOLOR=\"#FDF5E6\">"); out.println("<h1 ALIGN=\"CENTER\"> Dane: </H1>"); out.println("<ul>"); out.println(" <LI><B>param1</B>: "+request.getparameter("param1")); out.println(" <LI><B>param2</B>: "+request.getparameter("param2")); out.println(" <LI><B>param3</B>: "+request.getparameter("param3")); out.println("</ul>"); out.println("</body></html>");
Odczyt wszystkich parametrów protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<html>"); out.println("<head><title>wszystkie parametry</title> </HEAD>"); out.println("<body BGCOLOR=\"#FDF5E6\">"); out.println("<h1 ALIGN=CENTER>Parametry</H1>"); out.println("<table BORDER=1 ALIGN=CENTER>"); out.println("<tr BGCOLOR=\"#FFAD00\">"); out.println("<th>nazwa parametru</th><th>parameter Value(s)</TH>");
Odczyt wszystkich parametrów (cd) Enumeration<String> paramnames = request.getparameternames(); while(paramnames.hasmoreelements()) { String paramname = (String)paramNames.nextElement(); out.print("<tr><td>" + paramname + "\n<td>"); String[] paramvalues = request.getparametervalues(paramname); if (paramvalues.length == 1) { String paramvalue = paramvalues[0]; if (paramvalue.length() == 0) { out.println("<i>brak wartosci</i>"); else { out.println(paramvalue); else { out.println("<ul>"); for(int i=0; i<paramvalues.length; i++) { out.println("<li>" + paramvalues[i]); out.println("</ul>"); out.println("</table>\n</body></html>");
Uwagi Reakcja na POST taka sam jak GET protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { doget(request, response); Sprawdzanie parametrów if ((param == null) (param.trim().equals(""))) { //pusty parametr lub brak else { // jest jakaś dana
Przykłady użycia serwletów Generowanie obrazków Generowanie arkuszy kalkulacyjnych
Generowanie arkusza Excel @WebServlet("/excelTest") public class exceltest extends HttpServlet { private static final long serialversionuid = 1L; protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("application/vnd.ms-excel"); PrintWriter out = response.getwriter(); out.println("\tq1\tq2\tq3\tq4\tsuma"); out.println("jablka\t78\t87\t92\t29\t=suma(b2:e2)"); out.println("pomarancze\t77\t86\t93\t30\t=suma(b3:e3)");
Generowanie obrazów Krzystanie z klasy java.awt.image.bufferedimage rysowanie obrazka Ustawienie typu kontentu response.setcontenttype("image/jpeg"); Strumień wyjściowy OutputStream out = response.getoutputstream(); Wysłanie obrazka w formacie JPEG strumieniem wyjściowym try { ImageIO.write(image, "jpg", out); catch(ioexception ioe) { System.err.println("Error writing JPEG file: " + ioe);
Generowanie obrazów przykład @WebServlet("/obrazek") public class Obrazek extends HttpServlet { private static final long serialversionuid = 1L; protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { BufferedImage image = new BufferedImage(320, 200, BufferedImage.TYPE_INT_RGB); Graphics2D g = (Graphics2D)image.getGraphics(); g.setbackground(color.white); g.clearrect(0, 0, 320, 200); g.setcolor(color.black); g.drawline(0, 0, 320, 200); response.setcontenttype("image/jpeg"); OutputStream out = response.getoutputstream(); try { ImageIO.write(image, "jpg", out); catch(ioexception ioe) { System.err.println("Error writing JPEG file: " + ioe);