JavaRush /Java блогу /Random-KY /5-бөлүк. Сервлеттер, Java сервлет API. Жөнөкөй веб-тиркем...
Professor Hans Noodles
Деңгээл

5-бөлүк. Сервлеттер, Java сервлет API. Жөнөкөй веб-тиркеме жазуу

Группада жарыяланган
Бул материал "Ишкананы өнүктүрүүгө киришүү" сериясынын бир бөлүгү болуп саналат. Мурунку макалалар: 5-бөлүк. Сервлеттер, Java сервлет API.  Жөнөкөй веб-тиркеме жазуу - 1Сиз консолго текст чыгарган Java тиркемелерин кантип жазууну билесизби, бирок сиз дагы деле биринчи веб тиркемеңизди кантип түзүүнү билбейсизби? Керемет, өзүңүзгө ыңгайлуу болуңуз. Бул макалада биз сервлеттер менен таанышып, досторуңузга жарник жөнөтпөстөн же Java жүктөп алууга мажбурлабастан көрсөтө турган тиркемени жазабыз. Келгиле, веб-тиркемени жазалы . Эгерде сиз веб-программалоодо колдонулган ыкмалар менен тааныш эмес болсоңуз, мен сизге " Ишкананы өнүктүрүүгө киришүү " сериясындагы биринчи макаладан баштап окууну сунуштайм.

Сервлет деген эмне

Биринчиден, келгиле, сервлет деген эмне экенин жана ал жөнүндө эмне үчүн мынчалык көп укканыңызды аныктап көрөлү. Java Servlet API serverде ишке ашыруу жана суроо-жооп схемасын колдонуу менен кардар менен иштөө үчүн иштелип чыккан стандартташтырылган API болуп саналат. Сервлет - бул кардардан суроо-талаптарды кабыл алып, ага жооп кайтара ала турган класс. Ооба, Javaдагы сервлеттер так кардар-server архитектурасы курулган элементтер. Эсиңизде болсо, биз бул тууралуу сериядагы макалалардын биринде айтканбыз. Келгиле, бадалдын айланасында урбайлы: келгиле, дароо code жазалы.

Веб тиркемесин түзүү үчүн эмне керек

Javaдагы сервлеттер менен ыңгайлуу иштөө үчүн сизге Intellij IDEA Ultimate Edition керек болот. Бул акы төлөнөт, бирок сиз 30 күндүк сыноо мөөнөтүн активдештире аласыз же эрте жетүү versionсын колдоно аласыз - ал ар дайым акысыз. Ошондой эле биздин колдонмо serverибизди орнотуңуз - Apache Tomcat. Tomcat - бул сервлет контейнери: бул сырттан келген суроо-талаптарды иштетип, аларды биздин тиркемеге өткөрүп берет. Сиз бул шилтемеден Tomcat жүктөй аласыз .

Биринчи веб-тиркемени түзүү

Баары даяр болсо, анда Maven долбоорун түзөлү. Эгер сиз Maven менен тааныш болбосоңуз, мурунку макалага көңүл буруңуз . Баштайлы!
  1. pom.xml ичинде javax.servlet-api көз карандылыгын кошуп, пакеттөө согушун орнотуңуз:

    <?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 сервлет API.  Жөнөкөй веб-тиркеме жазуу - 2 5-бөлүк. Сервлеттер, Java сервлет API.  Жөнөкөй веб-тиркеме жазуу - 3

  3. Андан кийин биз Tomcatтын кайсы versionсын колдоно турганыбызды, serverге кире турган URL дарегин жана портту көрсөтөбүз. Сиз бул сыяктуу нерсени алышыңыз керек:

    5-бөлүк. Сервлеттер, Java сервлет API.  Жөнөкөй веб-тиркеме жазуу - 4
  4. Артефактты (бир банкка архивге чогултулган долбоор) көрсөтүү гана калды, ал контейнерге жайгаштырылат. Сиз "Оңдоо" баскычын чыкылдатып , согушту тандай аласыз : бул долбоор кайра курулгандан кийин, артефакт автоматтык түрдө сервлет контейнерине жайгаштырылат дегенди билдирет. 5-бөлүк. Сервлеттер, Java сервлет API.  Жөнөкөй веб-тиркеме жазуу - 5

  5. Колдонмонун контексти демейки боюнча servlets_war_exploded деп коюлган , бул колдонмого төмөнкү даректе кирүү керек дегенди билдирет: http://localhost:8080/servlets_war_exploded .

    Эмне үчүн бизге кошумча текст керек? Келгиле, керексиз нерселерди алып салалы. Азыр биздин колдонмонун дареги: http://localhost:8080 .

    5-бөлүк. Сервлеттер, Java сервлет API.  Жөнөкөй веб-тиркеме жазуу - 6

  6. OK басыңыз. Биз азыр колдонмону ишке киргизүү мүмкүнчүлүгү бар экенин көрүп жатабыз:

    5-бөлүк. Сервлеттер, Java сервлет API.  Жөнөкөй веб-тиркеме жазуу - 7

    Эми, сиз тиркемени ишке киргизгенде, браузер 404 катасын ачып, көрсөтүшү керек. Бул логикалуу, анткени http://localhost:8080/ дарегинде “/” картасы бар сервлет болушу керек жана биздин жалгыз сервлетибизде “/hello” картасы бар .

  7. Биз аны менен http://localhost:8080/hello дареги аркылуу байланышып , күтүлгөн жоопту алабыз - "Салам" сабы!

Эгер баары иштесе, codeду карап көрөлү. Кадимки класстан http сервлетін жасоо үчүн , сиз аны HttpServlet классынан мурасташыңыз керек. Класстын үстүндө биз @WebServlet() annotationсын белгилейбиз, анда биз сервлетті белгилүү бир жолго байлап (карталайбыз) («/салам»). Бул annotation Java Servlet API 3.0 ичинде гана пайда болгон, ошондуктан Интернетте сервлеттин картасы XML файлы аркылуу ишке ашкан көптөгөн мисалдар бар. Эми бул кереги жок. GET сурамдарын иштетүү үчүн , биз doGet() ыкмасын жокко чыгарабыз. Метод аргументтерине көңүл буруңуз - HttpServletRequest жана HttpServletResponse. HttpServletRequest an objectинен биз суроо-талап жөнүндө бардык керектүү маалыматты ала алабыз, 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 санын көбөйтөт. Эгерде visitCounter атрибуту али түзүлө элек болсо (баракка биринчи жолу киргениңизде), getAttribute() ыкмасы нөлдү кайтарат, андыктан нөлдү текшеришиңиз керек. Ошол эле суроо-талап параметрлерине тиешелүү. Колдонуучу колдонуучу аты параметрин өткөрбөсө, анын мааниси нөл болот. Бул учурда, биз анонимдүү колдонуучу менен саламдашабыз. GET сурамында параметрди өткөрүү үчүн жол өзгөрмөлөрү колдонулат, башкача айтканда, http://localhost:8080/hello?username=Pavel шилтемесине кирүү керек . http сурамдары тууралуу кененирээк сериядагы мурунку макаладан окуй аласыз . Эми биздин тиркемеде минималдуу логика бар, бирок тамыр жолундагы 404 ката бир аз тажатма. Аны оңдоо үчүн, келгиле, башка сервлет түзүп, аны @WebServlet("/") баштапкы бетине түшүрөлү. Бул сервлеттин милдети суроо-талаптарды “/hello” жолуна багыттоо болуп саналат. Муну жасоонун эки жолу бар: алдыга же багыттоо. Балким, алардын ортосунда кандай айырма бар экенин түшүнүү керек. алдыга - делегаттар serverдеги башка сервлетке иштетүүнү суранышат, кардар катышпайт. Бул үчүн, сиз жаңы сервлеттин doGet() ыкмасына төмөнкү codeду кошушуңуз керек:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Бул codeдо биз сервлеттин контекстине киребиз, андан керектүү сервлеттин суроо-талап менеджерин алабыз жана андан көрсөтүлгөн параметрлер менен (req, resp) белгилүү бир суроону иштеп чыгууну суранабыз. кайра багыттоо - кардарга анын суроо-талабын иштеп чыгуу үчүн кайрылуусу керек болгон даректи кайтарып берет. Көпчүлүк браузерлер автоматтык түрдө берилген шилтемеге өтүшөт. Багыттоону ишке ашыруу үчүн бул codeду кошушуңуз керек:
resp.sendRedirect(req.getContextPath() + "/hello");
HttpServletResponseде биз redirect() ыкмасын чакырабыз жана ага кардар байланыша турган даректи өткөрүп беребиз. Маанилүү детал: http параметрлери да толук багыттоо жолунун аягында кошулушу керек, бул абдан ыңгайлуу эмес. Биздин шартта, алдыга колдонуу артык, бирок кайра багыттоо колдонуу жакшыраак болот. Эгер алардын ишиндеги айырманы түшүнсөңүз, тандооңуздан жаңылбайсыз. Жаңы сервлеттин codeу төмөнкүдөй көрүнөт:
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");
   }
}

Төмөнкү сызык

Биринчи веб тиркемеңиз даяр. Кийинки макалада сиз аны Intellij IDEA колдонбостон кантип жайгаштырууну үйрөнөсүз. Биз GET өтүнүчтөрүн гана иштеткен колдонмо жаздык. Калган http методдору ошол эле жол менен иштетилет - ата-эне класстын тиешелүү ыкмаларын жокко чыгаруу. Ушундай жөнөкөй сервлеттерди колдонуу менен сиз татаал, бай веб-тиркемелерди түзө аласыз. Албетте, Spring сыяктуу чоң алHowтарды колдонуу менен, муну жасоо оңой. Бирок, эгерде сиз чындап эле сервлеттердин бардык мүмкүнчүлүктөрүн тереңирээк изилдегиңиз келсе, анда расмий спецификацияны окуй аласыз . 6-бөлүк. Сервлет контейнерлери 7-бөлүк. MVC (Модель-Көрүү-Контроллер) үлгүсүнө киришүү 8-бөлүк. Жазгы жүктөөдө чакан тиркеме жазуу
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION