CodeGym /Java блог /Случаен /Част 5. Сървлети и Java Servlet API. Писане на просто уеб...
John Squirrels
Ниво
San Francisco

Част 5. Сървлети и Java Servlet API. Писане на просто уеб приложение

Публикувано в групата
Този материал е част от поредицата "Въведение в развитието на предприятието". Предишни статии: Част 5. Сървлети и Java Servlet API.  Писане на просто уеб приложение - 1Вече знаете How да пишете Java applications, които показват текст на конзолата, но все още не знаете How да създадете първото си уеб приложение? Чудесно, настани се удобно. В тази статия ще се запознаем със сървлетите и ще напишем приложение, с което да се хвалите на приятелите си, без да им изпращате JAR файл и без да ги принуждавате да изтеглят Java. Нека напишем просто уеб приложение . Ако все още не сте запознати с подходите, използвани в уеб разработката, препоръчвам ви да започнете, като прочетете първата статия от поредицата „ Въведение в развитието на предприятието “.

Какво е сървлет?

Първо, нека разберем Howво представляват сервлетите и защо чувате за тях толкова често. Java Servlet API е стандартизиран API, предназначен да бъде внедрен на сървъра. Взаимодейства с клиентите по схема заявка-отговор. Сървлетът е клас, който може да получава заявки от клиент и да връща отговори на клиента . Всъщност сървлетите са точно градивните елементи, които използваме, за да създадем клиент-сървър архитектура в Java. Може би си спомняте, че вече говорихме за тази архитектура в друга от статиите от поредицата. Няма да обикаляме около храста: нека напишем code веднага.

Какво ви трябва, за да създадете уеб приложение

За най-голямо удобство при работа с Java сървлети се нуждаете от IntelliJ IDEA Ultimate Edition. Това е платен продукт, но можете да активирате 30-дневен пробен период or да използвате versionта за ранен достъп, която винаги е безплатна. Освен това инсталирайте Apache Tomcat — сървъра на нашето приложение. Tomcat е сервлет контейнер: той обработва входящи заявки и ги предава на нашето приложение. Изтеглете Tomcat тук .

Нека създадем нашето първо уеб приложение

Ако всичко е готово, създайте проект на Maven. Ако не сте запознати с Maven, погледнете предишната статия . Нека да започнем!
  1. В pom.xml добавете зависимост javax.servlet-api и укажете WAR опаковка:

    
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
    
       <groupId>org.example</groupId>
       <artifactId>servlets</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>war</packaging>
    
       <dependencies>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>4.0.1</version>
           </dependency>
       </dependencies>
    </project>
    

    Прост сервлет клас:

    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/hello")
    public class MainServlet extends HttpServlet {
    
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           resp.setContentType("text/html");
           PrintWriter printWriter = resp.getWriter();
           printWriter.write("Hello!");
           printWriter.close();
       }
    }
    
  2. За да стартирате приложението, трябва да създадете конфигурация на Tomcat:

    Част 5. Сървлети и Java Servlet API.  Писане на просто уеб приложение - 2Част 5. Сървлети и Java Servlet API.  Писане на просто уеб приложение - 3

  3. След това посочваме коя version на Tomcat ще използваме и URL address и порта за комуникация със сървъра. Трябва да имате нещо подобно:

    Част 5. Сървлети и Java Servlet API.  Писане на просто уеб приложение - 4
  4. Сега просто трябва да посочим артефакта (сглобения проект в JAR архив), който ще бъде разположен в контейнера. Можете да щракнете върху бутона Fix и да изберете war exploded : това означава, че след като проектът бъде възстановен, артефактът автоматично ще бъде поставен в контейнера на сервлета. Част 5. Сървлети и Java Servlet API.  Писане на просто уеб приложение - 5

  5. Стойността по подразбиране за контекста на приложението е servlets_war_exploded . Това означава, че имаме достъп до приложението на: http://localhost:8080/servlets_war_exploded .

    Защо ще искаме допълнителен текст? Нека изтрием ненужното. Сега addressът на нашето уеб приложение е: http://localhost:8080 .

    Част 5. Сървлети и Java Servlet API.  Писане на просто уеб приложение - 6
  6. Натиснете OK. Виждаме, че вече можем да стартираме приложението:

    Част 5. Сървлети и Java Servlet API.  Писане на просто уеб приложение - 7

    Сега, когато отворите приложението в браузъра си, трябва да получите грешка 404. Това има смисъл, тъй като addressът http://localhost:8080/ се нуждае от сървлет, който се преобразува в "/", но единственият ни сървлет се преобразува в "/hello" .

  7. Имаме достъп до него на http://localhost:8080/hello . След като направим това, получаваме очаквания отговор — низът „Здравей“!

