50
Tìm hiểu Java Struts Giới thiệu chung Dự án Struts Struts, một dự án mã nguồn mở của Apache Software Foundation, là một bản hiện thực Java phía server của mẫu thiết kế Model-View-Controller (MVC). Dự án Struts được khởi xướng bởi Craig McClanahan vào tháng 5/2000, thuộc dự án Apache Jakarta. Hiện tại, dự án Struts đã trở thành một dự án độc lập—dự án Apache Struts. Dự án Struts được thiết kế với mục đích cung cấp một bộ khung mã nguồn mở để tạo các ứng dụng Web, tách tầng trình bày (presentation layer) ra khỏi tầng giao tác (transaction layer) và tầng dữ liệu (data layer). Từ khi ra đời, dự án Struts nhận được nhiều ủng hộ của các nhà phát triển và nhanh chóng chiếm ưu thế trong cộng đồng mã nguồn mở. Quyển sách này đề cập phiên bản 1.1 của Struts. Một cuộc tranh luận nhỏ đã diễn ra trong cộng đồng những nhà phát triển về mẫu thiết kế mà dự án Struts giống nhất. Theo tài liệu được cung cấp từ chính những nhà phát triển dự án Struts, nó được thiết kế theo mẫu MVC; nhưng một số khác thì cho rằng nó giống mẫu thiết kế Front Controller hơn (mẫu này được mô tả bởi Sun's J2EE Blueprints Program). Sự thật thì nó rất giống mẫu Front Controller; nhưng trong quyển sách này, chúng ta thảo luận theo mẫu MVC. Nếu muốn tìm hiểu về mẫu Front Controller, bạn có thể xem tại: http://developer.java.sun.com/developer ... EE/despat/ Mẫu thiết kế MVC Để nắm vững Struts Framework, bạn phải hiểu cơ bản về mẫu thiết kế MVC. Mẫu thiết kế MVC, được bắt nguồn từ Smalltalk, bao gồm ba thành phần: Model, View, và Controller. Ba thành phần của mẫu thiết kế MVC Model Biểu diễn các đối tượng dữ liệu. Thành phần Model là những gì đang được thao tác và trình bày cho người dùng. View Đóng vai trò là phần biểu diễn trên màn hình (screen representation) của thành phần Model. Thành phần View là đối tượng trình bày trạng thái hiện tại của các đối tượng dữ liệu. Controller Định nghĩa cách thức giao diện người dùng tương tác lại dữ liệu đầu vào. Thành phần Controller là đối tượng thao tác thành phần Model (hay đối tượng dữ liệu). Dưới đây là một số lợi ích khi sử dụng mẫu thiết kế MVC: Tính tin cậy—Tầng trình bày và tầng giao tác có sự phân chia rõ ràng, cho phép bạn thay đổi

19173552 Tim Hiu Java Struts

Embed Size (px)

DESCRIPTION

19173552 Tim Hiu Java Struts

Citation preview

Page 1: 19173552 Tim Hiu Java Struts

Tìm hiểu Java Struts

Giới thiệu chung

Dự án StrutsStruts, một dự án mã nguồn mở của Apache Software Foundation, là một bản hiện thực Java phía server của mẫu thiết kế Model-View-Controller (MVC). Dự án Struts được khởi xướng bởi Craig McClanahan vào tháng 5/2000, thuộc dự án Apache Jakarta. Hiện tại, dự án Struts đã trở thành một dự án độc lập—dự án Apache Struts.

Dự án Struts được thiết kế với mục đích cung cấp một bộ khung mã nguồn mở để tạo các ứng dụng Web, tách tầng trình bày (presentation layer) ra khỏi tầng giao tác (transaction layer) và tầng dữ liệu (data layer). Từ khi ra đời, dự án Struts nhận được nhiều ủng hộ của các nhà phát triển và nhanh chóng chiếm ưu thế trong cộng đồng mã nguồn mở. Quyển sách này đề cập phiên bản 1.1 của Struts.

Một cuộc tranh luận nhỏ đã diễn ra trong cộng đồng những nhà phát triển về mẫu thiết kế mà dự án Struts giống nhất. Theo tài liệu được cung cấp từ chính những nhà phát triển dự án Struts, nó được thiết kế theo mẫu MVC; nhưng một số khác thì cho rằng nó giống mẫu thiết kế Front Controller hơn (mẫu này được mô tả bởi Sun's J2EE Blueprints Program). Sự thật thì nó rất giống mẫu Front Controller; nhưng trong quyển sách này, chúng ta thảo luận theo mẫu MVC. Nếu muốn tìm hiểu về mẫu Front Controller, bạn có thể xem tại: http://developer.java.sun.com/developer ... EE/despat/

Mẫu thiết kế MVC Để nắm vững Struts Framework, bạn phải hiểu cơ bản về mẫu thiết kế MVC. Mẫu thiết kế MVC, được bắt nguồn từ Smalltalk, bao gồm ba thành phần: Model, View, và Controller.

Ba thành phần của mẫu thiết kế MVCModel Biểu diễn các đối tượng dữ liệu. Thành phần Model là những gì đang được thao tác và trình bày cho người dùng.

View Đóng vai trò là phần biểu diễn trên màn hình (screen representation) của thành phần Model. Thành phần View là đối tượng trình bày trạng thái hiện tại của các đối tượng dữ liệu.

Controller Định nghĩa cách thức giao diện người dùng tương tác lại dữ liệu đầu vào. Thành phần Controller là đối tượng thao tác thành phần Model (hay đối tượng dữ liệu).

Dưới đây là một số lợi ích khi sử dụng mẫu thiết kế MVC:

Tính tin cậy—Tầng trình bày và tầng giao tác có sự phân chia rõ ràng, cho phép bạn thay đổi

Page 2: 19173552 Tim Hiu Java Struts

cảm quan của ứng dụng mà không cần biên dịch lại mã lệnh của Model hay Controller.

Tính thích ứng và tái sử dụng cao—Mẫu MVC cho phép bạn sử dụng nhiều loại khung nhìn, tất cả cùng truy xuất đến một mã nguồn phía server, từ trình duyệt web (HTTP) cho đến trình duyệt không dây (WAP).

Các phí tổn trong vòng đời phát triển rất thấp—Mẫu MVC chỉ cần có người lập trình cấp thấp phát triển và bảo trì các giao diện người dùng.

Triển khai nhanh chóng—Thời gian phát triển có thể được giảm đáng kể, bởi vì những người lập trình cho thành phần Controller (nhà phát triển Java) chỉ tập trung vào phần giao tác, còn những người lập trình cho thành phần View (nhà phát triển HTML và JSP) chỉ tập trung vào phần trình bày.

Tính bảo trì—Việc tách phần trình bày và logic nghiệp vụ cũng khiến việc bảo trì và sửa đổi một ứng dụng Web dựa trên Struts dễ dàng hơn.

Bản hiện thực Struts của mẫu MVC Struts Framework mô hình hóa bản hiện thực phía server của mẫu MVC bằng cách kết hợp các trang JSP, các thẻ JSP tùy biến, và một Java servlet. Trong phần này, chúng ta mô tả ngắn gọn cách Struts Framework ánh xạ đến mỗi thành phần của mẫu MVC.

Bản hiện thực Struts của mẫu MVC

Hình trên mô tả quy trình xử lý mà hầu hết các yêu cầu ứng dụng Struts cần tuân theo. Quy trình này có thể được chia thành 5 bước cơ bản:

1. Một yêu cầu xuất phát từ một View đã được hiển thị trước đó.

2. Yêu cầu này được tiếp nhận bởi ActionServlet (đóng vai trò là một Controller), ActionServlet tìm URI được yêu cầu trong một file XML (sẽ được mô tả trong chương 3, “Làm quen với Struts”) và xác định tên lớp Action sẽ thực hiện logic nghiệp vụ cần thiết.

Page 3: 19173552 Tim Hiu Java Struts

3. Lớp Action thực hiện logic của nó trên các thành phần Model của ứng dụng.

4. Khi đã hoàn tất quá trình xử lý, lớp Action trả quyền điều khiển cho ActionServlet, đồng thời cung cấp một khóa (key) biểu thị các kết quả xử lý. ActionServlet sử dụng khóa này để xác định các kết quả sẽ được chuyển đến đâu khi trình bày.

5. Yêu cầu kết thúc khi ActionServlet chuyển yêu cầu đến View được gắn với khóa trả về, và View này trình bày các kết quả của Action.

Bạn có thể nhận ra những bước trên là một dạng biểu diễn đã được đơn giản hóa của một yêu cầu Struts. Chúng ta sẽ đề cập chi tiết hơn về những bước này, bao gồm các thành phần khác, trong phần tiếp theo.

Thành phần Model

Các thành phần Model của Struts Framework, như đã được giới thiệu ở phần trước, biểu diễn các đối tượng dữ liệu của ứng dụng Struts. Chúng thường biểu diễn các đối tượng nghiệp vụ hay các hệ thống backend khác và có thể được hiện thực là những JavaBean đơn giản, những Enterprise JavaBean, những biểu diễn đối tượng của dữ liệu được lưu trữ trong một cơ sở dữ liệu quan hệ, hoặc chỉ là những gì cần được thao tác hay biểu diễn trong một ứng dụng Web. Chúng ta sẽ thảo luận chi tiết hơn về thành phần Model trong phần sau, “Tích hợp Jakarta Commons Database Connection Pool”.Thành phần View

Mỗi thành phần View trong Struts Framework được ánh xạ đến một trang JSP, trang này có thể chứa bất kỳ sự kết hợp nào của các thẻ tùy biến Struts, JSP, và HTML. Các trang JSP trong Struts Framework có hai chức năng chính. Thứ nhất, đóng vai trò là tầng trình bày của một Controller Action đã được thực thi trước đó. Điều này thường được hoàn thành bằng cách sử dụng một tập thẻ tùy biến để duyệt và thu lấy dữ liệu mà Controller Action chuyển đến JSP đích. Loại View này không thể hiện đặc trưng của Struts và không được lưu tâm.

Chức năng thứ hai, thể hiện đặc trưng của Struts, là thu thập dữ liệu cần thiết để thực hiện một Controller Action cụ thể. Điều này thường được hoàn thành bằng cách kết hợp các thư viện thẻ Struts và các đối tượng ActionForm. Loại View này chứa một số lớp và thẻ đặc-trưng-Struts. Đoạn mã sau là một ví dụ đơn giản về loại View này:Code: Chọn hết

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html">

<html:form action="loginAction.do" name="loginForm" type="com.stock.loginForm" > User Id: <html:text property="username"><br/> Password: <html:password property="password"><br/> <html:submit /></html:form>

Page 4: 19173552 Tim Hiu Java Struts

Chúng ta sẽ thảo luận chi tiết hơn về thành phần View trong phần sau, “Làm quen với Struts”, và “Xây dựng tầng trình bày”.

Thành phần ControllerThành phần Controller của Struts Framework là xương sống của tất cả các ứng dụng Web Struts. Nó được hiện thực bằng một servlet có tên là org.apache.struts.action.ActionServlet. Servlet này nhận các yêu cầu HTTP và giao quyền điều khiển của mỗi yêu cầu, dựa vào URI của yêu cầu, cho một lớp org.apache.struts.action.Action do người dùng định nghĩa. Lớp Action là nơi mà thành phần Model của ứng dụng được thu lấy và/hay thay đổi. Khi lớp Action đã hoàn tất quá trình xử lý, nó trả về một khóa cho ActionServlet. Khóa này được sử dụng để xác định View nào sẽ trình bày các kết quả xử lý. Bạn có thể hình dung ActionServlet như một đại lý nhận các yêu cầu cho các dịch vụ, và dựa trên các yêu cầu này, tạo ra các đối tượng Action nhằm thực hiện logic nghiệp vụ cần thiết để hoàn tất các dịch vụ này.

Controller là thành phần quan trọng nhất của Struts Framework. Chúng ta sẽ thảo luận chi tiết hơn về thành phần này trong phần sau, “Làm quen với Struts”, và “Action và ActionServlet”.

Ứng dụng Web

Tất cả các ứng dụng Struts được đóng gói theo định dạng ứng dụng Web Java. Vì thế, trước khi tiếp tục, chúng ta khảo sát sơ lược các ứng dụng Web Java.

Java Servlet Specification 2.2 mô tả các ứng dụng Web Java như sau: “Một ứng dụng Web là tập hợp các servlet, các trang HTML, các lớp, và các tài nguyên khác, chúng được đóng gói và chạy trên nhiều container từ nhiều nhà cung cấp”. Nói một cách đơn giản hơn, một ứng dụng Web Java là một tập hợp của một hay nhiều thành phần web được đóng gói cùng với nhau nhằm mục đích tạo ra một ứng dụng hoàn chỉnh để được thực thi ở tầng web của một ứng dụng Enterprise. Dưới đây là danh sách các thành phần có thể được đóng gói trong một ứng dụng Web:

- Các servlet- Các trang JSP- Các thư viện thẻ tùy biến JSP- Các lớp tiện ích và các lớp ứng dụng- Các tài liệu tĩnh, bao gồm HTML, hình ảnh, và JavaScript- Thông tin mô tả ứng dụng Web (siêu thông tin)

Cấu trúc thư mụcTất cả các ứng dụng Web được đặt trong một cấu trúc thư mục chung, cấu trúc thư mục này là một container chứa các thành phần của một ứng dụng Web. Bước đầu tiên trong việc tạo ra một ứng dụng Web là tạo ra cấu trúc thư mục này. Bảng 1.2 mô tả một ứng dụng Web mẫu, có tên là stockapp, và liệt kê nội dung của mỗi thư mục. Mỗi thư mục sẽ được tạo từ <SERVER_ROOT> của Servlet/JSP container.

Cấu trúc thư mục của một ứng dụng Web/stockapp Đây là thư mục gốc của ứng dụng Web. Tất cả các file JSP và HTML đều được lưu trữ tại đây.

Page 5: 19173552 Tim Hiu Java Struts

/stockapp/WEB-INF Đây là thư mục chứa tất cả các tài nguyên có liên quan đến ứng dụng mà không nằm trong gốc tài liệu của ứng dụng. Đây là nơi lưu trữ bộ mô tả triển khai ứng dụng Web. Bạn cần để ý rằng thư mục WEB-INF không phải là phần tài liệu công khai. Không file nào trong thư mục này có thể được cung cấp trực tiếp cho client.

/stockapp/WEB-INF/classes Thư mục này chứa các lớp tiện ích và servlet.

/stockapp/WEB-INF/lib Thư mục này chứa các file JAR (Java Archive) mà ứng dụng Web phụ thuộc vào đó.

Nếu bạn sử dụng Tomcat làm container, thư mục gốc mặc định là <CATALINA_HOME>/webapps/. Hình sau cho thấy ứng dụng stockapp khi nó được host bởi Tomcat container.

Ứng dụng stockapp được host bởi Tomcat

Ứng dụng web cho phép lưu trữ các lớp đã được biên dịch trong thư mục /WEB-INF/classes và /WEB-INF/lib. Khi xử lý, các lớp trong thư mục /classes sẽ được nạp trước, sau đó đến các file JAR trong thư mục /lib. Nếu có các lớp trùng nhau ở cả hai thư mục thì các lớp trong thư mục /classes sẽ được ưu tiên.

Bộ mô tả triển khai ứng dụng WebXương sống của tất cả các ứng dụng Web là bộ mô tả triển khai ứng dụng Web (Web application deployment descriptor)—một file XML có tên là web.xml nằm trong thư mục /<SERVER_ROOT>/ application-name/WEB-INF/. File web.xml mô tả tất cả các thành phần trong ứng ứng dụng Web. Nếu chúng ta sử dụng ứng dụng stockapp thì file web.xml sẽ nằm

Page 6: 19173552 Tim Hiu Java Struts

trong thư mục /<SERVER_ROOT>/ stockapp/WEB-INF/. Những thông tin có thể được mô tả trong bộ mô tả triển khai bao gồm:

- Các thông số khởi tạo ServletContext - Nội dung được bản địa hóa- Cấu hình phiên làm việc- Các định nghĩa Servlet/JSP- Các ánh xạ Servlet/JSP- Các tham chiếu thư viện thẻ- Các ánh xạ kiểu MIME- Danh sách file chào mừng- Các trang lỗi- Thông tin bảo mật

Bộ mô tả triển khai dưới đây định nghĩa một servlet. Chúng ta sẽ khảo sát chi tiết hơn về file web.xml trong các phần sau.

Code: Chọn hết<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app> <servlet> <servlet-name>SimpleServlet</servlet-name> <servlet-class>com.stock.SimpleServlet</servlet-class> </servlet></web-app>

Tomcat JSP/Servlet containerTomcat JSP/Servlet container là một bộ chứa ứng dụng Web (Web application container) mã nguồn mở dựa trên Java, được tạo ra để thực thi các ứng dụng servlet và JavaServer Page. Chúng ta sẽ sử dụng Tomcat cho tất cả các ví dụ tại đây.

Trước khi cài đặt và cấu hình Tomcat, bạn phải đảm bảo các khoản sau:Các yêu cầu khi cài đặt TomcatJava SE Development Kit 5 http://java.sun.com/javase/downloads/index_jdk5.jsp

Apache Tomcat 5.5.8 http://archive.apache.org/dist/tomcat/tomcat-5/

Cài đặt và cấu hình TomcatKhi đã tải được Tomcat và JDK, bạn tiến hành cài đặt theo hướng dẫn đi kèm. Mục đích của chúng ta là cài đặt Tomcat làm một server độc lập trên hệ điều hành Windows Vista. Chúng ta cài

Page 7: 19173552 Tim Hiu Java Struts

đặt Tomcat trong thư mục C:\Program Files\Apache Software Foundation\Tomcat 5.5 và JDK trong thư mục C:\Program Files\Java\jdk1.5.0.

Sau khi đã cài đặt Tomcat và JDK xong, bước kế tiếp là thiết lập biến môi trường JAVA_HOME. Thật ra, bước này không cần thiết, bạn có thể bỏ qua.

Để thiết lập biến môi trường JAVA_HOME, thực hiện như sau:1. Mở Control Panel.2. Mở hộp thoại System Properties, sau đó chọn thẻ Advanced.3. Nhắp vào nút Environment Variables, bạn sẽ thấy màn hình tương tự như hình 1.3.4. Nhắp vào nút New trong phần System variables của hộp thoại Environment Variables. 5. Thêm biến có tên là JAVA_HOME và thiết lập giá trị là đường dẫn của bản cài đặt JDK. Hình 1.4 cho thấy thiết lập ứng với bản cài đặt của chúng ta.

Tất cả đã xong, bây giờ bạn có thể qua phần kế tiếp để kiểm tra bản cài đặt Tomcat.

Hộp thoại Environment Variables

Thiết lập biến môi trường JAVA_HOME ứng với bản cài đặt của chúng ta

Kiểm tra bản cài đặt TomcatTrước khi tiếp tục, chúng ta kiểm tra các bước vừa hoàn tất. Đầu tiên, khởi động Tomcat server bằng cách vào Start | All Programs | Apache Tomcat 5.5 | Monitor Tomcat, rồi nhắp nút Start

Page 8: 19173552 Tim Hiu Java Struts

trong hộp thoại Apache Tomcat Properties (xem hình dưới).

Hộp thoại Apache Tomcat Properties

Sau khi Tomcat đã khởi động, mở trình duyệt theo địa chỉ:http://localhost:8080Bạn sẽ thấy trang chủ mặc định của Tomcat (xem hình dưới).

[img]Trang%20chủ%20mặc%20định%20của%20Tomcat[/img]

Page 9: 19173552 Tim Hiu Java Struts

Bước kế tiếp là kiểm tra bản cài đặt JDK. Cách tốt nhất để thực hiện điều này là chạy thử một trong các ví dụ do Tomcat server cung cấp. Để chạy một ví dụ JSP, từ trang chủ mặc định của Tomcat, chọn JSP Examples. Bạn sẽ thấy trang tương tự như hình dưới.

Trang JSP Examples

Chọn ví dụ có tên là Snoop và nhắp vào liên kết Execute. Nếu mọi thứ được cài đặt đúng, bạn sẽ thấy trang tương tự như hình dưới.

Kết xuất của ví dụ Snoop

Page 10: 19173552 Tim Hiu Java Struts

<Hết phần giới thiệu chung>

Re: Tìm hiểu Java Struts

tuannq 01-01-2009, 18:37

Tổng quan về kiến trúc Java servlet và Javaserver page

Trong phần này, chúng ta sẽ thảo luận về hai công nghệ mà Struts Framework dựa vào: Java servlet và JavaServer Page (JSP). Trước tiên, chúng ta mô tả kiến trúc servlet, bao gồm vòng đời của servlet; mối quan hệ giữa ServletContext và một ứng dụng Web; và cách thu lấy dữ liệu form bằng các servlet.

Một khi bạn đã nắm vững về servlet, chúng ta sẽ chuyển sang thảo luận về JSP, đóng vai trò là thành phần View của Struts Framework. Ở đây, chúng ta định nghĩa JSP và mô tả các thành phần của nó.

Mục đích của chương này là giới thiệu ngắn gọn về công nghệ servlet và JSP. Qua chương này, bạn sẽ hiểu rõ về servlet và JSP, cũng như cách áp dụng chúng vào quá trình phát triển ứng dụng Web Java.

Kiến trúc Java servletJava servlet là một thành phần ứng dụng Web độc lập nền (platform-independent) được host trong một JSP/Servlet container. Servlet kết hợp với web-client theo mô hình yêu cầu/đáp ứng (request/response), được quản lý bởi một JSP/Servlet container. Hình 2.1 mô tả quá trình thực thi của một Java servlet.

Hình: Quá trình thực thi của một Java servlet

Hai gói cấu thành nên kiến trúc servlet là javax.servlet và javax.servlet.http. Gói javax.servlet chứa các lớp và các giao diện tổng quát, được hiện thực và kế thừa bởi tất cả các servlet. Gói javax.servlet.http chứa tất cả các lớp servlet thể hiện đặc trưng của giao thức HTTP.

Page 11: 19173552 Tim Hiu Java Struts

Phần cốt lõi của kiến trúc này là giao diện javax.servlet.Servlet. Đây là giao diện lớp cơ sở cho tất cả các servlet. Giao diện Servlet định nghĩa năm phương thức, trong đó ba phương thức quan trọng nhất là:- Phương thức init()—khởi tạo một servlet- Phương thức service()—nhận và đáp ứng các yêu cầu của client- Phương thức destroy()—thực hiện dọn dẹp

Đây là các phương thức trong vòng đời của servlet. Chúng ta sẽ mô tả các phương thức này trong phần sau. Tất cả các servlet phải hiện thực giao diện Servlet một cách trực tiếp hoặc thông qua kế thừa. Hình 2.2 là một mô hình đối tượng, cho bạn cái nhìn mức cao về bộ khung servlet.

Hình: Một mô hình đối tượng đơn giản của bộ khung servlet

Lớp GenericServlet và HttpServletHai lớp chính trong kiến trúc servlet là GenericServlet và HttpServlet. Lớp HttpServlet được kế thừa từ lớp GenericServlet, GenericServlet hiện thực giao diện Servlet. Khi phát triển các servlet cho mình, rất có khả năng bạn sẽ kế thừa một trong hai lớp này.

Khi kế thừa lớp GenericServlet, bạn phải hiện thực phương thức service(). Phương thức GenericServlet.service() đã được định nghĩa là một phương thức trừu tượng cốt để buộc bạn tuân theo bộ khung này. Nguyên mẫu của phương thức service() được định nghĩa như sau:Code: Chọn hết

Page 12: 19173552 Tim Hiu Java Struts

public abstract void service(ServletRequest request, ServletResponse response) throws ServletException, IOException;

Hai tham số được truyền cho phương thức service() là đối tượng ServletRequest và ServletResponse. Đối tượng ServletRequest chứa thông tin được gửi đến servlet, và đối tượng ServletResponse là nơi đặt dữ liệu mà bạn muốn gửi về client.

Ngược với GenericServlet, khi kế thừa HttpServlet, bạn thường không hiện thực phương thức service(); lớp HttpServlet đã hiện thực phương thức service() cho bạn. Nguyên mẫu sau chứa chữ ký của phương thức HttpServlet.service():Code: Chọn hết

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;

Khi phương thức HttpServlet.service() được gọi, nó xét loại phương thức trong yêu cầu và xác định các phương thức HTTP nào được gọi dựa vào giá trị này. Đây là các phương thức mà bạn có thể chép đè. Nếu loại phương thức là GET, nó sẽ gọi phương thức doGet(). Nếu loại phương thức là POST, nó sẽ gọi phương thức doPost(). Có năm loại phương thức đi cùng với phương thức service(), nhưng doGet() và doPost() là hai phương thức thường được sử dụng nhất. Do đó, chúng ta chỉ tập trung vào hai phương thức này.

Vòng đời của một servletVòng đời của một Java servlet tuân theo một trình tự khá hợp lý. Giao diện khai báo các phương thức trong vòng đời của servlet là javax.servlet.Servlet. Các phương thức này là init(), service(), và destroy(). Trình tự này có thể được mô tả trong một quá trình đơn giản gồm ba bước:

1. Một servlet được nạp và khởi tạo bằng phương thức init(). Phương thức này được gọi khi một servlet được nạp trước hoặc trong lần đầu tiên yêu cầu servlet này.2. Sau đó, servlet sẽ phục vụ 0 hoặc nhiều yêu cầu. Servlet sử dụng phương thức service() để phục vụ mỗi yêu cầu.3. Sau đó, servlet bị hủy và dọn dẹp khi ứng dụng Web chứa servlet đó kết thúc. Phương thức được gọi khi kết thúc là destroy().

Phương thức init()Phương thức init() là nơi bắt đầu vòng đời của servlet. Phương thức này được gọi ngay sau khi servlet được thể hiện hóa và chỉ được gọi một lần duy nhất. Phương thức init() nên được sử dụng để tạo và khởi tạo các tài nguyên sẽ được sử dụng trong khi thụ lý các yêu cầu. Chữ ký của phương thức init() được định nghĩa như sau:Code: Chọn hết

public void init(ServletConfig config) throws ServletException;

Phương thức init() nhận một đối tượng ServletConfig làm tham số. Tham chiếu này nên được lưu trữ trong một biến thành viên để có thể được sử dụng sau này. Cách thông thường để làm điều này là cho init() gọi phương thức supper.init() và truyền đối tượng ServletConfig.

Page 13: 19173552 Tim Hiu Java Struts

Phương thức init() cũng khai báo rằng nó có thể ném biệt lệ ServletException. Nếu vì một lý do nào đó mà servlet không thể khởi tạo các tài nguyên cần thiết nhằm thụ lý các yêu cầu, nó sẽ ném biệt lệ ServletException với một thông báo lỗi.

Phương thức service()Phương thức service() phục vụ tất cả các yêu cầu nhận được từ client theo mẫu yêu cầu/đáp ứng. Chữ ký của phương thức service() như sau:Code: Chọn hết

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;

Phương thức service() nhận hai tham số:- Đối tượng ServletRequest—chứa thông tin yêu cầu từ client.- Đối tượng ServletResponse—chứa thông tin trả về cho client.

Bạn thường không hiện thực phương thức này một cách trực tiếp, trừ phi kế thừa lớp trừu tượng GenericServlet. Bản hiện thực phổ biến nhất của phương thức service() là trong lớp HttpServlet. Lớp này hiện thực giao diện Servlet bằng việc kế thừa lớp GenericServlet. Phương thức service() của nó hỗ trợ các yêu cầu HTTP/1.1 chuẩn bằng cách xác định loại yêu cầu và gọi phương thức phù hợp.

Phương thức destroy()Phương thức này là dấu hiệu kết thúc vòng đời của một servlet. Khi một ứng dụng Web kết thúc, phương thức destroy() của servlet sẽ được gọi. Lúc này đây, tất cả các tài nguyên đã được tạo trong phương thức init() sẽ được dọn dẹp. Dưới đây là chữ ký của phương thức destroy():Code: Chọn hết

public void destroy();

Xây dựng một servletChúng ta đã hiểu cơ bản về servlet và cách làm việc của nó, giờ đây chúng ta sẽ xây dựng một servlet đơn giản. Mục đích của servlet này là phục vụ một yêu cầu và đáp ứng bằng việc in ra địa chỉ của client. Sau khi khảo sát mã nguồn của servlet này, chúng ta sẽ xét các bước liên quan khi biên dịch và cài đặt nó. Dưới đây là mã nguồn của servlet này:

Ví dụ: File SimpleServlet.javaCode: Chọn hết

package ch02;

import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;

public class SimpleServlet extends HttpServlet {

public void init(ServletConfig config)

Page 14: 19173552 Tim Hiu Java Struts

throws ServletException {

// Luôn truyền đối tượng ServletConfig cho lớp super super.init(config); }

// Xử lý yêu cầu HTTP GET public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doPost(request, response); }

// Xử lý yêu cầu HTTP POST public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html"); PrintWriter out = response.getWriter();

out.println("<html>"); out.println("<head><title>Simple Servlet</title></head>"); out.println("<body>");

// Xuất địa chỉ của client out.println("Your address is " + request.getRemoteAddr() + "\n");

out.println("</body></html>"); out.close(); }}

Bạn đã xem qua mã nguồn của SimpleServlet, bây giờ hãy xem kỹ hơn mỗi phần trong đó. Chúng ta xét servlet này khớp với bộ khung Java Servlet Development Kit (JSDK) ở điểm nào, các phương thức mà servlet hiện thực, và các đối tượng mà servlet sử dụng. Có ba phương thức được chép đè trong SimpleServlet:

- Phương thức init()- Phương thức doGet()- Phương thức doPost()

Bây giờ, chúng ta xét chi tiết mỗi phương thức.Phương thức init()

Trước hết, SimpleServlet định nghĩa một bản hiện thực đơn giản của phương thức init(). Nó nhận đối tượng ServletConfig, rồi truyền cho phương thức init() cha để đối tượng này có thể được sử dụng về sau. Dòng mã sau thực hiện điều này:Code: Chọn hết

super.init(config);

Page 15: 19173552 Tim Hiu Java Struts

Cha của SimpleServlet, thực sự nắm giữ đối tượng ServletConfig, chính là GenericServlet.

Bạn nên để ý rằng bản hiện thực này của phương thức init() không tạo ra bất cứ tài nguyên nào. Đây là lý do khiến SimpleServlet không hiện thực phương thức destroy().

Phương thức doGet() và doPost()Phương thức doGet() và doPost() của SimpleServlet là nơi tất cả các logic nghiệp vụ thực sự được thực hiện, và trong trường hợp này, phương thức doGet() gọi phương thức doPost(). Phương thức doGet() chỉ được thực thi khi một yêu cầu GET được gửi đến container. Nếu một yêu cầu POST được tiếp nhận thì phương thức doPost() sẽ phục vụ yêu cầu này.

Cả hai phương thức doGet() và doPost() đều nhận đối tượng HttpServletRequest và HttpServletResponse làm tham số. HttpServletRequest chứa thông tin được gửi từ client, và HttpServletResponse chứa thông tin sẽ được trả về client.

Dòng mã được thực thi đầu tiên của phương thức doPost() là thiết lập loại nội dung của đáp ứng. Điều này được thực hiện như sau:Code: Chọn hết

response.setContentType("text/html");

Phương thức này thiết lập loại nội dung của đáp ứng. Bạn có thể thiết lập thuộc tính này chỉ một lần, và phải được thiết lập trước khi ghi ra một Writer hay OutputStream. Trong ví dụ trên, chúng ta thiết lập loại đáp ứng là text/html.

Việc kế tiếp chúng ta làm là thu lấy một PrintWriter. Điều này được thực hiện bằng cách gọi phương thức getWriter() của ServletResponse. PrintWriter cho phép chúng ta ghi ra luồng đáp ứng. Mọi thứ được ghi ra PrintWriter sẽ được hiển thị trong trình duyệt client. Bước này được hoàn tất bằng dòng mã sau:Code: Chọn hết

PrintWriter out = response.getWriter();

Khi đã có một tham chiếu đến đối tượng cho phép ghi văn bản đến client, chúng ta sử dụng đối tượng này để ghi một thông điệp đến client. Thông điệp này được định dạng theo HTML, và sẽ được trình bày trong trình duyệt client. Điều này được thực hiện bằng đoạn mã sau:Code: Chọn hết

out.println("<html>");out.println("<head><title>Simple Servlet</title></head>");out.println("<body>");

// Xuất địa chỉ của client out.println("Your address is " + request.getRemoteAddr() + "\n");

out.println("</body></html>");out.close();

Page 16: 19173552 Tim Hiu Java Struts

SimpleServlet sử dụng một phương pháp rất đơn giản để gửi HTML đến client: truyền cho phương thức println() của PrintWriter đoạn văn bản HTML mà chúng ta muốn đưa vào đáp ứng và đóng luồng này lại. Có lẽ bạn quan tâm nhất đến dòng mã:Code: Chọn hết

// Xuất địa chỉ của clientout.println("Your address is " + request.getRemoteAddr() + "\n");

Dòng mã này dựa vào thông tin nhận được từ client và gọi phương thức getRemoteAddr() của HttpServletRequest, phương thức này trả về địa chỉ IP của client. Đối tượng HttpServletRequest giữ nhiều thông tin đặc-trưng-giao-thức-HTTP về client. Nếu muốn tìm hiểu sâu hơn về các đối tượng HttpServletRequest và HttpServletResponse, bạn có thể vào website của Sun:http://java.sun.com/products/servlet/

Xây dựng và triển khai một servletĐể xem SimpleServlet hoạt động thế nào, trước tiên bạn cần tạo một ứng dụng Web sẽ quản lý servlet này, sau đó biên dịch và triển khai servlet này vào ứng dụng Web đó.

Các bước này được mô tả dưới đây:1. Tạo một ứng dụng Web có tên là ch02, sử dụng cấu trúc thư mục đã được mô tả trong chương 1, “Giới thiệu dự án Struts”.2. Thêm file servlet.jar vào đường dẫn lớp của bạn, file này nằm trong thư mục <CATALINA_HOME>/common/lib/.3. Biên dịch mã nguồn của SimpleServlet.4. Chép file .class vào thư mục <CATALINA_HOME>/webapps/ch02/WEB-INF/classes/ch02.5. Thêm định nghĩa sau vào file web.xml. SimpleServlet sẽ được triệu gọi khi URL chứa mẫu simple:Code: Chọn hết

<servlet> <servlet-name>SimpleServlet</servlet-name> <servlet-class>ch02.SimpleServlet</servlet-class></servlet>

<servlet-mapping> <servlet-name>SimpleServlet</servlet-name> <url-pattern>simple</url-pattern></servlet-mapping>

Khi đã hoàn tất các bước trên, bạn có thể thực thi SimpleServlet và xem kết quả. Để thực hiện điều này, bạn hãy khởi động Tomcat và mở trình duyệt theo địa chỉ:

http://localhost:8080/ch02/simple

Bạn sẽ thấy kết quả tương tự như hình dưới (để ý rằng địa chỉ IP của client được định dạng theo IPv6 trên Windows Vista, ở đây là 0:0:0:0:0:0:0:1—đối với IPv4 là 127.0.0.1).

Page 17: 19173552 Tim Hiu Java Struts

Hình: Kết xuất của SimpleServlet (đây là IPv6)

ServletContextMột ServletContext là một đối tượng được định nghĩa trong gói javax.servlet. Nó định nghĩa tập hợp các phương thức được sử dụng bởi các thành phần phía server của một ứng dụng Web để giao tiếp với Servlet container.

ServletContext thường được sử dụng làm vùng lưu trữ cho các đối tượng cần có hiệu lực với tất cả các thành phần phía server trong một ứng dụng Web. Bạn có thể xem ServletContext như một phân đoạn bộ nhớ dùng chung cho các ứng dụng Web. Khi một đối tượng được đặt trong ServletContext, nó tồn tại cùng với một ứng dụng Web, trừ phi nó bị loại bỏ hay thay thế. Có bốn phương thức được định nghĩa bởi ServletContext, chủ yếu cung cấp các chức năng của bộ nhớ dùng chung. Bảng dưới mô tả các phương thức này.

Bảng: Các phương thức “bộ nhớ dùng chung” của ServletContext setAttribute() Gắn một đối tượng vào tên cho trước và lưu đối tượng này vào ServletContext hiện hành. Nếu tên đã được sử dụng, phương thức này loại bỏ đối tượng cũ và gắn tên này vào đối tượng mới.

getAttribute() Trả về đối tượng được tham chiếu bởi tên cho trước, hoặc trả về null nếu không có đối tượng nào với tên này.

removeAttribute() Loại bỏ một đối tượng với tên cho trước khỏi ServletContext.

getAttributeNames() Trả về các chuỗi chứa tên của các đối tượng được lưu trữ trong ServletContext hiện hành.

Page 18: 19173552 Tim Hiu Java Struts

Mối quan hệ giữa ứng dụng Web và ServletContextServletContext đóng vai trò là container (bộ chứa) cho một ứng dụng Web. Mỗi ứng dụng Web chỉ có một thể hiện của ServletContext. Mối quan hệ này được quy định bởi Java Servlet Specification và là bắt buộc đối với tất cả các Servlet container.

Để thấy được mối quan hệ này ảnh hưởng như thế nào đến các thành phần Web, chúng ta sử dụng một servlet và một JSP. Thành phần Web đầu tiên mà chúng ta xét đến là một servlet, servlet này lưu trữ một đối tượng trong ServletContext với mục đích làm cho đối tượng này có hiệu lực với tất cả các thành phần phía server trong ứng dụng Web. Ví dụ 2.2 trình bày mã nguồn của servlet:

Ví dụ: ContextServlet.javaCode: Chọn hết

package ch02;

import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;

public class ContextServlet extends HttpServlet {

private static final String CONTENT_TYPE = "text/html";

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doPost(request, response); }

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// Thu lấy một tham chiếu đến ServletContext ServletContext context = getServletContext();

// Thu lấy đối tượng userName từ ServletContext String userName = (String)context.getAttribute("USERNAME");

// Nếu không có đối tượng userName thì tạo mới và thêm vào ServletContext if ( userName == null ) { userName = new String("Bob Roberts"); context.setAttribute("USERNAME", userName); }

response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter();

out.println("<html>"); out.println("<head><title>Context Servlet</title></head>");

Page 19: 19173552 Tim Hiu Java Struts

out.println("<body>");

// Xuất giá trị hiện tại của đối tượng userName out.println("<p>The current User is : " + userName + ".</p>"); out.println("</body></html>"); }

public void destroy() { }}

Khi xem ContextServlet, để ý rằng nó thực hiện các bước sau:1. Trước tiên, nó thu lấy một tham chiếu đến ServletContext bằng phương thức getServletContext(): Code: Chọn hết

ServletContext context = getServletContext();

2. Khi đã có một tham chiếu đến ServletContext, nó thu lấy một tham chiếu đến đối tượng được gắn tên USERNAME từ ServletContext bằng phương thức getAttribute():Code: Chọn hết

String userName = (String)context.getAttribute("USERNAME");

3. Sau đó, nó kiểm tra tham chiếu trả về có hợp lệ hay không. Nếu getAttribute() trả về null thì không một đối tượng nào được gắn tên USERNAME. Khi đó, đối tượng sẽ được tạo mới và thêm vào ServletContext bằng phương thức setAttribute():Code: Chọn hết

// Nếu không có đối tượng userName thì tạo mới và thêm vào ServletContext if ( userName == null ) { userName = new String("Bob Roberts"); context.setAttribute("USERNAME", userName);}

4. Sau đó, giá trị của tham chiếu này được in ra luồng xuất bằng phương thức PrintWriter. println():Code: Chọn hết

// Xuất giá trị hiện tại của đối tượng userNameout.println("<p>The current User is : " + userName + ".</p>");

Sau khi đã xem qua servlet này, bạn hãy hoàn tất các bước sau:1. Biên dịch mã nguồn của ContextServlet.2. Chép file .class vào thư mục <CATALINA_HOME>/webapps/ch02/WEB-INF/classes/ch02.3. Thêm định nghĩa sau vào file web.xml:Code: Chọn hết

<servlet> <servlet-name>ContextServlet</servlet-name> <servlet-class>ch02.ContextServlet</servlet-class></servlet>

Page 20: 19173552 Tim Hiu Java Struts

<servlet-mapping> <servlet-name>ContextServlet</servlet-name> <url-pattern>context</url-pattern></servlet-mapping>

JSP mà chúng ta sẽ sử dụng rất giống với servlet trên, tuy nhiên có hai điểm khác:- Mã lệnh truy xuất ServletContext nằm trong một đoạn kịch bản JSP, sẽ được thảo luận trong phần sau của chương này.- Nếu không tìm thấy đối tượng nào được gắn tên USERNAME, JSP sẽ không tạo đối tượng mới.

Phần mã lệnh còn lại thực hiện những hành động về cơ bản là giống nhau, nhưng thực hiện trong một trang JSP. Bạn hãy xem mã nguồn JSP trong ví dụ dưới

Ví dụ: Context.jspCode: Chọn hết

<HTML> <HEAD> <TITLE>Context</TITLE> </HEAD> <BODY> <% // Thu lấy đối tượng userName từ ServletContext String userName = (String)application.getAttribute("USERNAME");

if ( userName == null ) { // Không thêm mới, chỉ thông báo rằng không tìm thấy out.println("<b>Could not find a reference to the attribute USERNAME"); } else { out.println("<b>The current User is : " + userName + "</b>"); } %> </BODY></HTML>

Trong Context.jsp, chúng ta sử dụng hai đối tượng JSP ngầm: đối tượng application tham chiếu đến ServletContext, và đối tượng out tham chiếu đến luồng xuất. Chúng ta sẽ thảo luận chúng trong phần sau của chương này.

Bây giờ, bạn hãy chép Context.jsp vào thư mục <CATALINA_HOME>/webapps/ch02/, khởi động Tomcat và mở trình duyệt theo địa chỉ:http://localhost:8080/ch02/Context.jspBạn sẽ thấy trang tương tự như hình sau:

Page 21: 19173552 Tim Hiu Java Struts

Hình: Kết quả của Context.jsp

Theo đó, Context.jsp không tìm thấy đối tượng nào được gắn tên USERNAME. Nó sẽ không thể tìm thấy cho đến khi đối tượng này được tạo bởi ContextServlet. Để thực hiện điều này, bạn mở trình duyệt theo địa chỉ:http://localhost:8080/ch02/contextBạn sẽ thấy kết quả tương tự như sau:

Hình: Kết quả của ContextServlet

Sau khi thực thi servlet này, ứng dụng ch02 có một đối tượng được gắn tên USERNAME lưu trong ServletContext. Để thấy nó ảnh hưởng như thế nào đến các thành phần Web khác trong ứng dụng ch02, bạn hãy mở lại Context.jsp trong trình duyệt. Giờ đây, JSP có thể tìm thấy USERNAME và in ra giá trị này.

Page 22: 19173552 Tim Hiu Java Struts

Để loại bỏ một đối tượng khỏi ServletContext, bạn có thể khởi động lại JSP/Servlet container hoặc sử dụng phương thức ServletContext.removeAttribute().

Sử dụng servlet để thu lấy dữ liệu HTTP

Trong phần này, chúng ta nghiên cứu cách thu lấy thông tin từ client của servlet. Có ba phương thức có thể được sử dụng để thu lấy các tham số yêu cầu; đó là các phương thức getParameter(), getParameterValues(), getParameterNames() của ServletRequest. Chữ ký của mỗi phương thức như sau:Code: Chọn hết

public String ServletRequest.getParameter(String name);public String[] ServletRequest.getParameterValues(String name);public Enumeration ServletRequest.getParameterNames();

Phương thức getParameter() trả về giá trị đơn của tham số được nêu tên (ở dạng chuỗi), hoặc trả về null nếu tham số này không có trong yêu cầu. Bạn nên sử dụng phương thức này khi chắc rằng yêu cầu chỉ chứa một giá trị cho tham số. Nếu tham số có nhiều giá trị, bạn nên sử dụng phương thức getParameterValues().

Phương thức getParameterValues() trả về các giá trị của tham số được nêu tên (ở dạng mảng chuỗi), hoặc trả về null nếu tham số này không có trong yêu cầu.

Phương thức getParameterNames() trả về tên của các tham số trong yêu cầu (ở dạng Enumeration), hoặc trả về Enumeration rỗng nếu không có tham số nào. Phương thức này được sử dụng làm phương thức hỗ trợ cho phương thức getParameter() và getParameterValues(). Danh sách tên tham số có thể được duyệt qua bằng cách gọi phương thức getParameter() hay getParameterValues() ứng với mỗi tên tham số trong danh sách đó.

Để thấy cách sử dụng các phương thức này để thu lấy dữ liệu, chúng ta hãy quan sát một servlet phục vụ các yêu cầu POST: thu lấy các tham số gửi đến và trả về các tham số cùng giá trị của chúng cho client. Servlet này được trình bày trong ví dụ sau:

Ví dụ: ParameterServlet.javaCode: Chọn hết

package ch02;

import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;

public class ParameterServlet extends HttpServlet {

// Xử lý yêu cầu HTTP GET public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Page 23: 19173552 Tim Hiu Java Struts

doPost(request, response); }

// Xử lý yêu cầu HTTP POST public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html"); PrintWriter out = response.getWriter();

out.println("<html>"); out.println("<head>"); out.println("<title>Parameter Servlet</title>"); out.println("</head>"); out.println("<body>");

// Thu lấy tên của các tham số Enumeration parameters = request.getParameterNames();

String param = null;

// Duyệt qua tên của các tham số, thu lấy giá trị của các tham số while ( parameters.hasMoreElements() ) { param = (String)parameters.nextElement(); out.println(param + " : " + request.getParameter(param) + "<BR>"); }

out.println("</body></html>"); out.close(); }}

