CodeGym /Java Blogu /Rastgele /Java servlet kullanan ilk uygulamanız
John Squirrels
Seviye
San Francisco

Java servlet kullanan ilk uygulamanız

grupta yayınlandı
Herkese merhaba! Web geliştirmenin temel bir konsepti olarak servlet'lere aşina olacak ve bunları kullanan basit bir uygulama yazabileceksiniz. Java servlet kullanan ilk uygulamanız - 1 Gereksiz işlemlerden kaçınmak için sıfırdan başlamayacağız. Uygulamamız üzerinde çalışmaya Hibernate ile ilgili bir önceki yazımdan devam edeceğiz . Ancak servletlerle yeni tanışmaya başladığımız için Auto sınıfıyla ilgili her şeyi uygulamadan kaldırdım ve geriye sadece User sınıfını ve onu içeren eylemleri bıraktım. Proje şu şekilde yapılandırılacaktır: Java servlet kullanan ilk uygulamanız - 2Yani, servletler! Wikipedia şöyle der: "Bir Java sunucu uygulaması, bir sunucunun yeteneklerini genişleten bir Java yazılım bileşenidir. Sunucu uygulamaları birçok türde isteğe yanıt verebilmesine rağmen, genellikle web sunucularında web uygulamalarını barındırmak için web kapsayıcıları uygularlar ve bu nedenle bir sunucu olarak nitelendirilirler. yan servlet web API'si." Bu kesinlikle doğru. Burada ilk kez bir "istemci-sunucu uygulama mimarisi" kavramıyla karşılaşıyoruz. Özünde oldukça basittir. İstemci, bir HTTP isteği göndererek sunucuya erişir. Sunucu gerekli verileri üretir (örneğin, bir veritabanından alır) ve istemciye geri gönderir. En basit örnek, belirli bir sosyal ağda "Arkadaşlar" düğmesini tıkladığınızda sunucuya bir istek gönderirsiniz. Sunucu, veritabanındaki arkadaşlarınızın listesini günceller ve size (istemciye) döndürür. HTTP isteklerinin listesi oldukça geniştir, bu nedenle daha önce hiç karşılaşmadıysanız, onlar hakkında başka bir yerde okumanız sizin için en iyisi olacaktır, örneğin,burada _ Hedefimiz: Sunucu uygulamaları kullanarak bir CRUD uygulaması oluşturmak. Uygulama, HTTP isteklerini işleyen bir servlet kullanarak veritabanından kullanıcı oluşturabilmeli, okuyabilmeli, güncelleyebilmeli ve silebilmelidir. Hazırda bekletme makalesindeki uygulamamız zaten bunu yapabiliyordu, ancak doğrudan Java kodundan, daha doğrusu main() yönteminden kontrol ediliyordu. Bu sefer istekleri gönderecek olan client yani siz :) İlk yapmamız gereken pom.xml dosyamıza yeni bağımlılıklar eklemek.

 <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>com.itis4</groupId>
     <artifactId>UsersDaoProject</artifactId>
     <version>1.0-SNAPSHOT</version>
 
     <build>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-war-plugin</artifactId>
                 <version>2.6</version>
             </plugin>
         </plugins>
     </build>
 
     <dependencies>
         <!-- PostgreSQL  -->
         <dependency>
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>
             <version>9.4.1212.jre7</version>
         </dependency>
 
         <!-- Hibernate 5.2.6 Final -->
         <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-core</artifactId>
             <version>5.2.6.Final</version>
         </dependency>
 
         <dependency>
             <groupId>jstl</groupId>
             <artifactId>jstl</artifactId>
             <version>1.2</version>
         </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
             <version>3.1.0</version>
         </dependency>
 
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-webmvc</artifactId>
             <version>4.3.4.RELEASE</version>
         </dependency>
 
     </dependencies>
 
 </project>
 
3 bağımlılık ekledik:
  1. javax.servlet-api kitaplığının kendisi
  2. JSTL etiket kitaplığı. İstemci tarafını, yani JSP sayfalarını oluşturmak gerekecektir.
  3. Spring-WebMVC. Biraz sonra konuşacağımız bir Bahar sınıfına ihtiyacımız olacak.