Ако всичко работи, нека анализираме codeа. За да направите HTTP-сървлет от обикновен клас , той трябва да наследи класа HttpServlet. Над декларацията на класа посочваме анотацията @WebServlet(). Това е мястото, където свързваме (or картографираме) сървлета към определен път ("/hello"). Тази анотация се появи само в Java Servlet API 3.0, така че в Интернет има много примери, при които картографирането на сървлети се извършва чрез XML файл. Това вече не е необходимо. За да обработваме GET заявки , ние заместваме doGet()метода. Обърнете внимание на параметрите на метода: HttpServletRequestи HttpServletResponse. Обектът HttpServletRequestни предоставя цялата необходима информация за заявката. В HttpServletResponseпишем нашия отговор и задаваме необходимите заглавки.

Работа с параметри и сесия

Нека подобрим нашия сервлет, така че да може да обработва параметри на заявката и да работи със сесия:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       HttpSession session = req.getSession();
       Integer visitCounter = (Integer) session.getAttribute("visitCounter");
       if (visitCounter == null) {
           visitCounter = 1;
       } else {
           visitCounter++;
       }
       session.setAttribute("visitCounter", visitCounter);
       String username = req.getParameter("username");
       resp.setContentType("text/html");
       PrintWriter printWriter = resp.getWriter();
       if (username == null) {
           printWriter.write("Hello, Anonymous" + "<br>");
       } else {
           printWriter.write("Hello, " + username + "<br>");
       }
       printWriter.write("Page was visited " + visitCounter + " times.");
       printWriter.close();
   }
}
Сега сървлетът работи със сесия, увеличавайки стойността при visitCounterвсяко посещение на pageта. Ако visitCounterатрибутът все още не е създаден (при първото посещение на pageта), методът getAttribute()връща null, така че трябва да проверим за null. Същото важи и за параметрите на заявката. Ако потребителят не предаде параметъра потребителско име, тогава неговата стойност ще бъде нулева. В този случай ние поздравяваме потребителя като анонимен посетител. За предаване на параметър в GET заявка се използва низ за заявка. Например можем да използваме следния URL address: http:// localhost:8080/hello? Потребителско име=Пол. Можете да прочетете повече за HTTP заявките в предишната статияв сериала. В момента нашето приложение няма много логика, но е малко досадно, че получаваме грешка 404 в основния път. За да коригираме това, ще създадем друг сървлет и ще го съпоставим към началната page: @WebServlet("/"). Целта на този сървлет е да пренасочва заявките към пътя "/hello". Има два начина да направите това: чрез „напред“ or „пренасочване“. Може би си струва да разберете разликата между тях. Пренасочването делегира обработката на заявката към друг сървлет на сървъра. Клиентът не участва. За да направите това, добавете следния code към метода doGet() на новия сървлет:

getServletContext().getRequestDispatcher("/hello").forward(req, resp);
В този code получаваме достъп до контекста на сървлета, получаваме диспечера на заявки за съответния сървлет и го молим да обработи конкретна заявка с посочените аргументи (req, resp). Пренасочването връща на клиента address, който клиентът трябва да използва, за да обработи своята заявка . Повечето браузъри автоматично навигират до върнатия URL address. За да приложите пренасочване, трябва да добавите този code:

resp.sendRedirect(req.getContextPath() + "/hello");
Извикваме redirect()метода на HttpServletResponseпараметъра и му предаваме address, който клиентът трябва да използва. Ето една важна подробност: HTTP параметрите трябва да се добавят и в края на пълния път за пренасочване, което не е много удобно. В нашата ситуация е за предпочитане да се използва forward, но понякога използването redirectе по-добре. Ако разбирате разликата в начина им на работа, няма да направите грешен избор. Кодът за новия сървлет изглежда така:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class IndexServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        getServletContext().getRequestDispatcher("/hello").forward(req, resp);
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}

Резюме

Вашето първо уеб приложение е готово. В следващата статия ще научите How да го внедрите, без да използвате IntelliJ IDEA. Написахме приложение, което обработва само GET заявки. Останалите HTTP методи се обработват по подобен начин — чрез замяна на съответните методи на родителския клас. Можете да използвате прости сървлети като този, за да изградите сложни универсални уеб applications. Разбира се, използването на големи рамки като Spring прави това много по-лесно. Но ако наистина искате да се задълбочите във всички възможности на сървлетите, можете да прочетете официалната спецификация . Част 6. Контейнери на сервлети Част 7. Представяне на модела MVC (Model-View-Controller)
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION