Chương I: Bắt đầu với Java Server Page JSP CHƯƠNG I: Bắt đầu với Java Server Page JSP Java 2 Enterprise Edition J2EE có 1 mục đích to lớn là xây dựng và mở rộng nền tảng Internet
Trang 1Mục lục
MỤC LỤC
CHƯƠNG I: Bắt đầu với Java Server Page (JSP) 5
1 Giới thiệu về Java Server Page và Servlet 5
1.1 Java Server Page là gì ? 5
1.2 Biên dịch trang JSP 6
1.3 Kịch bản (Script) 6
2 Cài đặt Apache Tomcat 7
2.1 Cài đặt Java Runtime Environment (JRE) 7
2.2 Cài đặt Apache Tomcat 7
3 Tạo project Web application với Netbeans 14
3.1 Cấu hình Tomcat vào Netbeans 14
3.2 Tạo ứng dụng Web đầu tiên với Netbeans 19
4 Giới thiệu về Twitter Bootstrap 23
4.1 Twitter Bootstrap là gì 23
4.2 Tại sao lại dùng Bootstrap 24
4.3 Tạo giao diện đơn giản với Bootstrap 24
4.4 Tạo trang chủ cho toàn bộ ví dụ trong giáo trình 26
CHƯƠNG II: Tổng quan về HTTP, Servlet và JSP 30
1 Cơ bản về HTTP Request/Response 30
1.1 HTTP Request 31
1.2 HTTP Response 32
2 Giới thiệu về Servlet/JSP 34
2.1 Servlet là gì ? 35
2.2 Vòng đời của Servlet 35
2.3 JSP và vòng đời của JSP 36
2.4 Các thành phần của JSP 37
2.5 Thiết kế ứng dụng web theo mô hình MVC 40
CHƯƠNG III: Xây dựng Web động với JSP 44
1 Quy trình xây dựng và triển khai ứng dụng Web với JSP 44
1.1 Tạo mới Web application project với Netbeans 44
Trang 2Mục lục
1.2 Tạo mới trang login.jsp 44
1.3 Tạo mới trang welcome.jsp 46
1.4 Khai báo Servlet 47
1.5 Khai báo cấu hình web.xml 50
1.6 Triển khai ứng dụng lên Tomcat 50
2 Sử dụng các thành phần JSP directive 51
3 Sử dụng Template text trong JSP 53
4 Sử dụng các thành phần JSP action (JSTL) 53
CHƯƠNG IV: JavaBeans trong JSP 58
1 JavaBeans là gì ? 58
1.1 Khái niệm 58
1.2 Các quy ước của Bean 58
2 Khai báo, khởi tạo và thao tác với các đối tượng bean trong JSP 58
2.1 Các JSP element dùng cho bean 58
2.2 Phương pháp chuyển kiểu tự động của JSP với JavaBeans 59
3 Introspector trong JSP 60
4 Phạm vi hoạt động của JavaBeans 61
4.1 Application 61
4.2 Session 62
4.3 Pages 63
4.4 Request 64
CHƯƠNG V: Xử lý nhập-xuất trong JSP 67
1 Thao tác với dữ liệu từ đối tượng Request 67
1.1 Sử dụng JSTL lấy dữ liệu từ đối tượng Request 69
1.2 Truy cập dữ liệu khác của đối tượng Request 75
1.3 Sử dụng Javabeans lưu giữ giá trị đối tượng Request 79
2 Kiểm tra xác thực dữ liệu đầu vào (Input) 81
2.1 Sử dụng JSTL 81
2.2 Sử dụng Javabeans 87
3 Định dạng dữ liệu đầu ra (Output) 91
CHƯƠNG VI: Chia sẻ dữ liệu giữa các trang JSP, Request và giữa các người dùng 94
1 Trao đổi điều khiển và dữ liệu giữa các trang 94
Trang 3Mục lục
1.1 Chuyển quyền điều khiển từ một trang JSP tới trang JSP khác 95
1.2 Trao đổi dữ liệu từ một trang JSP tới trang JSP khác 97
1.3 Kết hợp chuyển quyền điều khiển và trao đổi dữ liệu giữa các trang 98
2 Chia sẻ dữ liệu Session và Application 101
2.1 Theo vết Session 101
2.2 Đếm số lượt ghé thăm trang 104
2.3 URL Rewrite 105
CHƯƠNG VII: Làm việc với Cookies và Database 110
1 Cookies là gì? 110
1.1 Khái niệm 110
1.2 Vòng đời của cookie 110
2 Thao tác với cơ sở dữ liệu (Database) 112
2.1 Truy cập cơ sở dữ liệu từ trang JSP 112
2.2 Sử dụng Transactions 129
CHƯƠNG VIII: Khai báo và sử dụng thư viện Custom Tag 133
1 Thư viện Custom Tag là gì 133
2 Cài đặt thư viện Custom Tag 134
3 Sử dụng thư viện Custom Tag 135
4 Sử dụng Action trong thư viện Custom Tag 139
4.1 Thiết lập giá trị cho thuộc tính của Custom action 140
4.2 Lựa chọn bean hay Custom action 140
CHƯƠNG IX: Điều quản lỗi và gỡ rối 142
1 Phân biệt các loại lỗi cú pháp 142
1.1 Các lỗi cú pháp 142
1.2 Lỗi cú pháp của JSTL EL 147
2 Gỡ rối cho ứng dụng JSP 151
3 Phân biệt các loại lỗi thực thi (Runtime error) 156
3.1 Bắt ngoại lệ 160
PHỤ LỤC I: Tài nguyên và tài liệu tham khảo 164
Trang 5Chương I: Bắt đầu với Java Server Page (JSP)
CHƯƠNG I: Bắt đầu với Java Server Page (JSP)
Java 2 Enterprise Edition (J2EE) có 1 mục đích to lớn là xây dựng và mở rộng nền tảng Internet rộng lớn ; là nền tảng giúp cho những lập trình viên có thể sử dụng Java để phát triển ứng dụng Web đa tầng và ứng dụng phía máy chủ Ngày nay, Java Enterprise API được mở rộng để phù hợp với các lĩnh vực như: RMI và CORBA cho việc quản lý các đối tượng từ xa ; JDBC cho việc tương tác với Database ; Enterprise JavaBeans để tạo các thành phần business có tính tái sử dụng cao ; JAXP cho việc xử lý XML, … Thêm nữa, J2EE cũng
hỗ trợ Servlet một công nghệ phổ biến tuyệt vời thay thế cho ngôn ngữ kịch bản CGI Việc kết hợp những công nghệ này cho phép lập trình viên để tạo các giải pháp kinh doanh trên nền tảng phân tán đảm nhiệm các nghiệp vụ phức tạp khác nhau
Sau năm 1999, Sun Microsystems tăng cường thêm sức mạnh cho nền tảng Java Enterprise khi cho ra đời công nghệ Java Server Page (JSP) JSP được xây dựng trên tầng Servlet và hướng tới việc tăng hiệu quả cho lập trình viên và cả những người ít hiểu biết về lập trình có thể dễ dàng tạo ra ứng dụng Web
1 Giới thiệu về Java Server Page và Servlet
1.1 Java Server Page là gì ?
Java Server Page là công nghệ hỗ trợ và cho phép xây dựng nền tảng Web động Không như những trang HTML thuần với nội dung tĩnh luôn hiển thị giống nhau, một trang JSP có thể thay đổi nội dung tùy thuộc vào các tham số khác nhau như định danh người dùng, loại trình duyệt người dùng, các thông tin do người dùng cung cấp, …
JSP còn được gọi là kịch bản trình chủ (Server script) được chạy trên nền JDK 1.3 trở lên và ứng dụng Web Server để quản lý chúng Web Server được sử dụng phổ biến hiện nay như Apache Tomcat, Java Web Server, JRUN, Glassfish, WebLogic, …
Mục tiêu:
Sau khi kết thúc chương này, bạn có thể:
Nắm bắt được ý nghĩa của công nghệ JSP và Servlet
Tự cài đặt được trình chủ Web Tomcat
Sử dụng công cụ hỗ trợ lập trình Netbeans để tạo, triển khai dự án Web bằng
JSP
Làm quen với công nghệ Twitter Bootstrap phục vụ cho việc thiết kế giao
diện Web chuyên nghiệp, hiệu quả
Trang 6Chương I: Bắt đầu với Java Server Page (JSP)
1.2 Biên dịch trang JSP
Khi người sử dụng gọi trang JSP lần đầu tiên, Web Server sẽ triệu gọi trình biên dịch JSP (là JDK) thành tập tin *.java, sau đó tập tin Java (Servlet) sẽ được biên dịch thành tập tin *.class Sau đó tập tin *.class sẽ được Web Server thực thi và trả kết quả lại cho người dùng Sơ đồ tóm tắt như sau:
1.3 Kịch bản (Script)
Nội dung của JSP có thể khai báo cùng với với HTML, bạn có thể sử dụng cặp dấu
<%= %> để khai báo mã JSP Chẳng hạn, chúng ta khai báo:
<br>
Họ tên sinh viên: <%=strStudentName %>
Ngày sinh: <%=strBirthDate %>
Trang 7Chương I: Bắt đầu với Java Server Page (JSP)
Giới tính: <%=strGender %>
Trong trường hợp có nhiều khai báo, bạn có thể sử dụng Scriptlet <% %> với các
khai báo JSP giống hệt cú pháp Java như sau:
2 Cài đặt Apache Tomcat
Apache Tomcat (Tomcat) là một Application Server miễn phí được phát triển bởi Apache Software Foundation, Tomcat giúp thực thi các ứng dụng viết bằng Java Servlet và JSP
Trong toàn bộ giáo trình này, chúng ta sẽ sử dụng phiên bản Tomcat 7.0 cho phần cài đặt phía Server và cả môi trường phát triển ứng dụng Web trên Netbeans
2.1 Cài đặt Java Runtime Environment (JRE)
Tomcat yêu cầu trên máy bạn phải có phiên bản JRE (Java Runtime Environment) đã được cài đặt sẵn, nên trước khi bắt đầu bạn hãy kiểm tra xem máy tính của bạn đã có phiên bản JRE nào chưa Bạn vào Command Dos sau đó gõ dòng lệnh sau:
java –version
Nếu có kết quả sau hiện ra thì chứng tỏ máy tính của bạn đã có phiên bản JRE được cài đặt, như hình minh họa dưới thì phiên bản JRE đó là 1.7.0_45
Nếu không có thông báo trên bạn có thể vào link sau
http://www.oracle.com/technetwork/java/javase/downloads/index.html để download JRE, phiên bản mới nhất
2.2 Cài đặt Apache Tomcat
Trang 8Chương I: Bắt đầu với Java Server Page (JSP)
Sau khi hoàn tất bước kiểm tra JRE, bạn vào đường link sau
https://tomcat.apache.org/download-70.cgi để download Tomcat phiên bản 7.0 Bạn chọn download bộ Windows Services Installer
Sau khi download hoàn tất, mở file *.exe và nhấn Next để bắt đầu quá trình cài đặt
Bạn chọn I Agree để tiếp tục
Trang 9Chương I: Bắt đầu với Java Server Page (JSP)
Ở màn hình tiếp theo bạn chọn chế độ cài đặt mặc định (Normal) sau đó nhấn Next để tiếp tục
Trang 10Chương I: Bắt đầu với Java Server Page (JSP)
Ở bước tiếp theo bạn thiết lập cổng (port, mặc định là 8080) cho Tomcat, và password để đăng nhập vào phần quản lý Tomcat sau khi hoàn tất cài đặt Tôi chọn username / password là admin / admin
Bước tiếp theo bạn chọn đường dẫn tới thư mục cài đặt JRE, mặc định sẽ là
C:\Program Files\Java\jre7 Sau đó bạn nhấn Next để tiếp tục
Trang 11Chương I: Bắt đầu với Java Server Page (JSP)
Bạn chọn thư mục để chưa các file cài đặt Tomcat, mặc định là C:\Program Files\Apache Software Foundation\Tomcat 7.0 Sau đó nhấn Next để tiếp tục
Màn hình tiếp theo thông báo quá trình cài đặt đang diễn ra
Trang 12Chương I: Bắt đầu với Java Server Page (JSP)
Sau khi vạch chạy trên màn hình cài đặt hiển thị hết, bạn được chuyển tới màn hình cuối cùng Tại đây bạn nhấn chọn Run Apache Tomcat (để khởi động ngay Tomcat server sau khi quá trình cài đặt hoàn tất), và nhấn Finish để kết thúc
Sau khi bạn nhấn Finish, 1 màn hình hiện nên thông báo server Tomcat đang được khởi động lên
Trang 13Chương I: Bắt đầu với Java Server Page (JSP)
Sau khi server Tomcat được khởi động, bạn sẽ thấy có biểu tượng sau trên thanh hệ thống (system tray)
Biểu tượng này thông báo server Tomcat đang ở trạng thái hoạt động, để kiểm tra bạn vào trình duyệt Firefox và truy cập tới http://localhost:8080
Màn hình trên hiện ra thông báo Tomcat đã được cài đặt thành công, để xem thêm
thông tin về server Tomcat, bạn nhấn vào link Server Status ở thanh menu bên trái của màn
hình này và nhập vào username / password đã thiết lập ở bước trên (admin / admin)
Màn hình Server status hiện ra cung cấp cho bạn những thông tin tổng quan về môi trường cài đặt Tomcat, bạn có thể thấy:
Phiên bản của Tomcat server
Phiên bản của JVM \ JRE (Java Virtual Machine \ Java Runtime Environment)
Hệ điều hành của máy chủ
Trang 14Chương I: Bắt đầu với Java Server Page (JSP)
3 Tạo project Web application với Netbeans
3.1 Cấu hình Tomcat vào Netbeans
Sau khi cài đặt Tomcat thành công ở bước trước, ta sẽ cấu hình để Netbeans sẽ sử dụng Tomcat Server cho các ứng dụng Web về sau
Chọn Tools trên thanh menu, sau đó chọn mục Servers như hình dưới
Danh sách các cấu hình Server sẽ được hiển thị, để thêm cấu hình mới cho Tomcat, bạn chọn nút bấm Add Server
Trang 15Chương I: Bắt đầu với Java Server Page (JSP)
Chọn loại Server và đặt tên cho nó, ở đây bạn nhập Apache Tomcat 7
Ấn Next, để tiếp tục cấu hình
Trang 16Chương I: Bắt đầu với Java Server Page (JSP)
Cung cấp đường dẫn tới vị trí Tomcat Server được cài đặt ở bước trước, và cung cấp
thông tin tài khoản quản trị server admin/admin Và ấn Finish, cấu hình mới cho Server sẽ
xuất hiện ở phía bên trái cửa sổ hiện tại Ta có thể đặt giá trị khác 8080 cho Server Tomcat port, ví dụ hình vẽ là cổng 8085
Trang 17Chương I: Bắt đầu với Java Server Page (JSP)
Ấn Close, bây giờ Tomcat 7 có thể sử dụng (Start, Stop, Deploy, …) từ trong Netbeans Mở cửa sổ Services (Window > Services) và sử dụng
Trang 18Chương I: Bắt đầu với Java Server Page (JSP)
Cửa sổ Tomcat output xuất hiện trong Netbeans như sau
Sau vài giây, Tomcat sẽ được chạy, trang chủ sẽ hiển thị trên trình duyệt với địa chỉ
http://server:port như sau
Trang 19Chương I: Bắt đầu với Java Server Page (JSP)
3.2 Tạo ứng dụng Web đầu tiên với Netbeans
Sau khi khởi động xong Netbeans, ta tiến hành tạo Web application project lần lượt theo các bước trình tự như sau:
Mở menu File > New Project > Java Web > Web application như hình dưới
Trang 20Chương I: Bắt đầu với Java Server Page (JSP)
Ấn Next, cửa sổ mới mở ra với tên Project mặc định, ta đổi tên Project thành JspWebApplication, và ấn Next
Cửa sổ mới mở ra với các thông tin cấu hình được thiết lập, ta chọn Apache Tomcat trong mục Server và Java EE 6 Web cho mục Java EE Version Ấn Finish
Trang 21Chương I: Bắt đầu với Java Server Page (JSP)
Cửa sổ chính hiện lên và tạo sẵn đoạn code mẫu trong file index.jsp trong thư mục Web Pages dưới project JspWebApplication như hình sau
Bây giờ thay đổi một chút đoạn code mẫu ở trên: thay đổi tiêu đề thành “JSP Web Page” và thay đổi phần heading thành “Welcome To The JSP Web World!” như sau
Trang 22Chương I: Bắt đầu với Java Server Page (JSP)
Tiếp theo, ta chạy ứng dụng với Tomcat Server Mở cửa sổ Services, và chọn Apache Tomcat, chọn RUN như sau
Trang 23Chương I: Bắt đầu với Java Server Page (JSP)
Trên trình duyệt sẽ hiển thị thông tin trên trang index.jsp ở trên như sau
Vậy là hoàn tất một project mẫu xây dựng ứng dụng Web sử dụng JSP
4 Giới thiệu về Twitter Bootstrap
4.1 Twitter Bootstrap là gì
Trang 24Chương I: Bắt đầu với Java Server Page (JSP)
Twitter Bootstrap bao gồm các mã CSS và HTML cơ bản cho Grids, Layouts, Typography, Tables, Forms, Navigation, Alerts, và nhiều thành phần khác của website Đi kèm với hàng loạt plugin jquery để tạo ra các thành phần giao diện như Transitions, Modal, Dropdown, Scrollspy, Tooltip, Tab, Alert, Button, Collapse, Carousel,
Style của các phần tử HTML trong Twitter Bootstrap khá đơn giản và thanh lịch Ví
dụ như phần đổ bóng trong input, highlight của bảng biểu, các mã CSS hiển thị cảnh báo, tabs, phân trang…
4.2 Tại sao lại dùng Bootstrap
Bootstrap giúp chúng ta giảm thiểu thời gian thiết kết html và css
Bootstrap định nghĩa sẵn các class css công việc của chúng ta chỉ là sử dụng các class
đó vào mục đích của mình
Bootstrap còn hổ trợ Responsive design một cách làm giao diện đa thiết bị rất được
ưu chuộng trong thời gian gần đây
Các lý do trên khiến cho Bootstrap sẽ rất hữu dụng trong các bài học của chúng ta Thêm nữa sẽ biến các bài mẫu, ví dụ trở nên sinh động, đẹp hơn; cũng giúp các bạn có thêm công cụ hỗ trợ tuyệt vời để xây dựng các ứng dụng web
4.3 Tạo giao diện đơn giản với Bootstrap
Bootstrap tải về tại đây: http://twitter.github.io/bootstrap/
Sau khi tải về, ta sẽ có một file Zip và sau khi tiến hành giải nén ta có một thư mục có tên bootstrap, bên trong có 3 thư mục: css, img, js Nội dung các file, thư mục chứa trong đó như sau
Trang 25Chương I: Bắt đầu với Java Server Page (JSP)
Chúng ta tạo 1 file html có tên là index.html ở trong thư mục bootstrap vừa giải nén phía trên Khai báo phần Head để sử dụng Bootstrap đơn giản như sau
Ta viết tiếp phần body với 2 textbox và 2 button như sau:
Vậy là hoàn thành ví dụ đơn giản với Bootstrap, mở file index.html trên trình duyệt,
ta sẽ thấy
Trang 26Chương I: Bắt đầu với Java Server Page (JSP)
Khi thu nhỏ trình duyệt ta sẽ thấy giao diện sẽ được co giãn tự động và hiển thị như sau
Vậy ta đã có một giao diện đơn giản và rất chuyên nghiệp trong khi không cần bận tâm nhiều tới việc thiết kế HTML, cắt CSS lâu nay vẫn làm
4.4 Tạo trang chủ cho toàn bộ ví dụ trong giáo trình
Ta sẽ sử dụng kiến thức về Bootstrap để xây dựng giao diện chuyên nghiệp, nhanh chóng, hỗ trợ việc tra cứu các ví dụ được sử dụng trong toàn bộ giáo trình
Giao diện hiển thị như sau
Trang 27Chương I: Bắt đầu với Java Server Page (JSP)
Như ta đã biết khả năng responsive design của Bootstrap đáp ứng việc hiển thị trên các thiết bị có kích thước, độ phân giải khác nhau mà không cần ta phải thay đổi bất cứ dòng
mã chương trình nào Ta xem giao diện sẽ hiển thị trên màn hình với kích thước nhỏ như sau
Trang 28Chương I: Bắt đầu với Java Server Page (JSP)
Tóm tắt bài học
Như vậy, ta đã đi hết chương I để tìm hiểu về ứng dụng Web, tìm hiểu về công nghệ JSP và Servlet
Trang 29Chương I: Bắt đầu với Java Server Page (JSP)
Ta cũng đã biết cách cài đặt trình chủ Web, nơi mà các ứng dụng Web xây dựng bằng JSP sẽ được triển khai Nó thật sự không phải là khó với bạn đúng không nào
Một lời khuyên là sử dụng Netbeans để phát triển ứng dụng Web của bạn Đây là công cụ tuyệt vời để phát triển, tích hợp, gỡ rối và đã được cộng đồng rộng lớn yêu thích
Ta cũng đã được giới thiệu về công nghệ mới thiết kế Web chuyên nghiệp, hiệu quả trên nhiều nền tảng thiết bị, trình duyệt khác nhau là Twitter Bootstrap Đây chính là điều mới mẻ, tôi mang tới cho các bạn; hãy bỏ qua mối lo lắng, băn khoăn của bạn về việc xây dựng ứng dụng Web với chức năng tốt đã khó, thiết kế hoàn hảo còn khó hơn
Vậy là đủ trang bị kiến thức, ta bắt tay vào bài học về JSP và Servlet
Tạo project ứng dụng Web với JSP sử dụng công cụ Netbeans
Cài đặt Twitter Bootstrap vào project vừa tạo
Sử dụng Bootstrap để xây dựng giao diện cho trang chủ tham khảo ví dụ sau
http://getbootstrap.com/2.3.2/examples/justified-nav.html
Run project trên Netbeans để kiểm tra giao diện vừa xây dựng
Trang 30Chương II: Tổng quan về HTTP, Servlet và JSP
CHƯƠNG II: Tổng quan về HTTP, Servlet và JSP
1 Cơ bản về HTTP Request/Response
Hypertext Transfer Protocol (HTTP) là một giao thức không trạng thái (stateless) nằm
ở tầng ứng dụng, đảm nhiệm việc giao tiếp giữa các hệ thống phân tán với nhau, và là nền tảng của web
Người dùng gửi một yêu cầu tới Server thông qua việc click vào link trên trang web hoặc submit form hoặc nhập thông tin địa chỉ trang web trên thanh địa chỉ của trình duyệt,
… Để gửi được Request, trình duyệt cần biết Server cần phải nói chuyện và tài nguyên cần được yêu cầu Thông tin này chính là HTTP Uniform Resource Locator (URL)
URL là một cấu trúc đơn giản thường bao gồm:
Protocol: http hoặc https
Host: tên miền server
Port: mặc định là 80
Resource path: đường dẫn tới resource trên server
Query: tham số truy vấn
Mục tiêu:
Sau khi kết thúc chương này, bạn có thể:
Hiểu đầy đủ về cách hoạt động, thành phần cấu tạo của 2 đối tượng cơ bản trong giao thức HTTP là HTTP Request và Response
Hiểu về kiến trúc và vòng đời của JSP và Servlet
Các cách thiết kế ứng dụng Web bằng công nghệ JSP theo mô hình MVC
Trang 31Chương II: Tổng quan về HTTP, Servlet và JSP
HTTP cho phép giao tiếp giữa rất nhiều loại server/client với nhau, chủ yếu thông qua TCP/IP Cổng giao tiếp chuẩn là 80, tuy nhiên có thể dùng bất kỳ cổng khác như 8080 (mặc định của Tomcat) Giao tiếp giữa client và server dựa vào một cặp request/response Client khởi tạo HTTP request và nhận HTTP response từ server gửi về
HTTP request bao gồm hai thành phần quan trọng là URL và Verb (phương thức), được gửi từ client Ở phía ngược lại, server trả về HTTP response trong đó chứa Status code
và Message body
1.1 HTTP Request
Mỗi request bắt đầu với một Request-Line Dòng này chỉ ra phương thức mà client yêu cầu, tài nguyên, và phiên bản của HTTP mà client có thể hỗ trợ Request-Line có thể có tiếp sau một hay nhiều header và một message body
GET / HTTP/1.1
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
GET: được thiết kế để truy vấn dữ liệu, tài nguyên trên server, với các tham số và giá
trị nằm ngay trên URL
POST: được dùng trong các trường hợp tạo ra sự thay đổi về dữ liệu, tài nguyên trên
server như upload một file hoặc submit một web form
Trang 32Chương II: Tổng quan về HTTP, Servlet và JSP
PUT: được thiết kế để cập nhật dữ liệu, tài nguyên trên server
DELETE: được thiết kế để xóa dữ liệu, tài nguyên trên server
Ngoài ra còn có một số phương thức khác ít được sử dụng như HEAD, TRACE,
OPTIONS
Request-uri
Cung cấp địa chỉ định danh tài nguyên cho một tài nguyên Ví dụ, Request-uri là /, chỉ ra một request cho tài nguyên gốc Cho các request không yêu cầu một tài nguyên cụ thể (như là TRACE request hay trong một số trường hợp cả OPTIONS request), client có thể dùng một dấu * cho Request-uri
cụ thể, và entity header áp dụng cho message body trong request
Host: là hostname được sử dụng trong URL
User-Agent: chứa thông tin về loại trình duyệt, thiết bị tạo ra Request Vì server có thể sẽ trả về các Response khác nhau và phù hợp nhất dựa trên thông tin về loại trình duyệt hoặc loại thiết bị đang được sử dụng
Accept: cung cấp thông tin về ngôn ngữ, định dạng file, … chỉ định loại Response được trình duyệt mong đợi
c Message body
Một HTTP request luôn chứa một dòng trống sau Request-Line và bất kỳ header nào Nếu request bao gồm một message body, phần body đi sau một dòng trống Dòng trống rất quan trọng vì server xác định được phần kết của request, hoặc phần kết của header Không
có dòng trống, server nhận các message sẽ không biết được các header khác nữa có tiếp tục được truyền không
Message body có thể chứa các thông tin về tham số như các giá trị được client thiết lập trong form, hoặc trong chuỗi URL
1.2 HTTP Response
Một HTTP response bắt đầu với một Status-Line và có thể chứa các header và một message body Header có thể mô tả quá trình truyền dữ liệu, xác định response, hoặc phần body kèm theo Dòng bắt đầu với phiên bản cao nhất của HTTP mà server hỗ trợ
HTTP/1.1 200 OK
Date: Sun, 08 Oct 2000 18:46:12
Trang 33Chương II: Tổng quan về HTTP, Servlet và JSP
GMT Server: Apache/1.3.6 (Unix)
Keep-Alive: timeout=5, max=120
hoàn toàn mang tính chất tạm thời, client có thể bỏ qua chúng
client Đối với GET request, dữ liệu trả về nằm trong message body Phổ biến
nhất là mã 200 OK Ngoài ra còn có:
202 Accepted: request từ client đã được chấp nhận nhưng có thể server
không trả về kết quả cho client Điều này hữu dụng trong trường hợp xử lý bất đồng bộ phía server: server thông báo cho client không phải tiếp tục chờ đợi cho tới khi quá trình xử lý trên server hoàn tất
204 No content: không có phần message body trong response
205 Reset content: tương tự như 204, nhưng mã trả về này yêu cầu client
reset document view
206 Partial content: server chỉ gửi về một phần dữ liệu phụ thuộc và giá trị range header client gửi lên Giá trị này được sử dụng bởi các tool hỗ
trợ download như wget, IDM để phân mảnh dữ liệu thành nhiều phần nhằm tải về đồng thời hoặc hỗ trợ tiếp tục download khi bị ngắt giữa chừng
thành request Ngoài ra còn có:
Trang 34Chương II: Tổng quan về HTTP, Servlet và JSP
301 Moved Permanently: resource đã được chuyển hoàn toàn tới địa chỉ
trong trường Location của response
303 See Other: resource được chuyển tạm thời tới địa chỉ trong trường
Location của response
304 Not Modified: resource không thay đổi từ lần cuối cùng client gửi
request, và client nên sử dụng dữ liệu đã lưu trong bộ nhớ cache Điều này
được thực hiện bằng cách khi gửi request, client gửi đi trường ETag là
định danh của phần dữ liệu đã request lần trước, server so sánh với trường
ETag ứng với dữ liệu của nó để kiểu tra sự thay đổi
400 Bad Request: request không đúng định dạng, cú pháp
401 Unauthorized: client chưa xác thực
403 Forbidden: client không có quyền truy cập
404 Not Found: không tìm thấy resource
405 Method Not Allowed: phương thức (HTTP verb) không được server
hỗ trợ
Server Error là phổ biến nhất Ngoài ra còn có:
501 Not Implemented: server không hỗ trợ chức năng client yêu cầu
503 Service Unavailable: một thành phần xử lý trên server bị lỗi hoặc
server bị quá tải
b Last-Modified
Cung cấp thông tin về thời gian lần cuối cùng thông tin tài nguyên từ Server được thay đổi Dựa vào thông tin này, trình duyệt có thể so sánh với thời gian trong local cache của mình để yêu cầu Server gửi về các thông tin cập nhật mới nhất so với lần yêu cầu cuối
c Content-Type
Cung cấp thông tin về loại dữ liệu phản hồi chứa trong phần body
d Content-Length
Cung cấp thông tin kích thước phần header
2 Giới thiệu về Servlet/JSP
Vai trò của Servlet và JSP được thể hiện trong kiến trúc J2EE ở hình dưới
Trang 35Chương II: Tổng quan về HTTP, Servlet và JSP
2.1 Servlet là gì ?
Java servlet là những chương trình độc lập platform và nhỏ chạy ở phía server được lập trình để mở rộng chức năng của web server Nghĩa là ta có thể nhúng logic của ứng dụng riêng vào việc xử lý các HTTP request và tạo HTTP response
Một servlet được thực thi động trên máy chủ và cho phép mở rộng thêm chức năng cho máy chủ này như: xử lý/lưu dữ liệu gởi từ mẫu HTML (HTML form), cung cấp dữ liệu động qua việc lấy thông tin thông qua kết nối với cơ sở dữ liệu, thực hiện giao dịch thương mại điện tử
JSP được xây dựng hoàn toàn trên nền tảng Servlet Trong thực tế, JSP luôn được sử dụng kết hợp với Servlet để tạo ra các ứng dụng Web
Một servlet là một chương trình Java, cụ thể hơn, nó là một thể hiện của một lớp, lớp
này thực thi (implements) Interface javax.servlet.Servlet Interface Servlet thừa kế (extends)
từ 2 Interface javax.servlet.GenericServlet, javax.servlet.http.HttpServlet
2.2 Vòng đời của Servlet
Servlet được quản lý bởi Servlet Container Container sẽ đón nhận các Request từ trình duyệt khách, sau đó sẽ phân phối tới ứng dụng Web phù hợp Dựa vào tham số trong Request, Container sẽ biết để kích hoạt các Servlet tương ứng dựa vào các thông tin cấu hình của ứng dụng đã được đăng ký Container sẽ khởi tạo Servlet và quản lý vòng đời hoạt động của Servlet Vòng đời của Servlet gồm 6 trạng thái như sau
Trang 36Chương II: Tổng quan về HTTP, Servlet và JSP
Tạo ra: web container tạo một thực thể servlet
Sẵn sàng phục vụ: gọi method init() của servlet
Phục vụ: nếu có một request thì container sẽ gọi method service() của servlet
Huỷ: container gọi method destroy() của servlet
Không sẵn sàng: thực thể được đánh dấu cho garbage collection
Khi servlet ở trạng thái Phục vụ, hàm service() của servlet sẽ nhận 2 đối tượng Request, Reponse truyền tới Dựa vào đối tượng Request được gửi đến phương thức HTTP
phù hợp và phân bổ (dispatch) truy vấn này đến phương thức xử lý tương ứng của servlet,
thông qua các khai báo phương thức doXXX của các servlet
Các phương thức Servlet doPost(), doGet(), doHead(), doDelete(), doHead(), doOptions(), doPut(), doTrace() lần lượt tương ứng với các phương thức HTTP POST,
GET, HEAD, DELETE, HEAD, OPTIONS, PUT, TRACE
protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
protected void doHead(HttpServletRequest req, HttpServletResponse resp)
protected void doOptions(HttpServletRequest req, HttpServletResponse resp)
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
protected void doPut(HttpServletRequest req, HttpServletResponse resp)
2.3 JSP và vòng đời của JSP
Trang 37Chương II: Tổng quan về HTTP, Servlet và JSP
Như ta đã biết, việc tạo nội dung html trả lời trong servlet bằng cách dùng các lệnh
out.println() là một việc tốn nhiều công sức, đặc biệt khi nội dung html trả lời càng phức tạp
Việc này còn tệ hơn khi ta muốn bảo trì hay thay đổi nội dung trả lời JSP đem lại một giải pháp tiện lợi hơn khi cho phép chèn nội dung động vào trang web, nó còn cho phép việc tách bạch phần trình bày và logic xử lý nội dung Với servlet thì ta chèn mã html để phát sinh trong lớp java còn JSP thì ngược lại, ta chèn mã java trong trang html
Sau khi trang jsp được dịch (translate) và được biên dịch (compile) thành các servlet,
thì vòng đời của jsp này có vòng đời như của servlet
Nếu trong bộ chứa chưa có một hiện thể (instance) nào của servlet của trang jsp thì bộ chứa sẽ:
Tải lớp servlet của trang jsp
Tạo một hiện thể của lớp servlet này
Khởi tạo hiện thể của lớp này bằng cách gọi hàm jspInit
Bộ chứa gọi hàm _jspService, và truyền vào tham số là hai đối tượng Request và
Response Nếu bộ chứa muốn loại bỏ servlet của trang jsp này, nó sẽ gọi hàm
Trang 38Chương II: Tổng quan về HTTP, Servlet và JSP
<%@ taglib uri=" http://java.sun.com/jsp/jstl/core " prefix="c" %>
<c:import url=" /includes/header.jspf" />
Hai cách này tuy đưa lại kết quả như nhau nhưng chúng có sự khác biệt cơ bản sau:
Chỉ thị include <%@ include .%> sẽ gộp tập tin khi trang jsp được chuyển thành
servlet Nếu tập tin được include ít thay đổi thì ta nên dùng phương pháp này vì nó sẽ
nhanh hơn về mặt hiệu năng vì chỉ thực hiện 1 lần đầu tiên
Hành động include <jsp:include /> sẽ thêm tập tin phát sinh vào trang jsp sau khi
trang được thực thi Ta nên dùng chọn lựa này nếu nội dung tập tin được include hay thay đổi
b Sử dụng thẻ đặc biệt để chèn các khai báo Java vào trong trang JSP
Thẻ khai báo (declaration): cho phép thêm trực tiếp mã vào lớp servlet, định nghĩa
các biến toàn cục hay khai báo các phương thức Trong ví dụ sau, ta ghi đè hai hàm
jspInit và jspDestroy trong thẻ khai báo này
Thẻ scriptlet: được dùng để chèn mã vào phương thức _jspService() của servlet Nói
chung là thành phần được sử dụng để chèn mã Java ngoại trừ các biến toàn cục và phương thức
Trang 39Chương II: Tổng quan về HTTP, Servlet và JSP
session.setAttribute("user", null);
String sucessPath = rb.getString("process.logoff");
</jsp:scriptlet>
Thẻ biểu thức (expression): dùng để hiển thị kết quả của một biểu thức Biểu thức
này sẽ được chuyển làm tham số của một gọi hàm out.print() bên trong phương thức _jspService()
<title><%=rb.getString("logoff.title")%></title>
Hoặc có thể thay thế bằng đoạn mã sau
<title><jsp:expression>rb.getString("logoff.title")</jsp:expression></title>
c Các biến ngầm định
Trong một trang jsp ta có thể sử dụng các biến khai báo sẵn sau:
request: đối tượng javax.servlet.http.HttpServletRequest
response: đối tượng javax.servlet.http.HttpServletResponse
out: đối tượng javax.servlet.jsp.JspWriter
session: đối tượng javax.servlet.http.HttpSession
application: đối tượng javax.servlet.ServletContext
config: đối tượng avax.servlet.ServletConfig
pageContext: đối tượng javax.servlet.jsp.PageContext
<jsp:fallback>: nội dung hiển thị nếu phía khách không hỗ trợ applet, dùng kèm với
<jsp:plugin>
<jsp:getProperty>: lấy giá trị một thuộc tính của một JavaBean
<jsp:getProperty property="username" name="userBean" />
Trang 40Chương II: Tổng quan về HTTP, Servlet và JSP
<jsp:setProperty>: gán giá trị cho một thuộc tính của một JavaBean
<jsp:setProperty property="*" name="userBean" />
<jsp:useBean>: khởi tạo hay tái sử dụng một JavaBean đã tồn tại để dùng trong
trang
<jsp:useBean id="userBean" class="com.openspace.UserService" scope="session" />
2.5 Thiết kế ứng dụng web theo mô hình MVC
Kể từ khi ra đời công nghệ JSP và Servlet, có hai mô hình chính của Phương pháp thiết kế MVC trong Java là MVC model 1 và MVC model 2
a Sơ đồ của MVC model 1
Trong MVC model 1, các trang JSP đóng vai trò hiển thị (View) và điều khiển (Controller) Có thể có nhiều trang JSP khác nhau đóng các vai trò khác nhau
Khi người sử dụng dùng các nút bấm, menu hoặc link … trên trình duyệt Web (Web browser) để thực hiện một thao tác, một lệnh (có thể kèm theo các tham số) được gửi tới một trang JSP tương ứng
Trang JSP này sẽ khởi tạo một hoặc nhiều JavaBeans (nếu cần thiết), truyền các lệnh cần thi hành tới JavaBeans
Sau khi JavaBeans thực hiện xong việc truy xuất hoặc cập nhật dữ liệu, trang JSP ban đầu có thể hiển thị dữ liệu lấy từ Beans (JSP ban đầu đóng luôn vai trò View), hoặc chọn một trang JSP khác để hiện dữ liệu từ Beans (JSP ban đầu đóng luôn vai trò Controller) Trong một thiết kế tốt, để bảo đảm việc tách rời phần trình bày và logic của chương trình, trang JSP nhận request chỉ đóng vai trò Điều khiển (Controller) MVC model 1 có một nhược điểm là phần logic điều khiển được viết trong trang JSP, như vậy phần chương trình Java phức tạp dùng để điều khiển sẽ bị lẫn vào trong mã HTML dùng để trình bày Độ phức tạp của chương trình càng cao, thì trang JSP càng khó bảo trì Hơn nữa trong các dự án phần mềm phức tạp, thì phẩn hiển thị của trang JSP thường