1.1 grensesnitt Servlet
I dag starter vi en ny og interessant emneservlets . Det var tillegget av servlets til Java som førte til at Java var de facto-standarden for store serverapplikasjoner. 80 % av all bedriftsprogramvare i verden er skrevet i Java. Og i Kina er alt 100%. Så hva er servlets?
En servlet er akkurat det som gjør et Java-program til en webtjeneste og lar det behandle forespørsler fra klienter. Og det var sånn...
På 90-tallet, rett etter fremkomsten av World Wide Web, dukket det opp nettklienter (nettlesere) og webservere. Nettservere distribuerte vanligvis filen de hadde lagret over Internett: html-sider, skript, bilder osv.
På et tidspunkt kom alle frem til at det ville være nødvendig å gjøre begge sider smartere. JavaScript ble lagt til HTML-sidene, og plugins ble lagt til serverne – spesielle skript som ble kalt som svar på visse forespørsler og gjorde serverens oppførsel mer fleksibel og smartere.
Så en servlet er en slik Java-plugin som var innebygd i Java web-server
og tillot den å kjøre Java-kode når det ble bedt om det for visse sider. Og allerede denne Java-koden, representert av en klasse arvet fra Servlet-klassen, gjorde det utviklerne hadde til hensikt.
Og som du allerede vet, er den mest populære Java-webserveren Tomcat . Oppkalt, forresten, til ære for katten Tom fra tegneserien "Tom and Jerry".
Hvordan samhandler Tomcat med servlets? Faktisk er denne prosessen standardisert og kalles servlet-livssyklusen . I den er en servlet et lastbart objekt, og en webserver er en servletbeholder .
Hvis servleten ennå ikke er lastet inn , så:
- Servletklassen lastes av containeren.
- Beholderen oppretter en forekomst av klassen (objektet) til servleten.
- Containeren kaller en metode
init()
på servlet-objektet. Metoden kalles bare én gang.
Standard arbeidssyklus - betjene en kundeforespørsel :
- Hver forespørsel behandles i en egen tråd.
- Containeren kaller en metode
service()
på servleten og sender ServletRequest- og ServletResponse-objektene dit. - For å avslutte servleten kalles en metode
destroy()
på servletobjektet. Det kalles bare én gang.
Det kan være mange grunner til at en servlet avsluttes:
- Programmereren starter webserveren på nytt, det er nødvendig å stenge alle servlets elegant.
- Programmereren laster en ny versjon av servleten, den gamle må lastes ut på riktig måte.
- Og så videre.
Husk det viktigste: webserveren og dens servlets skal fungere uten feil og starte på nytt i flere måneder, og betjene tusenvis av forespørsler per minutt. Derfor bør koden for både lasting, arbeid og lossing av en servlet alltid skrives av meget høy kvalitet.
1.2 HttpServlet klasse
Servlet-klassen eksisterer for å standardisere hvordan en servlet og en beholder fungerer. Programmerere jobber ikke direkte med denne klassen. Vel, de fungerer sjelden. Den mest brukte klassen HttpServlet
er arvet fra Servlet.
Denne klassen har flere metoder som vil være nyttige for oss. Du vil ofte bruke dem:
Metode | Beskrivelse | |
---|---|---|
1 | init() |
Kalt en gang når servleten er lastet |
2 | destroy() |
Ringes en gang når servleten er losset |
3 | service(HttpRequest, HttpResponse) |
Kalt for hver ny forespørsel til servleten |
4 | doGet(HttpRequest, HttpResponse) |
Kalt opp for hver ny GET-forespørsel til servleten |
5 | doPost(HttpRequest, HttpResponse) |
Kalt for hver ny POST-forespørsel til servleten |
6 | doHead(HttpRequest, HttpResponse) |
Kalt for hver ny HEAD-forespørsel til servleten |
7 | doDelete(HttpRequest, HttpResponse) |
Kalt opp for hver ny DELETE-forespørsel til servleten |
8 | doPut(HttpRequest, HttpResponse) |
Kalt for hver ny PUT-forespørsel til servleten |
Metodene init()
og destroy()
er arvet fra Servlet-klassen. Derfor, hvis du bestemmer deg for å overstyre dem i servleten din, må du også ringe implementeringen av dem fra basisklassen. Kommandoen brukes til dette super.method name()
.
Servlet eksempel:
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 tjeneste(HttpServletRequest, HttpServletResponse) metode
Hvis du ser på behandlingen av en klientforespørsel fra en servlets synspunkt, så er ting noe sånt som dette.
HttpServletRequest
For hver klientforespørsel oppretter og objekter containeren (webserveren) HttpServletResponse
, og kaller deretter en metode service(HttpServletRequest request, HttpServletResponse response)
på den tilsvarende servleten. Disse objektene sendes til den slik at metoden kan ta nødvendige data fra request
og sette resultatet av arbeidet inn i response
.
Metoden service()
har en standardimplementering. Hvis den ikke omdefineres, vil den bli utført. Det er det han gjør.
Metoden service()
bestemmer HTTP-metodetypen fra forespørsel (GET, POST, ...) og kaller metoden som tilsvarer forespørselen.
Metode | Beskrivelse | |
---|---|---|
1 | service(HttpRequest, HttpResponse) |
Kalt for hver ny forespørsel til servleten |
2 | doGet(HttpRequest, HttpResponse) |
Kalt opp for hver ny GET-forespørsel til servleten |
3 | doPost(HttpRequest, HttpResponse) |
Kalt for hver ny POST-forespørsel til servleten |
4 | doHead(HttpRequest, HttpResponse) |
Kalt for hver ny HEAD-forespørsel til servleten |
5 | doDelete(HttpRequest, HttpResponse) |
Kalt opp for hver ny DELETE-forespørsel til servleten |
6 | doPut(HttpRequest, HttpResponse) |
Kalt for hver ny PUT-forespørsel til servleten |
I klassen din kan du enten redefinere én metode service()
, eller la den være i fred, men deretter redefinere metoder doGet()
, doPost()
, ... etter behov.
GO TO FULL VERSION