Servlet yönetimi, servlet kapsayıcısı tarafından gerçekleştirilir. Bizim durumumuzda Apache Tomcat kullanacağız. Oldukça popülerdir - muhtemelen duymuşsunuzdur :) Servlet yaşam döngüsü aşağıdaki adımlardan oluşur:
  1. Kapsayıcıda sunucu uygulaması yoksa:
    • Sunucu uygulaması sınıfı, kapsayıcı tarafından yüklenir.
    • Kapsayıcı, servlet sınıfının bir örneğini oluşturur.
    • Kap, init() yöntemini çağırır. Bu yöntem, servlet'i başlatır ve servlet isteklere hizmet vermeden önce çağrılır. Tüm yaşam döngüsü boyunca, init() yöntemi yalnızca bir kez çağrılır.
  2. İstemci isteğine hizmet edin. Her istek kendi ayrı iş parçacığında işlenir. Kapsayıcı, her istek için service() yöntemini çağırır. Bu metot gelen talebin tipini belirler ve işlenmesi için uygun metoda gönderir. Sunucu uygulaması geliştiricisi, bu yöntemler için uygulamalar sağlamalıdır. Gerçekleştirilmemiş bir işleyici için bir istek gelirse, üst sınıfın yöntemi çağrılır ve genellikle istek sahibine bir hata döndürür.

  3. Kapsayıcının sunucu uygulamasını kaldırması gerekiyorsa, sunucu uygulamasını kullanım dışı bırakan destroy() yöntemini çağırır. init() yöntemi gibi, bu yöntem de tüm servlet döngüsü boyunca bir kez çağrılır.
Sunucu uygulamamız oldukça basit görünüyor:

 package servlets;
 
 import models.User;
 import services.UserService;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
 
 public class UserSimpleServlet extends HttpServlet {
 
     private UserService service = new UserService();
 
     public void init(ServletConfig servletConfig) {
         try {
             super.init(servletConfig);
         } catch (ServletException e) {
             e.printStackTrace();
         }
     }
 
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 
         List<User> users = service.findAllUsers();
         req.setAttribute("users", users);
         RequestDispatcher dispatcher = req.getRequestDispatcher("/showUsers.jsp");
         dispatcher.forward(req, resp);
 
     }
 
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
             throws ServletException, IOException {
 
         String name = req.getParameter("name");
         int age = Integer.parseInt(req.getParameter("age"));
         User user = new User(name, age);
         service.saveUser(user);
         resp.sendRedirect("/users");
 
     }
 
     @Override
     protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         int id = Integer.parseInt(req.getParameter("id"));
         User user = service.findUser(id);
         user.setName(req.getParameter("name"));
         user.setAge(Integer.parseInt(req.getParameter("age")));
         service.updateUser(user);
         resp.sendRedirect("/users");
     }
 
     @Override
     protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
         int id = Integer.parseInt(req.getParameter("id"));
         service.deleteUser(service.findUser(id));
         resp.sendRedirect("/users");
     }
 }
 
Gördüğünüz gibi, yukarıda açıklanan init() yöntemini içerir ve dört HTTP isteğiyle örtüşen 4 yöntemi uygular: doPost(), doGet(), doPut() ve doDelete(). Kullanıcı oluşturmamıza, okumamıza, güncellememize ve silmemize izin veriyorlar. Yöntemler, javax.servlet.http.HttpServletRequest ve javax.servlet.http.HttpServletResponse sınıflarının örneklerini, yani sunucuya gönderilen istekler ve istemci tarafından alınan yanıtlar gibi girdi olarak kabul eder. Dahili olarak, yöntemler UserService sınıfının ilgili yöntemlerini çağırır ve istemci için bir yanıt oluşturulur ve /users URL'sine yönlendirilir. Örneğin, doGet() yönteminde tüm kullanıcıların bir listesini alırız. Ardından, nesneleri bir HTTP isteğine dahil etmemize ve onu belirli bir kaynağa (örneğin, bir istemci JSP sayfasına) yönlendirmemize izin veren bir RequestDispatcher nesnesi oluşturuyoruz. doPut() yönteminde (kullanıcı verilerini günceller), bir HTTP isteğini işleriz, kimliği, adı ve yaş parametrelerini çıkarırız, belirtilen kimliğe sahip kullanıcıyı buluruz, ona istekte belirtilen adı ve yaşı atarız ve döndürürüz /kullanıcılar sayfasına. Ancak tüm bu yöntemlerin doğru çalışması için servlet'i yapılandırmamız gerekiyor. Bunun için WEB-INF klasörü içerisinde yer alan web.xml dosyasını kullanıyoruz.

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app version="3.1"
          xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
 
     <welcome-file-list>
         <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>
 
     <servlet>
         <servlet-name>UserSimpleServlet</servlet-name>
         <servlet-class>servlets.UserSimpleServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
         <servlet-name>UserSimpleServlet</servlet-name>
         <url-pattern>/</url-pattern>
     </servlet-mapping>
 
     <filter>
         <filter-name>hiddenHttpMethodFilter</filter-name>
         <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
     </filter>
 
     <filter-mapping>
         <filter-name>hiddenHttpMethodFilter</filter-name>
         <servlet-name>UserSimpleServlet</servlet-name>
     </filter-mapping>
 
 </web-app>
 
Bu dosyadaki tüm etiketler oldukça sezgiseldir, ancak sırayla inceleyelim. <welcome-file-list> - Uygulama başladığında ilk olarak açılacak olan JSP başlangıç ​​sayfası belirtilir. Bizim durumumuzda bu index.jsp'dir. <servlet> - UserSimpleServlet sınıfımızın bir servlet olarak kaydı. <servlet-mapping> - çok önemli bir etiket. Sunucu uygulaması tarafından işlenecek URL'leri tanımlar. Bizim durumumuzda, hepsi URL'lerdir, bu nedenle basitçe "/" belirtiyoruz. Ancak, kullanıcıları ve arabalarını (otomobiller) içeren bir uygulamamız olsaydı, o zaman ikinci bir sunucu uygulaması (SimpleAutoServlet) oluşturabilirdik. O zaman kullanıcı sunucu uygulamasının eşlemesi "/users" (yani, kullanıcılarla ilgili istekler) olur ve otomatik sunucu uygulamasının eşlemesi "/autos" olur. Ve son olarak, <filtre>. Dahili olarak, kuruluşun bir örneğini tanımlar. springframework.web.filter.HiddenHttpMethodFilter sınıfı. Bu makale Bahar ile ilgili değil, bu yüzden onu ayrıntılı olarak açıklamayacağım. Sadece ek bir özellik olarak uygulamamıza cıvatalı olduğunu söyleyeceğim. Mesele şu ki, müşteri tarafını oluşturmak için JSP sayfalarını kullanacağız. Verilerimiz sayfada kullanıcı listesini içeren bir tablo olarak gösterilecektir. JSP sayfalarında <form/> HTML etiketleri kullanılacaktır. Ancak bir <form/>'dan veri göndermek için yalnızca HTTP GET ve POST istekleri kullanılabilir. Başka bir deyişle, üç işlemin tümü için - güncelleme, silme ve kullanıcı oluşturma - yalnızca POST isteklerini kullanmamız gerekir. PUT ve DELETE isteklerini kullanmak bizim için bir seçenek olmayacaktır. Prensip olarak, bu oldukça normal ve uygulanması kolaydır, ancak HiddenHttpMethodFilter sınıfı bunları kullanmamıza izin verir. Böylece, okuyucu, uygulamadaki işlemler arasındaki farkı daha net görecektir. Son olarak client tarafına geçelim. Beş JSP sayfası ile temsil edilir. index.jsp.

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Hello!</title>
 </head>
 <body>
 If you want to start working with the user database,<br>
 click the button below:
 
 <form action = "users" method="get">
     <input type="submit" value="Start working with database">
 </form>
 </body>
 </html>
 
addUser.jsp

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Add new user</title>
 </head>
 <body>
 <form action = "/users" method="post">
     <input required type="text" name="name" placeholder="Name">
     <input required type="text" name="age" placeholder="Age">
     <input type="submit" value="Save">
 </form>
 </body>
 </html>
 
 
