1.1 interface-servlet
Vandaag starten we met een nieuw en interessant onderwerp - servlets . Het was de toevoeging van servlets aan Java die ertoe leidde dat Java de de facto standaard werd voor grote servertoepassingen. 80% van alle bedrijfssoftware ter wereld is geschreven in Java. En in China is alles 100%. Dus wat zijn servlets?
Een servlet is precies wat een Java-programma verandert in een webservice en waarmee het verzoeken van klanten kan verwerken. En het was zo...
In de jaren 90, direct na de komst van het World Wide Web, verschenen webclients (browsers) en webservers. Webservers verspreidden meestal eenvoudig het bestand dat ze hadden opgeslagen via internet: html-pagina's, scripts, afbeeldingen, enz.
Op een gegeven moment kwam iedereen tot de conclusie dat het nodig zou zijn om beide partijen slimmer te maken. JavaScript werd aan de HTML-pagina's toegevoegd en er werden plug-ins aan de servers toegevoegd - speciale scripts die werden aangeroepen als reactie op bepaalde verzoeken en die het gedrag van de server flexibeler en slimmer maakten.
Een servlet is dus zo'n Java-plug-in die is ingebouwd Java web-server
en waarmee deze Java-code kan uitvoeren wanneer daarom wordt gevraagd voor bepaalde pagina's. En deze Java-code, vertegenwoordigd door een klasse geërfd van de Servlet-klasse, deed al wat de ontwikkelaars van plan waren.
En zoals u al weet, is Tomcat de meest populaire Java-webserver . Overigens genoemd ter ere van de kat Tom uit de tekenfilm "Tom en Jerry".
Hoe werkt Tomcat samen met servlets? In feite is dit proces gestandaardiseerd en wordt het de levenscyclus van de servlet genoemd . Hierin is een servlet een laadbaar object en een webserver een servletcontainer .
Als de servlet nog niet is geladen , dan:
- De servletklasse wordt geladen door de container.
- De container maakt een instantie van de klasse (object) van de servlet.
- De container roept een methode aan
init()
op het servletobject. De methode wordt slechts eenmaal aangeroepen.
Standaard werkcyclus - onderhoud van een klantverzoek :
- Elk verzoek wordt verwerkt in een aparte thread.
- De container roept een methode aan
service()
op de servlet en geeft de objecten ServletRequest en ServletResponse daar door. - Om de servlet te beëindigen, wordt een methode aangeroepen
destroy()
op het servletobject. Het wordt maar één keer genoemd.
Er kunnen veel redenen zijn waarom een servlet stopt:
- De programmeur start de webserver opnieuw op, het is noodzakelijk om alle servlets correct af te sluiten.
- De programmeur laadt een nieuwe versie van de servlet, de oude moet correct worden uitgeladen.
- Enzovoort.
Onthoud het belangrijkste: de webserver en zijn servlets moeten maandenlang zonder storingen en herstarts werken en duizenden verzoeken per minuut verwerken. Daarom moet de code voor zowel het laden, werken als ontladen van een servlet altijd van zeer hoge kwaliteit zijn.
1.2 HttpServlet-klasse
De Servlet-klasse bestaat om te standaardiseren hoe een servlet en een container werken. Programmeurs werken niet rechtstreeks met deze klasse. Nou, ze werken zelden. De meest gebruikte klasse HttpServlet
is geërfd van Servlet.
Deze klasse heeft verschillende methoden die nuttig voor ons zullen zijn. Je zult ze vaak gebruiken:
Methode | Beschrijving | |
---|---|---|
1 | init() |
Eenmaal aangeroepen wanneer de servlet is geladen |
2 | destroy() |
Eén keer aangeroepen wanneer de servlet wordt verwijderd |
3 | service(HttpRequest, HttpResponse) |
Opgeroepen voor elk nieuw verzoek aan de servlet |
4 | doGet(HttpRequest, HttpResponse) |
Opgeroepen voor elk nieuw GET-verzoek aan de servlet |
5 | doPost(HttpRequest, HttpResponse) |
Aangeroepen voor elk nieuw POST-verzoek aan de servlet |
6 | doHead(HttpRequest, HttpResponse) |
Opgeroepen voor elk nieuw HEAD-verzoek aan de servlet |
7 | doDelete(HttpRequest, HttpResponse) |
Opgeroepen voor elk nieuw DELETE-verzoek aan de servlet |
8 | doPut(HttpRequest, HttpResponse) |
Geroepen voor elk nieuw PUT-verzoek aan de servlet |
De methoden init()
en destroy()
worden geërfd van de Servlet-klasse. Daarom, als u besluit ze in uw servlet te overschrijven, moet u hun implementatie ook vanuit de basisklasse aanroepen. Hiervoor wordt het commando gebruikt super.method name()
.
Servlet-voorbeeld:
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 service (HttpServletRequest, HttpServletResponse) methode
Als je de verwerking van een klantverzoek bekijkt vanuit het oogpunt van een servlet, dan zit het ongeveer zo.
Voor elk clientverzoek maakt de container (webserver) HttpServletRequest
en objecten aan HttpServletResponse
en roept vervolgens een methode aan service(HttpServletRequest request, HttpServletResponse response)
op de overeenkomstige servlet. Deze objecten worden eraan doorgegeven zodat de methode de nodige gegevens kan halen uit request
en het resultaat van het werk in kan zetten response
.
De methode service()
heeft een standaard implementatie. Als het niet opnieuw wordt gedefinieerd, wordt het uitgevoerd. Dat is wat hij doet.
De methode service()
bepaalt het HTTP-methodetype van het verzoek (GET, POST, ...) en roept de methode aan die overeenkomt met het verzoek.
Methode | Beschrijving | |
---|---|---|
1 | service(HttpRequest, HttpResponse) |
Opgeroepen voor elk nieuw verzoek aan de servlet |
2 | doGet(HttpRequest, HttpResponse) |
Opgeroepen voor elk nieuw GET-verzoek aan de servlet |
3 | doPost(HttpRequest, HttpResponse) |
Aangeroepen voor elk nieuw POST-verzoek aan de servlet |
4 | doHead(HttpRequest, HttpResponse) |
Opgeroepen voor elk nieuw HEAD-verzoek aan de servlet |
5 | doDelete(HttpRequest, HttpResponse) |
Opgeroepen voor elk nieuw DELETE-verzoek aan de servlet |
6 | doPut(HttpRequest, HttpResponse) |
Geroepen voor elk nieuw PUT-verzoek aan de servlet |
In je klas kun je ofwel een methode herdefiniëren service()
, ofwel deze met rust laten, maar dan methoden doGet()
, doPost()
, ... herdefiniëren als dat nodig is.
GO TO FULL VERSION