JavaRush /จาวาบล็อก /Random-TH /ส่วนที่ 5 Servlets, Java servlet API การเขียนเว็บแอปพลิเค...
Professor Hans Noodles
ระดับ

ส่วนที่ 5 Servlets, Java servlet API การเขียนเว็บแอปพลิเคชันอย่างง่าย

เผยแพร่ในกลุ่ม
เนื้อหานี้เป็นส่วนหนึ่งของชุด "ข้อมูลเบื้องต้นเกี่ยวกับการพัฒนาองค์กร" บทความก่อนหน้านี้: ส่วนที่ 5 Servlets, Java servlet API  การเขียนเว็บแอปพลิเคชั่นอย่างง่าย - 1คุณรู้วิธีเขียนแอปพลิเคชัน Java ที่ส่งข้อความไปยังคอนโซลแล้ว แต่คุณยังไม่ทราบวิธีสร้างแอปพลิเคชันเว็บแรกของคุณจริงๆ เยี่ยมเลย ทำใจให้สบายนะ ในบทความนี้ เราจะทำความคุ้นเคยกับเซิร์ฟเล็ตและเขียนแอปพลิเคชันที่คุณสามารถแสดงให้เพื่อนของคุณเห็นได้โดยไม่ต้องส่ง jarnik หรือบังคับให้พวกเขาดาวน์โหลด Java มาเขียนเว็บแอปพลิเคชันกัน หากคุณยังไม่คุ้นเคยกับแนวทางที่ใช้ในการเขียนโปรแกรมเว็บ ฉันแนะนำให้คุณเริ่มอ่านจากบทความแรกในซีรีส์ “ Introduction to Enterprise Development

เซิร์ฟเล็ตคืออะไร

ก่อนอื่น เรามาดูกันว่าเซิร์ฟเล็ตคืออะไร และเหตุใดคุณจึงได้ยินเกี่ยวกับมันบ่อยครั้ง Java Servlet APIเป็น API มาตรฐานที่ออกแบบมาเพื่อการใช้งานบนเซิร์ฟเวอร์และการทำงานกับไคลเอนต์โดยใช้รูปแบบการตอบกลับคำขอ เซิร์ฟเล็ตเป็นคลาสที่สามารถรับคำขอจากไคลเอนต์และส่งคืนการตอบกลับได้ ใช่ เซิร์ฟเล็ตใน Java เป็นองค์ประกอบที่ใช้สร้างสถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์ หากคุณจำได้เราได้พูดถึงเรื่องนี้ไปแล้วในบทความหนึ่งในซีรีส์ อย่าไปยุ่งวุ่นวาย: มาเขียนโค้ดกันทันที

สิ่งที่คุณต้องการในการสร้างเว็บแอปพลิเคชัน

หากต้องการทำงานอย่างสะดวกสบายกับเซิร์ฟเล็ตใน Java คุณจะต้องมี Intellij IDEA Ultimate Edition ชำระเงินแล้ว แต่คุณสามารถเปิดใช้งานช่วงทดลองใช้งาน 30 วันหรือใช้เวอร์ชันทดลองใช้ก่อนเปิดตัวได้ ซึ่งฟรีเสมอ ติดตั้งเซิร์ฟเวอร์แอปพลิเคชันของเรา - 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 Servlets, Java servlet API  การเขียนเว็บแอปพลิเคชั่นอย่างง่าย - 2 ส่วนที่ 5 Servlets, Java servlet API  การเขียนเว็บแอปพลิเคชันอย่างง่าย - 3

  3. ต่อไป เราจะระบุเวอร์ชันของ Tomcat ที่เราจะใช้ URL ที่เราสามารถเข้าถึงเซิร์ฟเวอร์ และพอร์ต คุณควรได้รับสิ่งนี้:

    ส่วนที่ 5 Servlets, Java servlet API  การเขียนเว็บแอปพลิเคชันอย่างง่าย - 4
  4. สิ่งที่เหลืออยู่คือการระบุสิ่งประดิษฐ์ (โปรเจ็กต์ที่ประกอบไว้ในไฟล์เก็บถาวร jar) ซึ่งจะถูกปรับใช้ในคอนเทนเนอร์ คุณสามารถคลิก ปุ่ม แก้ไขและเลือกwar exploded : ซึ่งหมายความว่าหลังจากสร้างโปรเจ็กต์ใหม่แล้ว อาร์ติแฟกต์จะถูกวางในคอนเทนเนอร์เซิร์ฟเล็ตโดยอัตโนมัติ ส่วนที่ 5 Servlets, Java servlet API  การเขียนเว็บแอปพลิเคชั่นอย่างง่าย - 5

  5. บริบทของแอปพลิเคชัน ถูกตั้งค่าเป็น servlets_war_explodedโดยดีฟอลต์ซึ่งหมายความว่าต้องเข้าถึงแอปพลิเคชันที่: http: // localhost:8080/servlets_war_exploded

    ทำไมเราจึงต้องมีข้อความเพิ่มเติม? มากำจัดสิ่งที่ไม่จำเป็นออกไป ตอนนี้ที่อยู่แอปพลิเคชันของเราคือ: http://localhost: 8080

    ส่วนที่ 5 Servlets, Java servlet API  การเขียนเว็บแอปพลิเคชันอย่างง่าย - 6

  6. คลิกตกลง เราเห็นว่าตอนนี้เรามีโอกาสที่จะเปิดตัวแอปพลิเคชันแล้ว:

    ส่วนที่ 5 Servlets, Java servlet API  การเขียนเว็บแอปพลิเคชันอย่างง่าย - 7

    ตอนนี้ เมื่อคุณเปิดแอปพลิเคชัน เบราว์เซอร์ควรเปิดขึ้นและแสดงข้อผิดพลาด 404 นี่เป็นตรรกะ เนื่องจากที่อยู่http://localhost:8080/ควรมีเซิร์ฟเล็ตที่มีการแมป “/” และเซิร์ฟเล็ตเดียวของเรามีการ แมป “/hello”

  7. เราติดต่อได้ที่http://localhost:8080/helloและรับการตอบกลับที่คาดหวัง - สตริง “Hello”!