Hành động đầu tiên được thực hiện bởi servlet này là lấy tất cả tên tham số được truyền trong yêu cầu bằng phương thức getParameterNames(). Khi đã có danh sách này, nó thực hiện vòng lặp while, thu lấy và in tất cả giá trị cùng với tên tham số bằng phương thức getParameter(). Bạn có thể gọi ParameterServlet bằng cách mã hóa chuỗi URL với các tham số và giá trị, hoặc sử dụng HTML form.Ví dụ: Form.htmlCode: Chọn hết

<HTML> <HEAD> <TITLE>Parameter Servlet Form</TITLE> </HEAD> <BODY> <form action="parameter" method=POST> <table width="400" border="0" cellspacing="0"> <tr> <td>Name: </td> <td> <input type="text" name="name" size="20" maxlength="20">

Page 24: 19173552 Tim Hiu Java Struts

</td> <td>SSN:</td> <td> <input type="text" name="ssn" size="11" maxlength="11"> </td> </tr> <tr> <td>Age:</td> <td> <input type="text" name="age" size="3" maxlength="3"> </td> <td>email:</td> <td> <input type="text" name="email" size="30" maxlength="30"> </td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td> <input type="submit" name="Submit" value="Submit"> <input type="reset" name="Reset" value="Reset"> </td> </tr> </table> </FORM> </BODY></HTML>

Tài liệu HTML này chứa một HTML form đơn giản, có thể được sử dụng để truyền dữ liệu cho ParameterServlet. Để xem ví dụ này hoạt động thế nào, bạn hãy thực hiện các bước sau:1. Biên dịch mã nguồn của ParameterServlet.2. Chép file .class vào thư mục <CATALINA_HOME>/webapps/ch02/WEB-INF/classes/ch02.3. Thêm định nghĩa sau vào file web.xml:Code: Chọn hết

<servlet> <servlet-name>ParameterServlet</servlet-name> <servlet-class>ch02.ParameterServlet</servlet-class></servlet>

<servlet-mapping> <servlet-name>ParameterServlet</servlet-name> <url-pattern>parameter</url-pattern></servlet-mapping>

4. Chép file Form.html vào thư mục <CATALINA_HOME>/webapps/ch02/.

Bây giờ, bạn hãy mở trình duyệt theo địa chỉ:

Page 25: 19173552 Tim Hiu Java Struts

http://localhost:8080/ch02/Form.html

Nhập dữ liệu vào form và nhắp nút Submit (xem hình dưới). Tất nhiên, đáp ứng mà bạn nhận được tùy theo dữ liệu nhập vào, nhưng nó cũng gần giống như hình dưới

http://codeprovn.com/store/nqnam/xay_du ... age055.jpgHình: Kết xuất của Form.html

Hình: Đáp ứng của ParameterServletVí dụ này cho thấy việc lấy các tham số yêu cầu trong một servlet rất dễ. Mặc dù ParameterServlet làm việc rất tốt đối với hầu hết các yêu cầu, nhưng nó vẫn có lỗi. Khi sử dụng phương thức getParameter() để lấy các giá trị tham số, chúng ta chỉ mong nhận được một giá trị cho một tham số yêu cầu. Nếu không thể cậy vào lập luận này, chúng ta nên sử dụng phương thức getParameterValues().

<Hết phần con Kiến trúc Java servlet, phần con tiếp theo là JavaServer Page>

Re: Tìm hiểu Java Struts

loga 04-01-2009, 00:03

Đọc bài tut này có 3 điểm còn mập mờ, nêu lên để mọi người cùng trao đổi :1.Sự khác nhau giữa Servlet và Jsp. Tại sao người ta lại mở rộng Servlet thành jsp?2.Sự khác nhau giữa 2 phuơng thức POST và GET trong thẻ <form>3.Ví dụ trong bài viết chưa Demo rõ được chức năng của ServletContext.Phần lớn người ta hay dùng HttpRequest và HttpResponse để lấy và thiết lập giá trị được gửi tới từ Client, em thấy rất ít dùng ServletContext, có lẽ là do trong các ứng dụng nhỏ thì chưa đụng tới nó chănghttp://uit.edu.vn

