Post on 30-Dec-2015
description
1
JAVA – Servlety
Odczyt danych
przesłanych przez
użytkownika
Analiza informacji dotyczących żądania możliwości przeglądarki (wersja) cookies nazwa komputera, na którym
działa program
Generowanie wyników Wymiana informacji z bazą danych Wywołanie procedury RMI lub
CORBA
Formatowanie wyników HTML XML
Podanie parametrów odpowiedzi HTTP Typ przesyłanego dokumentu Podanie cookies Parametry zarządzające
przechowywaniem strony w pamięci podręcznej przeglądarki
Wysłanie dokumentu z
odpowiedzią do użytkownika HTML GIF GZIP
Użytkow
nik
Servlet Pracujący na
serwerze WWW
2
JAVA – Uruchamianie Servletów
• Instalacja na serwerze WWW Tomcat (http://jakarta.apache.org) Java Web Server (J2EE)
• Java Server Development Kit set CLASSPATH=. “ścieżka dostępu do “\servlet.jar uruchomienie: servletrunner.exe
• Dokumentacja API– http://java.sun.com/products/jsp/download.html
– http://java.sun.com/products/servlet/2.2/javadoc
– http ://java.sun.com/j2ee/j2sdkee/techdocs/api
3
JAVA – Implementacja Servletu
import java.io.*;import javax.servlet.*; // HttpServletimport javax.servlet.http.*; // interfejsy HttpServletRequest, HttpServletResponse
public class ServletSzablon extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // zmiennej "request” (żądanie) należy używać do odczytywania // nagłówków HTTP przekazanych przez przeglądarkę (na przykład // cookies) oraz danych podawanych w formularzach HTML (czyli // danych wpisanych i przesłanych przez użytkownika). // zmiennej "response" (odpowiedź) należy używać do określania // kodu statusu odpowiedzi HTTP oraz nagłówków odpowiedzi (na przykład // typu danych oraz cookies). PrintWriter out = response.getWriter(); // strumień do przesyłania kodu HTML do przeglądarki response.setContentType(”text/plain; charset=ISO-8859-2”); out.println(” jestem sobie takim zwyklym servlecikiem”); }}
4
JAVA – Struktura zapytania i odpowiedzi HTPP
POST /TheStockExchange/Trading/GetStockPrice.asp HTTP/1.1Host: localhostContent-Type: application/x-www-form-urlencodedContent-Length: 11
Symbol=MSFT
POST /TheStockExchange/Trading/GetStockPrice.asp HTTP/1.1Host: localhostContent-Type: application/x-www-form-urlencodedContent-Length: 11
Symbol=MSFTPusta linia !Pusta linia !
HTTP/1.1 200 OKContent-Type: text/xml; charset=utf-8Content-Length: 75
<?xml version="1.0" encoding="utf-8"?><stock symbol="MSFT" Price="71.50" />
HTTP/1.1 200 OKContent-Type: text/xml; charset=utf-8Content-Length: 75
<?xml version="1.0" encoding="utf-8"?><stock symbol="MSFT" Price="71.50" />
Pusta linia !Pusta linia !
•Zapytanie (Request)
•Odpowiedź(Response)
5
JAVA – Metoda GET i POST
GET /Trading/GetStockPrice.asp?Symbol=MSFT HTTP/1.1Host: localhostGET /Trading/GetStockPrice.asp?Symbol=MSFT HTTP/1.1Host: localhost
POST /Trading/GetStockPrice.asp HTTP/1.1Host: localhostContent-Type: application/x-www-form-urlencodedContent-Length: 11
Symbol=MSFT
POST /Trading/GetStockPrice.asp HTTP/1.1Host: localhostContent-Type: application/x-www-form-urlencodedContent-Length: 11
Symbol=MSFT
•HTTP-GET
•HTTP-POST
6
JAVA – nagłówki zapytań i odpowiedzi HTTP
AcceptAccept-CharsetAccept-EncodingAccept-LanguageAuthorizationCache-ControlConnectionContent-LengthContent-TypeCookieExceptFromHost
If-MatchIf-Modified-SinceIf-None-MatchIf-RangeIf-Unmodified-SincePragmaProxy-AuthorizationRangeReferUpgradeUser-AgentViaWarning
7
JAVA – podstawowe funkcje składowe servletów
• Obsługa żądania GET
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... }
•Obsługa żądania POST public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {…..}
• Inicjacja servletu public void init() throws ServletException { ….} public void init(ServletConfig config) {super.init(config); ….}
• obsługa żądań PUT, DELETE public void doPut ... public void doDelete ...
•Uniwersalna metoda service public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { ... }
8
JAVA – Servlety: rodzaje odpowiedzi
import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class TextServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//nagłówek odpowiedziresponse.setContentType( "text/plain; charset=ISO-8859-2" ); // zwykły tekst z
polskimi // znakamiPrintWriter out = response.getWriter();out.println( "Witaj Świecie!" );}
}public class ServletWWW extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; encoding=ISO-8859-2"); PrintWriter out = response.getWriter(); // określenie specyfikacji HTML potrzebne przy testowaniu stron WWW ze względu na // błędy składni w kodzie HTML // narzędzia sprawdzania kodu: http://validator.w3.org
// www.htmlhelp.com/tools/validator// metodą doGet odpowiedź jest dołączana do adresu URL, zatem można do serwisu
// sprawdzającego przekazać adres URL servletu
String docType = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +"Transitional//EN\">\n";
out.println(docType + "<HTML>\n" + "<HEAD> <TITLE>Witaj WWW</TITLE> </HEAD>\n" + "<BODY>\n" +<H1>Witaj WWW</H1>\n" + "</BODY>
</HTML>"); }}}
9
JAVA – Servlety: rodzaje odpowiedzi – typy MIME
•"text/plain"•"text/plain; charset=ISO-8859-2"•"text/html "•"text/html; charset= ISO-8859-2"•"image/gif"•"image/jpeg"•"image/tiff"•"image/png"•"application/vnd.ms-excel"
10
JAVA – Servlety: parametry startowe
import java.io.*; import javax.servlet.*; import javax.servlet.http.*;
public class ShowServerParameter extends HttpServlet {private String messageString;private String defaultMessage = "Brak komunikatu.";private int repeats = 1;
public void init(ServletConfig config) throws ServletException {super.init(config);messageString = getInitParameter("message");if (message == null) { message = defaultMessage;}try {String repeatString = getInitParameter("repeats");repeats = Integer.parseInt(repeatString);} catch(NumberFormatException nfe) { }
}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html; encoding=ISO-8859-2");PrintWriter out = response.getWriter();
String docType ="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +"Transitional//EN\">\n";out.println(docType + "<HTML>\n" +"<HEAD><TITLE> Serwlet ShowMessage </TITLE></HEAD>\n" +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +"<H1 ALIGN=CENTER>Serwlet ShowMessage</H1>");
for(int i=0; i<repeats; i++) { out.println(messageString + "<BR>");}out.println("</BODY></HTML>");
}}
11
JAVA – Servlety: Odczyt parametrów przesłanych z formularza
public class Parametry extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=ISO-8859-2");
PrintWriter out = response.getWriter();
String docType ="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 „ +
"Transitional//EN\">\n";out.println(docType +
"<HTML>\n" +"<HEAD><TITLE>ODCZYT PARAMETRÓW</TITLE></HEAD>\n" +"<BODY BGCOLOR=\"#FDF5E6\">\n" +"<UL>\n" +" <LI><B>param1</B>: "+ request.getParameter("param1") + "\n" +" <LI><B>param2</B>: "+ request.getParameter("param2") + "\n" +" <LI><B>param3</B>: "+ request.getParameter("param3") + "\n" +"</UL>\n" +"</BODY></HTML>");
}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);}
}
12
JAVA – Servlety: kod formularza
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD> <TITLE>Pobieranie wartości trzech parametrów</TITLE> </HEAD><BODY BGCOLOR="#FDF5E6"><H1 ALIGN="CENTER">Pobieranie wartości trzech parametrów</H1> <FORM ACTION="http://localhost:8080/servlet/Parametry" METHOD =POST>
Parametr pierwszy: <INPUT TYPE="TEXT" NAME="param1"><BR>Parametr drugi: <INPUT TYPE="TEXT" NAME="param2"><BR>Parametr trzeci: <INPUT TYPE="TEXT" NAME="param3"><BR>
<CENTER><INPUT TYPE="SUBMIT" NAME="Przycisk" VALUE="Prześlij"></CENTER> </FORM></BODY> </HTML>
13
JAVA – Servlety: Odczyt dowolnej liczby przesyłanych parametrów
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*;
public class MultiParameter extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=ISO-8859-2");PrintWriter out = response.getWriter();
String docInit ="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +"Transitional//EN\">\n"; // elementy inicjujace dokument html <BODY> <TITLE> itp
out.println(docInit +"<TABLE BORDER=1 ALIGN=CENTER>\n" +"<TR BGCOLOR=\"#FFAD00\">\n" + "<TH>Nazwa parametru<TH>Wartość/wartości parametru");
Enumeration paramNames = request.getParameterNames();while(paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();out.print("<TR><TD>" + paramName + "\n<TD>");String[] paramValues =request.getParameterValues(paramName); // kilka wartości parametru
// np. adres, numer karty kredytowejif (paramValues.length == 1) {
String paramValue = paramValues[0];if (paramValue.length() == 0)
out.println("<I>Brak danych</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>");}
14
JAVA – Servlety: Odczyt dowolnej liczby przesyłanych parametrów: kod formularza
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>Przykładowy formularz używający metody POST</TITLE> </HEAD><BODY BGCOLOR="#FDF5E6"><H2 ALIGN="CENTER">Przykładowy formularz używający metody POST</H2><FORM ACTION="http://localhost:8080/servlet/Wparametry" METHOD="POST">
Numer towaru: <INPUT TYPE="TEXT" NAME="itemNum"><BR>Ilość: <INPUT TYPE="TEXT" NAME="quantity"><BR>Cena jednostkowa: <INPUT TYPE="TEXT" NAME="price" VALUE="
PLN"><BR><HR>Imię: <INPUT TYPE="TEXT" NAME="firstName"><BR>Nazwisko: <INPUT TYPE="TEXT" NAME="lastName"><BR>Inicjał 2. imienia: <INPUT TYPE="TEXT" NAME="initial"><BR>Adres wysyłkowy:<TEXTAREA NAME="address" ROWS=3
COLS=40></TEXTAREA><BR>Karta kredytowa:<BR>  
<INPUT TYPE="RADIO" NAME="cardType” VALUE="Visa">Visa<BR><INPUT TYPE="RADIO" NAME="cardType„ VALUE="Master Card">Master Card<BR><INPUT TYPE="RADIO" NAME="cardType„ VALUE="Amex">American Express<BR><INPUT TYPE="RADIO" NAME="cardType„ VALUE="Discover">Discover<BR>Numer karty kredytowej: <INPUT TYPE="PASSWORD" NAME="cardNum"><BR>Powtórz numer karty kredytowej:
<INPUT TYPE="PASSWORD" NAME="cardNum"><BR><BR><CENTER><INPUT TYPE="SUBMIT" VALUE="Wyślij zamówienie"></CENTER></FORM> </BODY> </HTML>
16
JAVA – Servlety: odczyt nagłówków HTTP
Odczyt nagłówków z obiektu request•getHeader(”name”)
zwraca zawartość nagłówka ”name”•getHeaderNames
zwraca obiekt Enumeration zawierający listę nazw nagłówków w danym żądaniu•getHeaders(”name”)
zwraca obiekt Enumeration zawierający listę wartości nagłówka ”name” jeśli w żądaniu występuje on kilka razy np. nagłówek Accept-Language
Funkcje specjalizowane• getCookies
zwraca tablicę obiektów Cookie• getAuthType getRemoteUser
wyciągają z nagłówka Authorization elementy składowe tego nagłówka•getContentLength
zwraca zawartość nagłówka Content-Length jako liczbę typu int•getContentType
zwraca zawartość nagłówka Content-Type jako obiekt typu String•getDateHeader(”name”) getIntHeader (”name”)
funkcje odczytują zadany nagłówek i zwracają jego wartość jako obiekt typu Date bądź liczbę typu int
•Funkcje dotyczące głównego wiersza żądania• getMethod
zwraca nazwę zastosowanej metody żądania PUT POST GET itp.•getRequestURI
zwarac fragment adresu URL (za nazwą serwera)•getProtocol
zwraca trzecią część wiersza żądania określającą stosowany protokółnp. HTTP /1.0 HTTP /1.1
17
JAVA – Servlety: Odczyt nagłówków żądań HTTP
import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.*;
public class ShowHeaders extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html; charset=ISO-8859-2");PrintWriter out = response.getWriter();
String title = "Prezentacja nagłówkow żądania";String docInit ="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +"Transitional//EN\">\n";
// + inicjacja dokumentu html <Body> ><TITLE>Prezentacja nagłówków</TITLE> etcout.println( docInit +"<H1 ALIGN=CENTER>" + title + "</H1>\n" +"<B>Metoda: </B>" +
request.getMethod() + "<BR>\n" +"<B>Żądane URI: </B>" +request.getRequestURI() + "<BR>\n" +"<B>Protokół: </B>" +request.getProtocol() + "<BR><BR>\n" +"<TABLE BORDER=1 ALIGN=CENTER>\n" +"<TR BGCOLOR=\"#FFAD00\">\n" +"<TH>Nazwa nagłówka<TH>Wartość nagłówka");Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {String headerName = (String)headerNames.nextElement();out.println("<TR><TD>" + headerName);out.println(" <TD>" + request.getHeader(headerName));
}out.println("</TABLE>\n</BODY></HTML>");
}}
18
JAVA – Servlety: Ustawianie nagłówków odpowiedzi przesyłanie skompresowanej zawartości
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.zip.*;
public class CompresResponse extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html; charset=ISO-8859-2");//przeglądarki mogące obsługiwać kompresowaną zawartość // przesyłają nagłówek żądania Accept-Encoding.String encodings = request.getHeader("Accept-Encoding");String encodeFlag = request.getParameter("encoding");
PrintWriter out;String title;if ((encodings != null) && (encodings.indexOf("gzip") != -1)
&& !"none".equals(encodeFlag)) { title = "Strona zakodowana algorytmem GZip"; OutputStream out1 = response.getOutputStream(); out = new PrintWriter(new GZIPOutputStream(out1), false); // bez opróżniania bufora response.setHeader("Content-Encoding", "gzip");} else {
title = "Strona w postaci niezakodowanej";out = response.getWriter();
}docInit ="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +"Transitional//EN\">\n";
// + inicjacja dokumentu html <Body> ><TITLE>etc
out.println( docType +String line = "Kodujemy, kodujemy .. " +for(int i=0; i<10000; i++) { out.println(line); }
out.println("</BODY></HTML>");out.close();
}}
19
JAVA – Servlety: Prosta autoryzacja za pomocą protokołu HTTP Generowanie haseł
import java.util.*;import java.io.*;
/** Aplikacja zapisująca na dysku prosty plik właściwości* zawierający nazwy użytkowników oraz odpowiadające im * hasła.*/public class PasswordGenerator {public static void main(String[] args) throws Exception
{Properties passwords = new Properties();// mozna by jeszcze kodować, do wstawienia użyjemy put bo Properties // dziedziczy z Hashtablepasswords.put("krzych", "2003");passwords.put("duch", "aaaa");
// Miejsce przechowywania pliku powinno być niedostępne// z poziomu WWW.
FileOutputStream out = new FileOutputStream("c:\\plikh");passwords.store(out, "Passwords");
}}
20
JAVA – Servlety: Prosta autoryzacja za pomocą protokołu HTTP: odczyt danych
import java.io.*; import javax.servlet.*;import javax.servlet.http.*; import java.util.Properties;import sun.misc.BASE64Decoder;public class PasswordServlet extends HttpServlet {private Properties hasla; private String passFile;public void init(ServletConfig config) throws ServletException {
super.init(config);try { passFile = getInitParameter("passwordF"); hasla = new Properties(); hasla.load(new FileInputStream(passFile));} catch(IOException ioe) {}
}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html; charset=ISO-8859-2");PrintWriter out = response.getWriter();String authorization = request.getHeader("Authorization");if (authorization == null) { askForPassword(response);} else { String userInfo = authorization.substring(6).trim();
BASE64Decoder decoder = new BASE64Decoder();String nameAndPassword = new String(decoder.decodeBuffer(userInfo));int index = nameAndPassword.indexOf(":");String user = nameAndPassword.substring(0, index);String password = nameAndPassword.substring(index+1);String realPassword = hasla.getProperty(user);
if ((realPassword != null) && (realPassword.equals(password))) {String docType ="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +"Transitional//EN\">\n"; out.println( docType + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + "Witam na chronionej stronie"; + "</H1>\n" +
"Gratuluję. Uzyskałeś dostęp do ściśle \n tajnego dokumentu.\n" + "</BODY></HTML>");
} else {askForPassword(response); }}
}
21
JAVA – Servlety: Prosta autoryzacja za pomocą protokołu HTTP: Żądanie autoryzacji przez ustawienie nagłówka odpowiedzi
private void askForPassword(HttpServletResponse response) {
response.setStatus(response.SC_UNAUTHORIZED); // Ie 401
response.setHeader("WWW-Authenticate", "BASIC realm=\"privileged-few\"");}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}