หากทุกอย่างได้ผล ลองดูโค้ดกัน หากต้องการสร้างเซิร์ฟเล็ต http จากคลาสปกติคุณต้องสืบทอดมาจากคลาส HttpServlet เหนือคลาสเราระบุคำอธิบายประกอบ @WebServlet() ซึ่งเราผูก (แมป) เซิร์ฟเล็ตกับพาธเฉพาะ (“/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 ทุกครั้งที่มีการเยี่ยมชมเพจ หากยังไม่ได้สร้างแอตทริบิวต์ visitCounter (ครั้งแรกที่คุณเยี่ยมชมเพจ) เมธอด getAttribute() จะส่งคืนค่าว่าง ดังนั้นคุณต้องตรวจสอบค่าว่าง เช่นเดียวกับพารามิเตอร์คำขอ หากผู้ใช้ไม่ผ่านพารามิเตอร์ชื่อผู้ใช้ ค่าจะเป็นโมฆะ ในกรณีนี้ เราจะทักทายผู้ใช้โดยไม่เปิดเผยตัวตน หากต้องการส่งพารามิเตอร์ในคำขอ GET จะใช้ตัวแปรพา ธ นั่นคือคุณต้องเข้าถึงลิงก์http://localhost:8080/hello?username= Pavel คุณสามารถอ่านเพิ่มเติมเกี่ยวกับคำขอ http ได้ในบทความก่อนหน้าในชุดนี้ ขณะนี้แอปพลิเคชันของเรามีตรรกะเพียงเล็กน้อย แต่ข้อผิดพลาด 404 ในเส้นทางรากนั้นน่ารำคาญเล็กน้อย เพื่อแก้ไข เรามาสร้างเซิร์ฟเล็ตอื่นและแมปมันกับหน้าเริ่มต้น @WebServlet("/") งานของเซิร์ฟเล็ตนี้คือการเปลี่ยนเส้นทางคำขอไปยังเส้นทาง “/hello” มีสองวิธีในการทำเช่นนี้: ใช้การส่งต่อหรือการเปลี่ยนเส้นทาง บางทีมันก็คุ้มค่าที่จะเข้าใจว่าความแตกต่างระหว่างพวกเขาคืออะไร ส่งต่อ - มอบหมายคำขอการประมวลผลไปยังเซิร์ฟเล็ตอื่นบนเซิร์ฟเวอร์ ไคลเอ็นต์ไม่เกี่ยวข้อง เมื่อต้องการทำเช่นนี้ คุณต้องเพิ่มโค้ดต่อไปนี้ลงในเมธอด doGet() ของเซิร์ฟเล็ตใหม่:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
ในโค้ดนี้ เราเข้าถึงบริบทเซิร์ฟเล็ต รับตัวจัดการคำขอของเซิร์ฟเล็ตที่ต้องการ จากนั้นขอให้ประมวลผลคำขอเฉพาะด้วยพารามิเตอร์ที่ระบุ (req, resp) เปลี่ยนเส้นทาง - ส่งคืนที่อยู่ให้กับลูกค้าที่เขาต้องการติดต่อเพื่อดำเนินการตามคำขอของเขา เบราว์เซอร์ส่วนใหญ่จะไปที่ลิงก์ที่ส่งโดยอัตโนมัติ หากต้องการใช้การเปลี่ยนเส้นทาง คุณต้องเพิ่มโค้ดนี้:
resp.sendRedirect(req.getContextPath() + "/hello");
ใน HttpServletResponse เราเรียกเมธอดการเปลี่ยนเส้นทาง () และส่งผ่านไปยังที่อยู่ที่ลูกค้าต้องการติดต่อ รายละเอียดที่สำคัญ: ต้องเพิ่มพารามิเตอร์ http ที่ส่วนท้ายของเส้นทางการเปลี่ยนเส้นทางแบบเต็มซึ่งไม่สะดวกมาก ในสถานการณ์ของเราควรใช้การส่งต่อ แต่เกิดขึ้นว่าควรใช้การเปลี่ยนเส้นทางดีกว่า หากคุณเข้าใจถึงความแตกต่างในงานของพวกเขา คุณจะไม่ผิดพลาดกับการเลือกของคุณ รหัสสำหรับเซิร์ฟเล็ตใหม่มีลักษณะดังนี้:
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 จะทำให้ทำได้ง่ายกว่ามาก แต่หากคุณต้องการเจาะลึกความสามารถทั้งหมดของเซิร์ฟเล็ตอย่างละเอียดมากขึ้น คุณสามารถอ่านข้อกำหนดอย่างเป็นทางการได้ ส่วนที่ 6 คอนเทนเนอร์ Servlet ส่วนที่ 7 ความรู้เบื้องต้นเกี่ยวกับรูปแบบ MVC (Model-View-Controller) ส่วนที่ 8 การเขียนแอปพลิเคชันขนาดเล็กใน spring-boot
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION