1.1 gränssnitt Servlet
Idag startar vi en ny och intressant ämnesservlet . Det var tillägget av servlets till Java som ledde till att Java var de facto-standarden för stora serverapplikationer. 80 % av all företagsprogramvara i världen är skriven i Java. Och i Kina är allt 100%. Så vad är servlets?
En servlet är precis det som gör ett Java-program till en webbtjänst och låter det behandla förfrågningar från klienter. Och det var så här...
På 90-talet, direkt efter tillkomsten av World Wide Web, dök webbklienter (webbläsare) och webbservrar upp. Webbservrar distribuerade vanligtvis helt enkelt filen de hade lagrat över Internet: html-sidor, skript, bilder, etc.
Vid något tillfälle kom alla fram till att det skulle vara nödvändigt att göra båda sidor smartare. JavaScript lades till på HTML-sidorna och plugins till servrarna – speciella skript som anropades som svar på vissa förfrågningar och gjorde serverns beteende mer flexibelt och smartare.
Så en servlet är en sådan Java-plugin som var inbyggd i Java web-server
och tillät den att köra Java-kod när den efterfrågades för vissa sidor. Och redan denna Java-kod, representerad av en klass som ärvts från Servlet-klassen, gjorde vad dess utvecklare avsåg.
Och som du redan vet är den mest populära Java-webbservern Tomcat . Namngiven, förresten, för att hedra katten Tom från den tecknade filmen "Tom and Jerry".
Hur interagerar Tomcat med servlets? Faktum är att denna process är standardiserad och kallas servlets livscykel . I den är en servlet ett laddningsbart objekt och en webbserver är en servletbehållare .
Om servleten ännu inte har laddats , då:
- Servletklassen laddas av behållaren.
- Behållaren skapar en instans av klassen (objektet) för servleten.
- Behållaren anropar en metod
init()
på servletobjektet. Metoden anropas endast en gång.
Standard arbetscykel - betjänar en kundförfrågan :
- Varje begäran behandlas i en separat tråd.
- Behållaren anropar en metod
service()
på servleten och skickar ServletRequest- och ServletResponse-objekten dit. - För att avsluta servleten anropas en metod
destroy()
på servletobjektet. Det kallas bara en gång.
Det kan finnas många anledningar till att en servlet avslutas:
- Programmeraren startar om webbservern, det är nödvändigt att graciöst stänga av alla servlets.
- Programmeraren laddar en ny version av servleten, den gamla måste laddas ur korrekt.
- Och så vidare.
Kom ihåg det viktigaste: webbservern och dess servlets ska fungera utan misslyckanden och startas om i månader och betjäna tusentals förfrågningar per minut. Därför bör koden för både laddning, arbete och urladdning av en servlet alltid skrivas av mycket hög kvalitet.
1.2 HttpServlet klass
Servlet-klassen finns för att standardisera hur en servlet och en container fungerar. Programmerare arbetar inte direkt med denna klass. Tja, de fungerar sällan. Den mest använda klassen HttpServlet
ärvs från Servlet.
Den här klassen har flera metoder som kommer att vara användbara för oss. Du kommer ofta att använda dem:
Metod | Beskrivning | |
---|---|---|
1 | init() |
Anropas en gång när servleten är laddad |
2 | destroy() |
Anropas en gång när servleten är urladdad |
3 | service(HttpRequest, HttpResponse) |
Kallas för varje ny begäran till servlet |
4 | doGet(HttpRequest, HttpResponse) |
Anropas för varje ny GET-förfrågan till servleten |
5 | doPost(HttpRequest, HttpResponse) |
Kallas för varje ny POST-begäran till servleten |
6 | doHead(HttpRequest, HttpResponse) |
Kallas för varje ny HEAD-begäran till servleten |
7 | doDelete(HttpRequest, HttpResponse) |
Anropas för varje ny DELETE-begäran till servleten |
8 | doPut(HttpRequest, HttpResponse) |
Kallas för varje ny PUT-begäran till servleten |
Metoderna init()
och destroy()
ärvs från Servlet-klassen. Därför, om du bestämmer dig för att åsidosätta dem i din servlet, måste du också anropa deras implementering från basklassen. Kommandot används för detta super.method name()
.
Servlet exempel:
public class FirstHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Getting the parameter “secret” from request
String secret = request.getParameter("secret");
// Put parameter “secret” into Http-session
HttpSession session = request.getSession(true);
session.setAttribute("secret", secret);
// Print HTML as response for browser
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Header</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet example "+ secret +"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
1.3 tjänst (HttpServletRequest, HttpServletResponse) metod
Om du tittar på behandlingen av en klientförfrågan från en servlets synvinkel, så är saker ungefär så här.
För varje klientbegäran skapar behållaren (webbservern) HttpServletRequest
och objekt HttpServletResponse
, och anropar sedan en metod service(HttpServletRequest request, HttpServletResponse response)
på motsvarande servlet. Dessa objekt skickas till den så att metoden kan ta nödvändiga data från request
och lägga in resultatet av arbetet i response
.
Metoden service()
har en standardimplementering. Om det inte omdefinieras kommer det att köras. Det är vad han gör.
Metoden service()
bestämmer HTTP-metodtypen från begäran (GET, POST, ...) och anropar metoden som motsvarar begäran.
Metod | Beskrivning | |
---|---|---|
1 | service(HttpRequest, HttpResponse) |
Kallas för varje ny begäran till servlet |
2 | doGet(HttpRequest, HttpResponse) |
Anropas för varje ny GET-förfrågan till servleten |
3 | doPost(HttpRequest, HttpResponse) |
Kallas för varje ny POST-begäran till servleten |
4 | doHead(HttpRequest, HttpResponse) |
Kallas för varje ny HEAD-begäran till servleten |
5 | doDelete(HttpRequest, HttpResponse) |
Anropas för varje ny DELETE-begäran till servleten |
6 | doPut(HttpRequest, HttpResponse) |
Kallas för varje ny PUT-begäran till servleten |
I din klass kan du antingen omdefiniera en metod service()
, eller lämna den ifred, men sedan omdefiniera metoder doGet()
, , doPost()
... efter behov.