Page 26: 19173552 Tim Hiu Java Struts

Re: Tìm hiểu Java Struts

MicroStar 04-01-2009, 00:43

loga wrote:2.Sự khác nhau giữa 2 phuơng thức POST và GET trong thẻ <form>

method="POST" action="do sth" : gửi dữ liệu của các thẻ input đến Server xử lýmethod=GET action="do sth" : Nhận dữ liệu trả về từ Server sau khi Server đã xử lý xong

Re: Tìm hiểu Java Struts

loga 04-01-2009, 00:59

method="POST" action="do sth" : gửi dữ liệu của các thẻ input đến Server xử lýmethod=GET action="do sth" : Nhận dữ liệu trả về từ Server sau khi Server đã xử lý xong

Bạn chắc không?? Bạn thử làm cùng 1 trang html nhưng thay đổi phuơng thức POST và GET trong thẻ <form> còn thuộc tính action thì cùng trỏ về 1 trang nào đó để xử lý thông tin mình gửi lên server thử

Vdu:<form action="xuly" method="get"> với lại <form action="xuly" method="post">

Re: Tìm hiểu Java Struts

tuannq 12-01-2009, 11:37

loga wrote:Đọc bài tut này có 3 điểm còn mập mờ, nêu lên để mọi người cùng trao đổi :1.Sự khác nhau giữa Servlet và Jsp. Tại sao người ta lại mở rộng Servlet thành jsp?2.Sự khác nhau giữa 2 phuơng thức POST và GET trong thẻ <form>3.Ví dụ trong bài viết chưa Demo rõ được chức năng của ServletContext.Phần lớn người ta hay dùng HttpRequest và HttpResponse để lấy và thiết lập giá trị được gửi tới từ Client, em thấy rất ít dùng ServletContext, có lẽ là do trong các ứng dụng nhỏ thì chưa đụng tới nó chăng

1. jsp là file của java, Servlet là gói thư viện cho jsp, không phải là mở rộng servlet thành jsp2. method GET sẽ cho các tham số xuất hiện trên URL, trong khi method POST các dữ liệu đính kèm hidden so với user.Method GET có kích thước nhỏ, không mang tính bảo mật, chỉ chấp nhận tham số dạng chuỗi (do các tham số này xuất hiện trên URL)Method POST có kích thước lớn, được qui định trong configuration của web server, và không giới hạn về kiểu dữ liệu

3. ServletContext là object hỗ trợ bởi gói thư viện Servlet, còn HttpRequest, HttpResponse là

Page 27: 19173552 Tim Hiu Java Struts

object của java jsp. Trong ServletContext nó vẫn sử dụng HttpRequest để lấy dữ liệu.

Re: Tìm hiểu Java Struts

loga 12-01-2009, 11:58

1. jsp là file của java, Servlet là gói thư viện cho jsp, không phải là mở rộng servlet thành jsp2. method GET sẽ cho các tham số xuất hiện trên URL, trong khi method POST các dữ liệu đính kèm hidden so với user.Method GET có kích thước nhỏ, không mang tính bảo mật, chỉ chấp nhận tham số dạng chuỗi (do các tham số này xuất hiện trên URL)Method POST có kích thước lớn, được qui định trong configuration của web server, và không giới hạn về kiểu dữ liệu

3. ServletContext là object hỗ trợ bởi gói thư viện Servlet, còn HttpRequest, HttpResponse là object của java jsp. Trong ServletContext nó vẫn sử dụng HttpRequest để lấy dữ liệu.

Mình bổ sung thêm 1.Bản chất của jsp là 1 file servlet vì khi chạy file jsp thì nó sẽ được compile thành 1 file servlet trước Cho nên mình mới có thắc mắc, tại sao lại phải dùng jsp, trong khi chỉ với servlet là đủ dùng, và câu trả lời theo mình nghĩ là: khi viết code trong servlet, để xuất ra dữ liệu chúng ta phải dùng lệnh out.println("các thẻ html"), thật là bất tiện và rắc rối khi debug cho nên ta dùng jsp.Dùng jsp hay servlet là tùy theo mục đích sử dụng của chúng ta, theo mình dùng jsp cho View(hiển thị dữ liệu) còn servlet cho việc xử lý(Controller).Cái này các bạn sẽ thấy rõ trong những TUT về Struts sắp tới

Re: Tìm hiểu Java Struts

tuannq 22-03-2009, 12:49

loga wrote:mình có câu hỏi thế này: khi nào thì dùng GET và khi nào dùng POST

Câu hỏi này khó có thể trả lời hết loga ạ, đặt vào một trường hợp cụ thể ta mới có thể biết chính xác nên dùng gì. Nnhư mình đã nói ở trên, những data có kích thước nhỏ, ở dạng chuỗi, không cần che dấu user, có thể dùng GETnếu không thì dùng POSTThông thường data từ form thì dùng POSTKhi ta cần một URL ngắn gọn dễ nhớ cho user thì dùng GET (đây là 1 điểm lợi của GET so với POST), ví dụKhi tôi cần chia xẻ bài viết "Tìm hiểu Java Struts" này cho bạn bè thì tôi chỉ cần past cho họ

Page 28: 19173552 Tim Hiu Java Struts

đường link viewtopic.php?f=23&t=1403 vì page "_http://codeprovn.com/forums/viewtopic.php" của tôi đã chấp nhận và xử lý GET messagenếu page đó chỉ nhận POST message thì mọi bài viết chỉ có 1 đường link duy nhất là "_http://codeprovn.com/forums/viewtopic.php", và trong đó chỉ có một cái form chứa 1 textbox cho người dùng chọn tên hoặc id bài viếtđó là cái được của GET

Re: Tìm hiểu Java Struts

loga 23-03-2009, 21:20

Em xin bổ sung sự khác nhau về POST vs GET mà em đọc được trong cuốn introduction to java programing theo cách hiểu của emEm post 1 bài mới luôn, và đây là link tới bài viết để mọi người cùng trao đổi

Re: Tìm hiểu Java Struts

tuannq 22-04-2009, 00:21

JavaServer Page là gì?JavaServer Page (JSP) là một công nghệ đơn giản nhưng mạnh mẽ, thường được sử dụng để tạo HTML động phía server. JSP là bản mở rộng trực tiếp của Java servlet, được thiết kế để người lập trình nhúng trực tiếp mã xử lý Java vào tài liệu được yêu cầu. Một tài liệu JSP phải có phần mở rộng .jsp. Đoạn mã sau là một file JSP đơn giản, kết quả được thể hiện ở hình dướiCode: Chọn hết

<HTML> <BODY> <% out.println("HELLO JSP READER"); %> </BODY></HTML>

Page 29: 19173552 Tim Hiu Java Struts

Hình: Kết xuất của một file JSP đơn giản

Tài liệu này giống như các tài liệu HTML khác, cùng với các thẻ chứa mã Java được thêm vào. Mã nguồn được lưu trong file hello.jsp và được đặt vào thư mục tài liệu của ứng dụng Web (JSP sẽ được triển khai vào đó). Khi một yêu cầu được tạo ra cho tài liệu này, server nhận dạng phần mở rộng .jsp và thấy rằng cần xử lý đặc biệt. Sau đó, JSP được truyền đến bộ máy JSP (chỉ là một servlet khác được ánh xạ đến phần mở rộng .jsp) để xử lý.

Khi file JSP được yêu cầu lần đầu tiên, nó được dịch thành một servlet, sau đó được biên dịch thành một đối tượng và được nạp vào bộ nhớ. Servlet đó sẽ phục vụ yêu cầu và trả kết quả về cho client. Với tất cả các yêu cầu về sau, server kiểm tra xem file JSP gốc có bị thay đổi hay không. Nếu không thay đổi, server sẽ gọi đối tượng servlet đã được biên dịch trước đó. Nếu bị thay đổi, bộ máy JSP sẽ phân tích lại mã nguồn JSP này. Hình dưới mô tả các bước của một yêu cầu JSP:

Page 30: 19173552 Tim Hiu Java Struts

Hình: Các bước của một yêu cầu JSP

Bạn nên nhớ rằng JSP là servlet được tạo ra từ sự kết hợp HTML và mã Java. Vì thế, chúng có các tài nguyên và chức năng của một servlet.

Các thành phần của một JavaServer PagePhần này thảo luận về các thành phần của một trang JSP, bao gồm các chỉ thị, kịch bản, các đối tượng ngầm, và các hành động chuẩn.Chỉ thị JSP

Các chỉ thị JSP là các phần tử JSP cung cấp thông tin toàn cục về một trang JSP. Ví dụ, một chỉ thị gồm một danh sách các lớp Java được import vào một trang JSP. Cú pháp của một chỉ thị JSP như sau:Code: Chọn hết

<%@ directive {attribute="value"} %>

Các chỉ thị được định nghĩa bởi JSP Specification v1.2 bao gồm: page, include, và taglib.Chỉ thị page

Chỉ thị page định nghĩa thông tin sẽ ảnh hưởng đến toàn bộ trang JSP chứa chỉ thị này. Cú pháp của một chỉ thị page như sau:Code: Chọn hết

<%@ page {attribute="value"} %>

Bảng dưới định nghĩa các đặc tính của chỉ thị page.language="scriptingLanguage"

Page 31: 19173552 Tim Hiu Java Struts

Báo cho server biết ngôn ngữ nào sẽ được sử dụng để biên dịch file JSP này. Hiện tại Java là ngôn ngữ duy nhất được hỗ trợ, nhưng chúng ta hy vọng trong tương lai sẽ có thêm những ngôn ngữ khác.

extends="className" Định nghĩa lớp cha mà JSP này sẽ kế thừa. Mặc dù bạn có thể kế thừa từ các servlet khác, nhưng điều này sẽ hạn chế khả năng thực hiện tối ưu hóa của bộ máy JSP/Servlet, và vì thế, không được khuyến khích.

import="importList" Định nghĩa danh sách các gói Java sẽ được import vào JSP này (tên của các gói được phân cách bởi dấu phẩy).

session="true | false" Xác định dữ liệu phiên làm việc có hiệu lực với trang JSP này hay không. Mặc định là true. Nếu không có ý sử dụng phiên làm việc trong trang JSP, bạn nên thiết lập đặc tính này là false để có hiệu năng tốt hơn.

buffer="none | size in kb" Xác định vùng đệm của luồng xuất. Giá trị mặc định là 8KB.

autoFlush="true | false" Xác định vùng đệm của luồng xuất sẽ được flush một cách tự động hay sẽ ném một biệt lệ khi vùng đệm đầy. Mặc định là true.

isThreadSafe="true | false" Báo với bộ máy JSP rằng trang JSP này có thể phục vụ nhiều yêu cầu cùng một lúc. Mặc định là true. Nếu đặc tính này được thiết lập là false, SingleThreadModel sẽ được sử dụng.

info="text" Mô tả thông tin về trang JSP này, có thể được truy xuất bằng phương thức Servlet.getServletInfo().

errorPage="error_url" Mô tả địa chỉ tương đối của trang JSP sẽ thụ lý các biệt lệ JSP.

isErrorPage="true | false" Cho biết trang JSP này có phải là một trang lỗi hay không. Mặc định là false.

contentType="ctinfo" Mô tả loại MIME và bộ ký tự của đáp ứng.

Bởi tất cả các đặc tính bắt buộc đã được ngầm định, bạn không cần thiết phải chỉ định bất cứ chỉ thị page nào.

Chỉ thị taglib

Page 32: 19173552 Tim Hiu Java Struts

Chỉ thị taglib cho biết trang JSP sử dụng một thư viện thẻ tùy biến, được định danh duy nhất bởi một URI và kết hợp với một tiền tố nhằm phân biệt các bộ thẻ tùy biến được sử dụng. Cú pháp của chỉ thị taglib như sau:Code: Chọn hết

<%@ taglib uri="tagLibraryURI" prefix="tagPrefix" %>

Các đặc tính của chỉ thị taglib được mô tả trong bảng dưới

Bảng các đặc tính của chỉ thị tagliburi URI định danh duy nhất một thư viện thẻ tùy biến.

prefix Tiền tố được sử dụng để phân biệt thư viện thẻ tùy biến.

Dòng mã sau trình bày cách sử dụng chỉ thị taglib:Code: Chọn hết

<%@ taglib uri="http://jakarta.apache.org/taglibs/random-1.0" prefix="rand" %>

Kịch bản JSPKịch bản là một cơ chế của JSP nhằm nhúng trực tiếp các đoạn mã Java vào trong trang HTML. Có ba thành phần ngôn ngữ kịch bản trong một kịch bản JSP. Mỗi thành phần giữ một vị trí thích hợp trong servlet được sinh ra.Khai báo JSPKhai báo JSP được sử dụng để định nghĩa các biến và các phương thức Java trong một trang JSP. Một khai báo JSP phải là một câu lệnh khai báo hoàn chỉnh.Khai báo JSP được khởi tạo khi trang JSP lần đầu tiên được nạp. Sau khi các khai báo đã được khởi tạo, chúng sẽ có hiệu lực với các đoạn kịch bản, các biểu thức, và các khai báo khác trong cùng một trang JSP. Cú pháp của một khai báo JSP như sau:Code: Chọn hết

<%! declaration %>

Ví dụ dưới đây khai báo một biến:Code: Chọn hết

<%! String name = new String("BOB"); %>

Ví dụ dưới đây khai báo một phương thức:Code: Chọn hết

<%! public String getName() { return name; } %>

Để hiểu rõ hơn về khai báo, chúng ta hãy lấy khai báo biến ở trên nhúng vào một tài liệu JSP:

Page 33: 19173552 Tim Hiu Java Struts

Code: Chọn hết<HTML> <BODY> <%! String name = new String("BOB"); %> </BODY></HTML>

Khi tài liệu này được nạp lần đầu tiên, mã JSP được chuyển thành mã servlet và khai báo name sẽ được đặt trong phần khai báo của servlet. Giờ đây, nó có hiệu lực với tất cả các thành phần JSP khác trong trang JSP.

Chú ý rằng, tất cả các khai báo JSP được định nghĩa ở cấp độ lớp, trong servlet được sinh từ trang JSP, và do đó, được đánh giá trước các biểu thức và đoạn kịch bản JSP.

Biểu thức JSPBiểu thức JSP là thành phần JSP mà nguyên bản của nó, dựa vào đánh giá của container, được thay bằng kết quả đánh giá. Biểu thức JSP được đánh giá tại thời điểm yêu cầu, và kết quả được chèn tại vị trí tham chiếu trong trang JSP. Nếu kết quả không thể được chuyển thành chuỗi, lỗi thông dịch sẽ xuất hiện. Nếu phép chuyển đổi sang chuỗi không thể được nhận biết trong lúc dịch, biệt lệ ClassCastException sẽ bị ném tại thời điểm yêu cầu.

Cú pháp của một biểu thức JSP như sau:Code: Chọn hết

<%= expression %>

Dòng mã dưới đây chứa một biểu thức JSP:Code: Chọn hết

Hello <B><%= getName() %></B>

Trang JSP dưới đây chứa một biểu thức JSP:Code: Chọn hết

<HTML> <BODY> <%! public String getName() { return "Bob"; } %> Hello <B><%= getName() %></B> </BODY></HTML>

Đoạn kịch bản JSPĐoạn kịch bản JSP là thành phần JSP gom tất cả các phần tử JSP lại với nhau. Chúng có thể chứa hầu như bất kỳ câu lệnh hợp lệ nào đối với ngôn ngữ được tham chiếu trong đặc tính language của chỉ thị page. Chúng được thực thi tại thời điểm yêu cầu, và có thể sử dụng tất cả các thành phần JSP. Cú pháp của một đoạn kịch bản như sau:Code: Chọn hết

Page 34: 19173552 Tim Hiu Java Struts

<% scriptlet source %>

Khi mã kịch bản JSP được chuyển sang mã servlet, nó được đặt trong phương thức service() của servlet. Đoạn mã sau là một JSP đơn giản, nó sử dụng một phần tử kịch bản để in câu “Hello Bob” ra trình duyệt client:Code: Chọn hết

<HTML> <BODY> <% out.println("Hello Bob"); %> </BODY></HTML>

Mặc dù mã kịch bản JSP có thể rất mạnh, nhưng soạn tất cả logic JSP bằng mã kịch bản có thể khiến ứng dụng của bạn khó quản lý. Vấn đề này dẫn đến sự ra đời của các thư viện thẻ tùy biến.

Cơ chế thụ lý lỗi của JSPGiống như các phương pháp phát triển khác, JSP cũng cần có một cơ chế đủ mạnh để thụ lý lỗi. Kiến trúc JSP cung cấp một giải pháp thông qua việc sử dụng các trang JSP được viết riêng để thụ lý lỗi.

Lỗi thường xảy ra nhất là lỗi thực thi (runtime error), chúng có thể phát sinh trong phần thân của trang JSP hoặc trong đối tượng nào đó được gọi từ phần thân của trang JSP. Các lỗi trong lúc yêu cầu, dẫn đến một biệt lệ bị ném, có thể được bắt và thụ lý trong phần thân của trang JSP, báo hiệu đã hết lỗi. Các biệt lệ không được thụ lý trong trang JSP sẽ chuyển yêu cầu của client, bao gồm biệt lệ chưa được bắt, đến một trang lỗi được chỉ định bởi trang JSP có lỗi.

Tạo một trang lỗi JSPTạo một trang lỗi JSP rất đơn giản: tạo một trang JSP thông thường rồi báo với bộ máy JSP rằng đó là một trang lỗi. Bạn thực hiện điều này bằng cách thiết lập đặc tính isErrorPage của chỉ thị page là true. Dưới đây là một trang lỗi:Ví dụ Tạo một trang lỗi JSP—errorpage.jspCode: Chọn hết

<html> <body> <%@ page isErrorPage="true" %> Error: <%= exception.getMessage() %> has been reported. </body></html>

Dòng mã JSP thứ nhất báo với bộ máy JSP rằng đây là trang lỗi.Code: Chọn hết

<%@ page isErrorPage="true" %>

Dòng mã JSP thứ hai sử dụng đối tượng ngầm exception để xuất thông điệp lỗi chứa trong biệt lệ bị ném.

Page 35: 19173552 Tim Hiu Java Struts

Sử dụng một trang lỗi JSPĐể xem một trang lỗi làm việc thế nào, chúng ta hãy tạo một trang JSP sao cho trang này ném một biệt lệ chưa được bắt. Trang JSP dưới đây sử dụng trang lỗi được tạo ở trên:

Ví dụ Sử dụng một trang lỗi JSP—testerror.jspCode: Chọn hết

<%@ page errorPage="errorpage.jsp" %>

<% if ( true ) { // Chỉ ném một biệt lệ throw new Exception("An uncaught Exception"); }%>

Dòng đầu tiên trong đoạn mã này thiết lập đặc tính errorPage của chỉ thị page là errorpage.jsp, đây là tên của trang lỗi. Phần mã còn lại ném một biệt lệ (biệt lệ này sẽ không được bắt).

Để xem ví dụ này hoạt động thế nào, chép các trang JSP vào thư mục <CATALINA_HOME>/ webapps/ch02/ và mở trình duyệt theo địa chỉ:

Code: Chọn hếthttp://localhost:8080/ch02/testerror.jsp

Bạn sẽ thấy trang tương tự như hình dưới

Hình: Kết quả của testerror.jsp

Page 36: 19173552 Tim Hiu Java Struts

Các đối tượng ngầm của JSPBạn có thể truy xuất ngầm đến các đối tượng sẵn dùng trong tất cả các tài liệu JSP. Các đối tượng này được phân tích bởi bộ máy JSP và được chèn vào servlet như thể do chính bạn định nghĩa.out

Đối tượng out đại diện cho một JspWriter (được dẫn xuất từ java.io.Writer), cung cấp một luồng chảy về client. Phương thức phổ biến nhất của đối tượng này là out.println(), dùng để in văn bản sẽ được hiển thị trong trình duyệt của client. Dưới đây là một ví dụ sử dụng đối tượng out:

Ví dụ Sử dụng đối tượng out—out.jspCode: Chọn hết

<%@ page errorPage="errorpage.jsp" %>

<html> <head> <title>Use Out</title> </head> <body> <% // In một thông điệp đơn giản bằng đối tượng out out.println("<center><b>Hello Reader!</b></center>"); %> </body></html>

Để thực thi ví dụ này, chép out.jsp vào thư mục <CATALINA_HOME>/webapps/ch02/ và mở trình duyệt theo địa chỉ:

Code: Chọn hếthttp://localhost:8080/ch02/out.jsp

Bạn sẽ thấy trang tương tự như hình dưới

Page 37: 19173552 Tim Hiu Java Struts

Hình Kết quả của out.jsp

requestĐối tượng request đại diện cho javax.servlet.http.HttpServletRequest, được kết hợp với mỗi yêu cầu HTTP. Đối tượng này thường được sử dụng để truy xuất các tham số của yêu cầu. Bạn có thể thực hiện điều này bằng cách gọi phương thức getParameter() với tên tham số cần tìm. Nó sẽ trả về chuỗi chứa giá trị của tham số đó. Dưới đây là một ví dụ sử dụng đối tượng request:

Ví dụ Sử dụng đối tượng request—request.jspCode: Chọn hết

<%@ page errorPage="errorpage.jsp" %>

<html> <head> <title>UseRequest</title> </head> <body> <% out.println("<b>Welcome: " + request.getParameter("user") + ''</b>"); %> </body></html>

Trang JSP này gọi phương thức request.getParameter(), truyền cho nó tham số user. Phương thức này tìm khóa user trong danh sách tham số và trả về giá trị nếu tìm thấy.

Để thực thi ví dụ này, chép request.jsp vào thư mục <CATALINA_HOME>/webapps/ch02/ và mở trình duyệt theo địa chỉ:

Page 38: 19173552 Tim Hiu Java Struts

Code: Chọn hếthttp://localhost:8080/ch02/request.jsp?user=Robert

Bạn sẽ thấy trang tương tự như hình dưới

Hình Kết quả của request.jsp

(còn tiếp)

Re: Tìm hiểu Java Struts

tuannq 23-04-2009, 00:24

responseĐối tượng response đại diện cho javax.servlet.http.HttpServletResponse, được sử dụng để truyền dữ liệu về client. Tuy vậy, API (giao diện lập trình ứng dụng JSP) đã cung cấp chức năng truy xuất luồng xuất với đối tượng out (đã được mô tả ở trên).

pageContextĐối tượng pageContext cung cấp chức năng truy xuất đến các không gian tên kết giao với một trang JSP. Nó cũng cho phép truy xuất đến các đối tượng ngầm JSP khác. Đối tượng pageContext thường được sử dụng để thiết lập và thu lấy các đối tượng (với phương thức setAttribute() và getAttribute()).

sessionĐối tượng session đại diện cho javax.servlet.http.HttpSession, được sử dụng để lưu trữ các đối tượng giữa các yêu cầu của client. Do vậy, nó cung cấp một dạng tương tác HTTP có trạng thái

Page 39: 19173552 Tim Hiu Java Struts

(stateful). Dưới đây là một ví dụ sử dụng đối tượng session:

Ví dụ Sử dụng đối tượng session—session.jspCode: Chọn hết

<%@ page errorPage="errorpage.jsp" %>

<html> <head> <title>Session Example</title> </head> <body> <% // Thu lấy đối tượng count từ HttpSession Integer count = (Integer)session.getAttribute("COUNT");

if ( count == null ) { // Nếu không tìm thấy đối tượng count thì tạo mới count = new Integer(1); // và đưa nó vào HttpSession session.setAttribute("COUNT", count); } else {

// Trái lại, tăng giá trị của count count = new Integer(count.intValue() + 1); session.setAttribute("COUNT", count); }

out.println("<b>You have accessed this page: " + count + " times.</b>"); %> </body></html>

Để xem ví dụ này hoạt động thế nào, chép session.jsp vào thư mục <CATALINA_HOME>/ch02/ và mở trình duyệt theo địa chỉ:

Code: Chọn hếthttp://localhost:8080/ch02/session.jsp

Nhắp vào nút Refresh vài lần để thấy biến count tăng dần. Hình dưới là kết quả của session.jsp.

Page 40: 19173552 Tim Hiu Java Struts

Hình Kết quả của session.jsp

applicationĐối tượng application đại diện cho javax.servlet.ServletContext (đã được thảo luận ở phần trước của chương này). Đối tượng này thường được sử dụng để truy xuất các đối tượng được lưu trữ trong ServletContext (được dùng chung giữa các thành phần Web ở tầm vực toàn cục). Đây là nơi tốt nhất để chia sẻ các đối tượng giữa các trang JSP và servlet.

configĐối tượng config giữ một tham chiếu đến ServletConfig, chứa thông tin cấu hình về bộ máy JSP/Servlet (trang JSP thuộc về một ứng dụng Web nằm trong bộ máy này).

pageĐối tượng page chứa một tham chiếu đến thể hiện hiện hành của trang JSP đang được truy xuất. Đối tượng page được sử dụng giống như đối tượng this—tham chiếu đến thể hiện hiện hành của servlet đại diện cho JSP này.

exceptionĐối tượng exception cho phép truy xuất đến một biệt lệ chưa được bắt (biệt lệ này bị ném bởi một trang JSP). Nó có hiệu lực chỉ trong các trang JSP với một trang trong đó có đặc tính isErrorPage là true.

Các hành động chuẩn của JSP

Các hành động chuẩn của JSP được định nghĩa trước trong các thẻ tùy biến. Có hai loại hành động chuẩn: loại thứ nhất liên quan đến chức năng JavaBean, loại thứ hai bao gồm tất cả các hành động chuẩn khác. Chúng ta sẽ định nghĩa và sử dụng mỗi loại trong các phần sau.

Page 41: 19173552 Tim Hiu Java Struts

Có ba hành động chuẩn liên quan đến việc sử dụng JavaBean: <jsp:useBean>, <jsp:setProperty>, và <jsp:getProperty>. Sau khi định nghĩa các thẻ này, chúng ta sẽ tạo một ví dụ đơn giản.

<jsp:useBean>

Hành động chuẩn <jsp:useBean> tạo ra hoặc tìm kiếm một thể hiện của JavaBean với ID và tầm vực cho trước. Bảng 2.4 mô tả các đặc tính của hành động <jsp:useBean>, và bảng 2.5 định nghĩa các giá trị tầm vực. Hành động <jsp:useBean> rất linh hoạt. Khi một hành động <jsp:useBean> xảy đến, nó sẽ tìm một đối tượng với ID và tầm vực như thế. Nếu không tìm thấy, nó sẽ tạo một đối tượng với ID đó và lưu đối tượng này vào tầm vực tương ứng. Cú pháp của hành động <jsp:useBean> như sau:Code: Chọn hết

<jsp:useBean id="name" scope="page|request|session|application" typeSpec>body</jsp:useBean>

typeSpec ::=class="className" | class="className" type="typeName" | type="typeName" class="className" | beanName="beanName" type="typeName" | type="typeName" beanName="beanName" | type="typeName"

Bảng Các đặc tính của hành động chuẩn <jsp:useBean>

id Khóa kết giao với một thể hiện của đối tượng trong tầm vực được chỉ định. Khóa này có phân biệt chữ hoa thường. Đặc tính id được sử dụng trong phương thức page.getAttribute().

scope Tầm vực của đối tượng được tham chiếu. Tầm vực này có thể là: page, request, session, hay application.

class Tên đầy đủ của lớp định nghĩa bản hiện thực của đối tượng. Tên lớp có phân biệt chữ hoa thường.

beanName Tên của JavaBean.

type Kiểu biến kịch bản được định nghĩa. Nếu đặc tính này không được chỉ định thì giá trị của nó giống như giá trị của đặc tính class.

Bảng Các giá trị tầm vực (scope) của hành động chuẩn <jsp:useBean>

page

Page 42: 19173552 Tim Hiu Java Struts

Các bean với tầm vực page chỉ được truy xuất trong trang mà chúng được tạo ra. Tất cả các tham chiếu đến một đối tượng với tầm vực page sẽ được giải phóng khi trang JSP hiện hành đã hoàn tất việc đánh giá.

request Các bean với tầm vực request chỉ được truy xuất trong các trang phục vụ cho yêu cầu mà đối tượng đã được tạo trong đó. Tất cả các tham chiếu đến đối tượng sẽ được giải phóng khi yêu cầu đã hoàn tất.

session Các bean với tầm vực session chỉ được truy xuất trong các trang đang xử lý các yêu cầu trong cùng một phiên làm việc. Tất cả các tham chiếu đến các bean với tầm vực session sẽ được giải phóng khi phiên làm việc của chúng hết hiệu lực.

application Các bean với tầm vực application chỉ được truy xuất trong các trang xử lý các yêu cầu trong cùng một ứng dụng Web. Tất cả các tham chiếu đến các bean với tầm vực application sẽ được giải phóng khi JSP/Servlet container bị đóng.

<jsp:setProperty>

Hành động chuẩn <jsp:setProperty> thiết lập giá trị cho một thuộc tính của bean. Đặc tính name của nó biểu diễn một đối tượng đã được định nghĩa trong tầm vực nào đó. Cú pháp của hành động <jsp:setProperty> như sau:Code: Chọn hết

<jsp:setProperty name="beanName" propexpr />

Trong cú pháp trên, đặc tính name biểu diễn tên của bean (bạn cần thiết lập thuộc tính của bean đó), và propexpr có thể là một trong các biểu thức sau:Code: Chọn hết

property="*" | property="propertyName" | property="propertyName" param="parameterName" | property="propertyName" value="propertyValue"

Bảng Các đặc tính của hành động chuẩn <jsp:setProperty>

name Tên của thể hiện bean được định nghĩa bởi một hành động <jsp:useBean> hay hành động nào đó khác.

property Thuộc tính mà bạn muốn thiết lập giá trị. Nếu bạn thiết lập propertyName là dấu * thì hành động sẽ duyệt qua các tham số của ServletRequest hiện hành, so trùng tên tham số (cùng kiểu

Page 43: 19173552 Tim Hiu Java Struts

giá trị) với tên thuộc tính (cùng kiểu phương thức thiết lập thuộc tính), và gán giá trị của tham số vào mỗi thuộc tính trùng khớp. Nếu một tham số có giá trị là chuỗi rỗng thì thuộc tính tương ứng sẽ giữ nguyên.

param Tên của tham số yêu cầu, giá trị của tham số này sẽ là giá trị của thuộc tính. Hành động <jsp:setProperty> không thể chứa đồng thời đặc tính param và value.

value Giá trị được gán cho thuộc tính.

<jsp:getProperty>

Hành động chuẩn cuối cùng liên quan đến việc tích hợp JavaBean vào JSP là <jsp:getProperty>. Nó lấy giá trị thuộc tính của thể hiện bean được tham chiếu, chuyển thành java.lang.String và đặt vào luồng xuất. Thể hiện bean phải được định nghĩa trong tầm vực nào đó trước khi hành động này có thể được sử dụng. Cú pháp của hành động <jsp:getProperty> như sau:Code: Chọn hết

<jsp:getProperty name="name" property="propertyName" />

Bảng mô tả các đặc tính của hành động <jsp:getProperty>.

name Tên của thể hiện bean được định nghĩa bởi một hành động <jsp:useBean> hay hành động nào đó khác.

property Thuộc tính mà bạn muốn lấy giá trị.

Một ví dụ về hành động chuẩn JavaBean

Để biết cách sử dụng các hành động chuẩn JavaBean, chúng ta sẽ tạo một ví dụ. Ví dụ này sử dụng một JavaBean đơn giản, đóng vai trò là một bộ đếm. Bean Counter có thuộc tính count (kiểu int) chứa số lần thuộc tính này được truy xuất. Bean này cũng có các phương thức lấy và thiết lập giá trị cho thuộc tính count. Dưới đây là mã nguồn của bean Counter:

Ví dụ Counter.javaCode: Chọn hết

package ch02;

public class Counter {

int count = 0;

public Counter() { }

Page 44: 19173552 Tim Hiu Java Struts

public int getCount() { count++; return count; }

public void setCount(int count) { this.count = count; }}

Chúng ta sẽ tích hợp JavaBean này vào một trang JSP bằng cách sử dụng các hành động chuẩn JavaBean. Dưới đây là trang JSP sử dụng bean Counter:

Ví dụ Trang JSP sử dụng bean Counter—counter.jspCode: Chọn hết

<%@ page language="java" %>

<HTML> <HEAD> <TITLE>Bean Example</TITLE> </HEAD> <BODY> <!-- Tạo một thể hiện của Counter với id là "counter" --> <jsp:useBean id="counter" scope="session" class="ch02.Counter" /> <% // Xuất giá trị hiện tại của thuộc tính count out.println("Count from scriptlet code : " + counter.getCount() + "<BR>"); %> <!-- Thu lấy thuộc tính count của bean, --> <!-- sử dụng hành động jsp:getProperty --> Count from jsp:getProperty : <jsp:getProperty name="counter" property="count" /><BR> </BODY></HTML>

Trang counter.jsp có bốn thành phần JSP. Thành phần thứ nhất báo với JSP container rằng ngôn ngữ kịch bản là Java:Code: Chọn hết

<%@ page language="java" %>

Bước tiếp theo sử dụng hành động chuẩn <jsp:useBean> để tạo một thể hiện của lớp Counter với tầm vực là session và ID là counter. Giờ đây, bạn có thể tham chiếu bean này bằng tên counter trong suốt phần còn lại của trang JSP. Dòng mã tạo bean như sau:Code: Chọn hết

<jsp:useBean id="counter" scope="session" class="ch02.Counter" />

Page 45: 19173552 Tim Hiu Java Struts

Hai hành động cuối cùng trình bày cách lấy giá trị hiện hành của một thuộc tính. Hành động thứ nhất sử dụng một đoạn kịch bản để truy xuất thuộc tính. Nó truy xuất bean thông qua ID (counter) và gọi phương thức getCount(). Đoạn kịch bản như sau:Code: Chọn hết

<% // Xuất giá trị hiện tại của thuộc tính count out.println("Count from scriptlet code : " + counter.getCount() + "<BR>");%>

Hành động thứ hai sử dụng hành động chuẩn <jsp:getProperty> với ID của bean và thuộc tính cần được truy xuất. Hành động này sẽ gọi phương thức truy xuất thích hợp và nhúng kết quả vào trang HTML:Code: Chọn hết

<!-- Thu lấy thuộc tính count của bean --><!-- sử dụng hành động jsp:getProperty -->Count from jsp:getProperty :<jsp:getProperty name="counter" property="count" /><BR>

Khi bạn thực thi counter.jsp, tham chiếu thứ hai đến thuộc tính count cho kết quả lớn hơn 1 so với tham chiếu thứ nhất. Đó là vì cả hai đều truy xuất đến thuộc tính count, khiến phương thức getCount() được gọi, và phương thức này làm tăng giá trị của count.

Để xem trang JSP này hoạt động thế nào, bạn hãy biên dịch lớp Counter, chuyển nó vào thư mục <CATALINA_HOME>/ch02/WEB-INF/classes/ch02/, và chép file counter.jsp vào thư mục <CATALINA_HOME>/ch02/. Sau đó, mở trình duyệt theo địa chỉ:

Code: Chọn hếthttp://localhost:8080/ch02/counter.jsp

Bạn sẽ thấy trang tương tự như hình dưới

Hình Kết quả của counter.jsp

(Còn tiếp)

Re: Tìm hiểu Java Struts

tuannq 09-06-2009, 16:21

Các hành động chuẩn còn lại được sử dụng cho các tác vụ chung, từ hành động tham số đến hành động plug-in. Các hành động này sẽ được mô tả trong các phần tiếp theo.<jsp:param>

Page 46: 19173552 Tim Hiu Java Struts

Hành động <jsp:param> cung cấp tham số và giá trị cho các hành động JSP chuẩn: <jsp:include>, <jsp:forward>, và <jsp:plugin>. Cú pháp của hành động <jsp:param> như sau:Code: Chọn hết

<jsp:param name="name" value="value"/>

Bảng mô tả các đặc tính của hành động <jsp:param>.name Tên của tham số đang được tham chiếu.

value Giá trị của tham số.

<jsp:include>Hành động chuẩn <jsp:include> cung cấp một phương cách đưa thêm các thành phần Web tĩnh và động vào trang JSP. Cú pháp của hành động <jsp:include> như sau:Code: Chọn hết

<jsp:include page="urlSpec" flush="true"> <jsp:param ... /></jsp:include>

Bảng Các đặc tính của hành động <jsp:include>page URL tương đối của tài nguyên được đưa vào.flush Một giá trị kiểu Boolean, cho biết vùng đệm (buffer) có được flush hay không.

Một điều quan trọng cần lưu tâm là sự khác biệt giữa chỉ thị include và hành động chuẩn <jsp:include>. Chỉ thị include chỉ được đánh giá một lần duy nhất lúc dịch, trong khi hành động chuẩn <jsp:include> được đánh giá với mọi yêu cầu.

Dưới đây là một ví dụ về hành động chuẩn <jsp:include>:

Ví dụ include.jspCode: Chọn hết

<html> <head> <title>Include Example</title> </head> <body> <table width="100%" cellspacing="0"> <tr> <td align="left"> <jsp:include page="header.jsp" flush="true"> <jsp:param name="user" value='<%= request.getParameter("user") %>' /> </jsp:include> </td>

Page 47: 19173552 Tim Hiu Java Struts

</tr> </table> </body></html>

Ví dụ header.jspCode: Chọn hết

<% out.println("<b>Welcome: </b>" + request.getParameter("user"));%>

Hành động <jsp:include> trong trang include.jsp sẽ đưa kết quả của việc đánh giá header.jsp vào include.jsp. Trang header.jsp tìm một tham số với tên là user và in ra lời chào.

Để xem ví dụ này hoạt động thế này, bạn hãy chép hai file JSP trên vào thư mục <CATALINA_HOME>/webapps/ch02/ và mở trình duyệt theo địa chỉ:http://localhost:8080/ch02/include.jsp?user=Bob

Bạn sẽ thấy trang tương tự như hình dưới

Kết quả của include.jsp

<jsp:forward>Hành động chuẩn <jsp:forward> cho phép bộ máy JSP gửi yêu cầu hiện hành đến một tài nguyên khác đang tồn tại trong ứng dụng Web hiện hành, bao gồm các tài nguyên tĩnh, servlet, hay JSP. Sự hiện diện của <jsp:forward> thực sự chấm dứt quá trình thực thi của trang JSP hiện hành.

Một hành động <jsp:forward> có thể chứa các đặc tính con <jsp:param>. Các đặc tính con này đóng vai trò là các tham số được chuyển đến tài nguyên đích.

Page 48: 19173552 Tim Hiu Java Struts

Cú pháp của hành động <jsp:forward> như sau:Code: Chọn hết

<jsp:forward page="relativeURL"> <jsp:param .../></jsp:forward>

Bảng mô tả đặc tính của hành động <jsp:forward>.page URL tương đối của tài nguyên đích.

Ví dụ dưới là một trang JSP sử dụng hành động <jsp:forward>. Ví dụ này kiểm tra một tham số yêu cầu và chuyển yêu cầu đến một trong hai trang JSP khác dựa vào giá trị của tham số.

Ví dụ forward.jspCode: Chọn hết

<html> <head> <title>JSP Forward Example</title> </head> <body> <% if ( (request.getParameter("role")).equals("manager") ) { %> <jsp:forward page="management.jsp" /> <% } else { %> <jsp:forward page="welcome.jsp"> <jsp:param name="user" value='<%=request.getParameter("user") %>' /> </jsp:forward> <% } %> </body></html>

Trang forward.jsp kiểm tra tham số role và chuyển yêu cầu, cùng các tham số yêu cầu, đến trang JSP phù hợp dựa vào giá trị này. 2 ví dụ dưới là các tài nguyên đích.

Ví dụ welcome.jsp Code: Chọn hết

<!-- Thiết lập ngôn ngữ kịch bản là Java --><%@ page language="java" %>

<HTML> <HEAD>

Page 49: 19173552 Tim Hiu Java Struts

<TITLE>Welcome Home</TITLE> </HEAD> <BODY> <table> <tr> <td> Welcome User: <%= request.getParameter("user") %> </td> </tr> </table> ...

Ví dụ management.jspCode: Chọn hết

<!-- Thiết lập ngôn ngữ kịch bản là Java --><%@ page language="java" %>

<HTML> <HEAD> <TITLE>Management Console</TITLE> </HEAD> <BODY> <table> <tr> <td> Welcome Manager: <%= request.getParameter("user") %> </td> </tr> </table> ...

Để xem kết quả, bạn chép ba file JSP trên vào thư mục <CATALINA_HOME>/webapps/ch02/ và mở trình duyệt theo địa chỉ:http://localhost:8080/ch02/forward.jsp? ... r&user=Bob

Bạn sẽ thấy kết quả tương tự hình dưới.

Page 50: 19173552 Tim Hiu Java Struts

Kết quả của forward.jsp

Bạn cũng có thể đổi giá trị của tham số role là manager để đổi trang đích.

<jsp:plugin>Hành động chuẩn cuối cùng mà chúng ta thảo luận là <jsp:plugin>. Hành động này cho phép bạn sinh mã HTML cần thiết, sử dụng các cấu trúc độc-lập-trình-duyệt phù hợp, dẫn đến việc thực thi thành phần JavaBean hay applet được chỉ định.

Khi đã được đánh giá, thẻ <jsp:plugin> được thay bằng thẻ <object> hay thẻ <embed>. Các đặc tính của hành động <jsp:plugin> cung cấp dữ liệu cấu hình cho việc trình bày phần tử được nhúng. Cú pháp của hành động <jsp:plugin> như sau:Code: Chọn hết

<jsp:plugin type="pluginType" code="classFile" codebase="relativeURLpath"> <jsp:params> ... </jsp:params></jsp:plugin>

Thẻ <jsp:params> được sử dụng để cung cấp tham số cho plug-in.

Các đặc tính của hành động <jsp:plugin>type Loại plug-in thêm vào (applet chẳng hạn).code Tên lớp sẽ được thực thi bởi plug-in.codebase Đường dẫn mà đặc tính code có thể được tìm thấy ở đó.