Servlet de interfață 1.1
Astăzi începem un subiect nou și interesant - servlet-uri . Adăugarea servlet-urilor la Java a făcut ca Java să fie standardul de facto pentru aplicațiile de server mari. 80% din tot software-ul pentru întreprinderi din lume este scris în Java. Și în China, totul este 100%. Deci, ce sunt servleturile?
Un servlet este exact ceea ce transformă un program Java într-un serviciu web și îi permite să proceseze cererile de la clienți. Și a fost așa...
În anii 90, imediat după apariția World Wide Web, au apărut clienții web (browsere) și serverele web. Serverele web, de obicei, distribuiau pur și simplu fișierul pe care l-au stocat pe Internet: pagini html, scripturi, imagini etc.
La un moment dat, toată lumea a ajuns la concluzia că ar fi necesar să facem ambele părți mai inteligente. La paginile HTML a fost adăugat JavaScript, iar pe servere au fost adăugate pluginuri - scripturi speciale care au fost apelate ca răspuns la anumite solicitări și au făcut comportamentul serverului mai flexibil și mai inteligent.
Deci, un servlet este un astfel de plugin Java care a fost încorporat Java web-server
și i-a permis să execute cod Java atunci când a fost solicitat pentru anumite pagini. Și deja acest cod Java, reprezentat de o clasă moștenită de la clasa Servlet, a făcut ceea ce intenționau dezvoltatorii săi.
Și după cum știți deja, cel mai popular server web Java este Tomcat . Numit, apropo, în onoarea pisicii Tom din desenul animat „Tom și Jerry”.
Cum interacționează Tomcat cu servlet-urile? De fapt, acest proces este standardizat și se numește ciclul de viață al servletului . În acesta, un servlet este un obiect încărcat, iar un server web este un container de servlet .
Dacă servletul nu a fost încă încărcat , atunci:
- Clasa de servlet este încărcată de container.
- Containerul creează o instanță a clasei (obiectului) servlet-ului.
- Containerul apelează o metodă
init()
pe obiectul servlet. Metoda este apelată o singură dată.
Ciclul de lucru standard - deservirea unei cereri de client :
- Fiecare cerere este procesată într-un fir separat.
- Containerul apelează o metodă
service()
pe servlet și trece acolo obiectele ServletRequest și ServletResponse. - Pentru a termina servletul, este apelată o metodă
destroy()
pe obiectul servlet. Se numește o singură dată.
Pot exista multe motive pentru care un servlet se termină:
- Programatorul repornește serverul web, este necesar să închideți cu grație toate servleturile.
- Programatorul încarcă o nouă versiune a servlet-ului, cea veche trebuie să fie descărcată corect.
- Și așa mai departe.
Amintiți-vă principalul lucru: serverul web și servleturile sale ar trebui să funcționeze fără eșecuri și să repornească luni de zile, deservind mii de solicitări pe minut. Prin urmare, codul atât pentru încărcare, cât și pentru lucru, și pentru descărcarea unui servlet ar trebui să fie întotdeauna scris de foarte înaltă calitate.
1.2 Clasa HttpServlet
Clasa Servlet există pentru a standardiza modul în care funcționează un servlet și un container. Programatorii nu lucrează direct cu această clasă. Ei bine, rareori funcționează. Clasa cea mai des folosită HttpServlet
este moștenită de la Servlet.
Această clasă are mai multe metode care ne vor fi utile. Le vei folosi adesea:
Metodă | Descriere | |
---|---|---|
1 | init() |
Apelat o dată când servletul este încărcat |
2 | destroy() |
Apelat o dată când servletul este descărcat |
3 | service(HttpRequest, HttpResponse) |
Apelat pentru fiecare cerere nouă către servlet |
4 | doGet(HttpRequest, HttpResponse) |
Apelat pentru fiecare cerere GET nouă către servlet |
5 | doPost(HttpRequest, HttpResponse) |
Apelat pentru fiecare cerere POST nouă către servlet |
6 | doHead(HttpRequest, HttpResponse) |
Apelat pentru fiecare cerere HEAD nouă către servlet |
7 | doDelete(HttpRequest, HttpResponse) |
Apelat pentru fiecare nouă solicitare DELETE către servlet |
8 | doPut(HttpRequest, HttpResponse) |
Apelat pentru fiecare cerere PUT nouă către servlet |
Metodele init()
și destroy()
sunt moștenite din clasa Servlet. Prin urmare, dacă decideți să le înlocuiți în servletul dvs., va trebui să apelați și implementarea lor din clasa de bază. Comanda este folosită pentru aceasta super.method name()
.
Exemplu de servlet:
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();
}
}
}
Metoda serviciului 1.3 (HttpServletRequest, HttpServletResponse).
Dacă te uiți la procesarea unei cereri de client din punctul de vedere al unui servlet, atunci lucrurile stau cam așa.
Pentru fiecare cerere de client, containerul (serverul web) creează HttpServletRequest
și obiectează HttpServletResponse
, apoi apelează o metodă service(HttpServletRequest request, HttpServletResponse response)
pe servletul corespunzător. Aceste obiecte îi sunt transmise, astfel încât metoda să poată prelua datele necesare request
și să pună rezultatul muncii în response
.
Metoda service()
are o implementare implicită. Dacă nu este redefinit, atunci va fi executat. Asta face el.
Metoda service()
determină tipul metodei HTTP din cerere (GET, POST, ...) și apelează metoda corespunzătoare solicitării.
Metodă | Descriere | |
---|---|---|
1 | service(HttpRequest, HttpResponse) |
Apelat pentru fiecare cerere nouă către servlet |
2 | doGet(HttpRequest, HttpResponse) |
Apelat pentru fiecare cerere GET nouă către servlet |
3 | doPost(HttpRequest, HttpResponse) |
Apelat pentru fiecare cerere POST nouă către servlet |
4 | doHead(HttpRequest, HttpResponse) |
Apelat pentru fiecare cerere HEAD nouă către servlet |
5 | doDelete(HttpRequest, HttpResponse) |
Apelat pentru fiecare nouă solicitare DELETE către servlet |
6 | doPut(HttpRequest, HttpResponse) |
Apelat pentru fiecare cerere PUT nouă către servlet |
În clasa dvs., puteți fie să redefiniți o metodă service()
, fie să o lăsați în pace, dar apoi să redefiniți metodele doGet()
, doPost()
, ... după cum este necesar.
GO TO FULL VERSION