silUser.jsp

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Delete user</title>
 </head>
 <body>
 
 Are you sure you want to delete the user ${param.id}?
 
 &lform action="/users/${param.id}" method="post">
     <input type="hidden" name="id" value="${param.id}">
     <input type="hidden" name="_method" value="delete">
     <input type="submit" value="Delete">
 </form>
 
 </body>
 </html>
 
 
showUsers.jsp

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <html>
 <head>
     <title>User list</title>
 </head>
 <body>
 <table border="2">
     <tr>
         <td>ID</td>
         <td>Name</td>
         <td>Age</td>
         <td>Actions</td>
     </tr>
     <c:forEach items="${users}" var = "user">
         <tr>
             <td>${user.getId()}</td>
             <td>${user.getName()}</td>
             <td>${user.getAge()}</td>
             <td>
                 <form action = "updateUser.jsp" method="post">
                     <input type="hidden" name="id" value="${user.getId()}">
                     <input type="hidden" name="name" value="${user.getName()}">
                     <input type="hidden" name="age" value="${user.getAge()}">
                     <input type="submit" value="Modify" style="float:left">
                 </form>
                 <form action="deleteUser.jsp" method="post">
                     <input type="hidden" name="id" value="${user.getId()}">
                     <input type="submit" value="Delete" style="float:left">
                 </form></td>
         </tr>
     </c:forEach>
 </table>
 
 <form action = "addUser.jsp">
     <input type="submit" value="Add new user">
 </form>
 </body>
 </html>
updateUser.jsp

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Modify user data</title>
 </head>
 <body>
 
 Edit user
 
 <form action="/users/${param.id}" method="post">
     <input type="hidden" name = "id" value="${param.id}">
     <input type="text" name="name" value="${param.name}" placeholder=${param.name}>
     <input type="text" name="age" value="${param.age}" placeholder=${param.age}>
     <input type="hidden" name="_method" value="put">
     <input type="submit" value="Update">
 </form>
 
 </body>
 </html>
 
Bir JSP (JavaServer Sayfası) sayfası iki tür metin içerir: metin (HTML, SVG, WML veya XML) olarak biçimlendirilebilen statik kaynak verileri ve dinamik içerik oluşturmak için kullanılan JSP öğeleri. JSP sayfasının ne olduğunu anlamanıza yardımcı olmak için çok iyi bir makaleden bir pasaj kopyaladım. "Temel olarak, bir JSP ilk kez istendiğinde, bir sunucu uygulamasına dönüşür ve bir sunucu uygulaması olarak çalışır. Bunu anlamak çok önemlidir. Bir JSP sayfası bir HTML sayfası gibi DEĞİLDİR — yeni başlayan bir programcı bunun başka bir sunucu uygulaması olduğunu açıkça anlamalıdır. — sadece nasıl görüntüleneceğini programlamak zorunda değilsiniz. Basitçe çizilebilir. Ve gerektiğinde veri ekleyebilirsiniz. Ancak bir JSP sayfası HTML'yi andırdığı için, bir tasarımcı bunu kesinlikle daha kolay bulacaktır. Ve bir kez daha Yeni başlayanlara ŞİDDETLE VURGULANIN,bir JSP sayfası bir SERVLET'tir. Sunucudaki tüm verilerin eklenmesi dahil olmak üzere oluşturulur. Tüm verilerin girildiği yer burasıdır. Ve tarayıcıda, kullanıcı, Java işaretleri içermeyen tamamlanmış HTML sayfasını alır." Bir JSP sayfasının gerçekten bir sunucu uygulaması olduğundan emin olabilirsiniz, çünkü her sayfanın yürütülmesi gereken bir yöntemi vardır. Örneğin, dizin .jsp, "Veritabanı ile çalışmaya başla" butonuna tıkladığınızda get yönteminin çalıştırılacağını belirtir (method = "get").Yeni kullanıcı oluşturmaktan sorumlu olan addUser.jsp sayfası, post yöntemini yürütür. (method = "post") kaydet düğmesine tıkladığınızda. JSP sayfasının geri kalanı normal statik HTML işaretlemesinden oluşur, bu yüzden üzerinde durmayacağız. Bu başka bir makalenin konusu ve bu konuda çok şey var. İnternetteki konu. Yani, biz' uygulamamızı oluşturduk! Şimdi onu çalışırken test etmemiz gerekiyor! Bunu yapmak için yukarıda belirtilen Apache Tomcat servlet konteynerine ihtiyacımız var. Konteyneri indirebilirsinizresmi web sitesinden (sürüm 8 kullanıyorum). Ardından, uygulamamızı Tomcat aracılığıyla çalıştırmak için IDEA'da bir yapılandırma oluşturmamız gerekiyor. Bunu yapmak için "Konfigürasyonları Düzenle" sekmesini açın, Java servlet kullanan ilk uygulamanız - 3yeni bir konfigürasyon oluşturun Java servlet kullanan ilk uygulamanız - 4ve "Tomcat Sunucu Yerel" seçeneğini seçin. "Uygulama Sunucusu" sekmesinde, Tomcat klasörünün yolunu belirtin Java servlet kullanan ilk uygulamanız - 5Ardından, "Dağıtım" sekmesine gidin. Java servlet kullanan ilk uygulamanız - 6Burada, uygulamamızın yerel sunucudaki dağıtımını yapılandırıyoruz. "+" tuşuna basın, "Artifact" -> YourProjectName:war'ı seçin (uygulamayı bir savaş dosyasına oluşturacağız). Java servlet kullanan ilk uygulamanız - 7Ve bu, her şeyi özetliyor! "Sunucu" sayfasında uygulamamızın http://localhost:8080/ adresinde çalışacağını görebilirsiniz. Yapılandırmayı kaydedin ve ona bir ad verin (yapılandırmama "Tommy" diyorum). Ardından, IDEA'daki Maven sekmesinde (sağ tarafta), projemizi bir savaş dosyasına (Eklentiler -> savaş -> savaş: savaş) oluşturmak için savaş eklentisini kullanacağız. Java servlet kullanan ilk uygulamanız - 8Derleme tamamlandıktan sonra uygulamayı çalıştırın ve bekleyin. Başarı! Başlangıç ​​sayfası açıldı. Şimdi "Veritabanı ile çalışmaya başla" butonuna tıklıyoruz. index.jsp dosyamız, sunucu tarafından işlenecek bir GET isteği oluşturacaktır. Sunucu bir yanıt oluşturacak ve bunu mevcut tüm kullanıcıların bir listesi şeklinde bize geri gönderecektir (tabii ki veritabanında kullanıcılar olduğunu varsayarak). Ve işte oradalar! İşte sende var! İlk uygulamanızı Java sunucu uygulamalarını kullanarak yazdınız. Java servlet kullanan ilk uygulamanız - 9O kadar da kötü değildi, değil mi? :) Ödev için, arabanın işlevselliğini önceki makaleden geri yükleyebilirsiniz.. Başka bir deyişle, arabalar için ayrı bir servlet ve JSP sayfaları oluşturun ve uygulamaya bir kullanıcının arabalarını nasıl listeleyeceğini, bir kullanıcıya yeni arabaları nasıl ekleyeceğini ve bunları nasıl düzenleyeceğini ve sileceğini öğretin. PS Servlet'ler ve JavaServer Sayfaları oldukça eski teknolojilerdir. İnternette sık sık "Bu eski hurdaya kimin ihtiyacı var?" Gibi yorumlar bulabilirsiniz. Cevap oldukça basit: esas olarak, bu teknolojileri kullanan birçok kodla karşılaşabilecekleri gerçek projelerde çalışacak insanlar. Ve nasıl çalıştığını anlamadan bile, "eski ıvır zıvırı" yeni bir şeye bölmek yine de eğlencelidir :) JSP ve servlet'ler hakkında daha kapsamlı bir çalışma için "Head First Servlets and JSP" kitabına bakabilirsiniz.. Birçok kişinin kalite garantisi olarak kabul edeceği ünlü süper kitap "Head First Java" ile aynı yazarlar tarafından yazılmıştır :) Umarım bu makale yardımcı olmuştur! İlginiz için teşekkürler ve öğrenmede iyi şanslar!
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION