1. ภาพรวม
ในบทความสั้น ๆ นี้เราจะสร้างเว็บแอปพลิเคชันขนาดเล็กที่ใช้รูปแบบการออกแบบ Model View Controller (MVC) โดยใช้ Servlets และ JSP พื้นฐาน
เราจะสำรวจเล็กน้อยเกี่ยวกับวิธีการทำงานของ MVC และคุณสมบัติที่สำคัญก่อนที่เราจะดำเนินการต่อไป
2. ข้อมูลเบื้องต้นเกี่ยวกับ MVC
Model-View-Controller (MVC) เป็นรูปแบบที่ใช้ในวิศวกรรมซอฟต์แวร์เพื่อแยกตรรกะของแอปพลิเคชันออกจากส่วนติดต่อผู้ใช้ ตามชื่อโดยนัยรูปแบบ MVC มีสามชั้น
Model กำหนดชั้นธุรกิจของแอปพลิเคชันคอนโทรลเลอร์จะจัดการขั้นตอนของแอปพลิเคชันและ View จะกำหนดเลเยอร์การนำเสนอของแอปพลิเคชัน
แม้ว่ารูปแบบ MVC จะไม่เฉพาะเจาะจงสำหรับเว็บแอปพลิเคชัน แต่ก็เข้ากันได้ดีกับแอปพลิเคชันประเภทนี้ ในบริบท Java โมเดลประกอบด้วยคลาส Java แบบง่ายคอนโทรลเลอร์ประกอบด้วย servlets และ View ประกอบด้วยเพจ JSP
นี่คือคุณสมบัติหลักบางประการของรูปแบบ:
- แยกชั้นการนำเสนอออกจากชั้นธุรกิจ
- ตัวควบคุมดำเนินการเรียกใช้ Model และส่งข้อมูลไปยัง View
- โมเดลไม่ทราบด้วยซ้ำว่ามีการใช้งานโดยเว็บแอปพลิเคชันหรือแอปพลิเคชันบนเดสก์ท็อป
มาดูแต่ละชั้นกัน
2.1. เลเยอร์โมเดล
นี่คือชั้นข้อมูลที่มีตรรกะทางธุรกิจของระบบและยังแสดงสถานะของแอปพลิเคชัน
ไม่ขึ้นกับเลเยอร์การนำเสนอคอนโทรลเลอร์จะดึงข้อมูลจากเลเยอร์โมเดลและส่งไปยังเลเยอร์ดู
2.2. เลเยอร์คอนโทรลเลอร์
เลเยอร์คอนโทรลเลอร์ทำหน้าที่เป็นส่วนต่อประสานระหว่าง View และ Model ได้รับคำขอจากเลเยอร์ View และประมวลผลรวมถึงการตรวจสอบความถูกต้องที่จำเป็น
คำขอจะถูกส่งต่อไปยังเลเยอร์โมเดลสำหรับการประมวลผลข้อมูลและเมื่อได้รับการประมวลผลข้อมูลจะถูกส่งกลับไปยังคอนโทรลเลอร์จากนั้นแสดงบน View
2.3. เลเยอร์มุมมอง
เลเยอร์นี้แสดงผลลัพธ์ของแอปพลิเคชันโดยปกติจะเป็น UI บางรูปแบบ เลเยอร์การนำเสนอใช้เพื่อแสดงข้อมูลโมเดลที่เรียกโดยคอนโทรลเลอร์
3. MVC พร้อม Servlets และ JSP
ในการใช้งานเว็บแอปพลิเคชันตามรูปแบบการออกแบบ MVC เราจะสร้างชั้นเรียนStudentและStudentServiceซึ่งจะทำหน้าที่เป็นเลเยอร์โมเดลของเรา
S tudentServletชั้นจะทำหน้าที่เป็นตัวควบคุมและสำหรับชั้นนำเสนอเราจะสร้างนักเรียน record.jspหน้า
ตอนนี้เรามาเขียนเลเยอร์เหล่านี้ทีละชั้นและเริ่มต้นด้วยชั้นนักเรียน :
public class Student { private int id; private String firstName; private String lastName; // constructors, getters and setters goes here }
ตอนนี้เรามาเขียนStudentServiceของเราซึ่งจะประมวลผลตรรกะทางธุรกิจของเรา:
public class StudentService { public Optional getStudent(int id) { switch (id) { case 1: return Optional.of(new Student(1, "John", "Doe")); case 2: return Optional.of(new Student(2, "Jane", "Goodall")); case 3: return Optional.of(new Student(3, "Max", "Born")); default: return Optional.empty(); } } }
ตอนนี้มาสร้างคลาส Controller StudentServletของเรา:
@WebServlet( name = "StudentServlet", urlPatterns = "/student-record") public class StudentServlet extends HttpServlet { private StudentService studentService = new StudentService(); private void processRequest( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String studentID = request.getParameter("id"); if (studentID != null) { int id = Integer.parseInt(studentID); studentService.getStudent(id) .ifPresent(s -> request.setAttribute("studentRecord", s)); } RequestDispatcher dispatcher = request.getRequestDispatcher( "/WEB-INF/jsp/student-record.jsp"); dispatcher.forward(request, response); } @Override protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } @Override protected void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } }
servlet นี้เป็นตัวควบคุมเว็บแอปพลิเคชันของเรา
ขั้นแรกจะอ่านรหัสพารามิเตอร์จากคำขอ หากส่งรหัสแล้ววัตถุนักเรียนจะถูกดึงมาจากชั้นธุรกิจ
เมื่อดึงข้อมูลที่จำเป็นจาก Model แล้วจะใส่ข้อมูลนี้ในคำขอโดยใช้เมธอดsetAttribute ()
ในที่สุดคอนโทรลเลอร์จะส่งต่อคำร้องขอและอ็อบเจ็กต์ตอบกลับไปยัง JSP ซึ่งเป็นมุมมองของแอ็พพลิเคชัน
ต่อไปมาเขียนเลเยอร์การนำเสนอstudent-record.jsp :
Student Record ID: First Name: Last Name:
และแน่นอน JSP คือมุมมองของแอปพลิเคชัน ได้รับข้อมูลทั้งหมดที่ต้องการจาก Controller โดยไม่จำเป็นต้องโต้ตอบกับชั้นธุรกิจโดยตรง
4. สรุป
ในบทช่วยสอนนี้เราได้เรียนรู้เกี่ยวกับสถาปัตยกรรม MVC เช่น Model View Controller และเราจะเน้นไปที่วิธีการใช้งานตัวอย่างง่ายๆ
ตามปกติรหัสที่นำเสนอนี้สามารถพบได้บน GitHub