Đồ án Phân tích thiết kế chương trình quản lý công việc trên web

Xuất phát từ nhu cầu thực tế trong quản lý công việc ở cac công ty hiện nay còn nhiều nhược điểm, việc người quản lý ở cấp càng cao càng không nắm bắt thông tin, không trực tiếp quản lý được tốc độ làm việc của nhân viên mình là khá phổ biến. Hơn nữa trong thời buổi kinh tế thị trường thời buổi của công nghệ thông tin mỗi con người có quá nhiều công việc phải làm, họ không có thời gian rảnh rỗi để ngồi làm báo cáo rồi cuối tuần đem nộp cho quản lý, họ muốn được ở nhà nhưng vẫn biết công việc của mình phải làm trong ngày là gì?, họ muốn có một khoảng thời gian dù ít ỏi để tranh thủ nghỉ ngơi.

Để một phần nào tháo gỡ các khó khăn, nhược điểm và xuất phát từ các yêu cầu thực tế của một số công ty chương trình QUẢN LÝ CÔNG VIỆC TRÊN WEB đã được ra đời. Trong khuôn khổ của một đồ tốt nghiệp đại học do thời gian, các kiến thức nhất là về chuyên môn nghiệp vụ còn hạn chế chắc chắn không tránh khỏi những sai sót. Song với sự nổ lực hết sức nhằm hoàn thành tốt công việc nhưng do thời gian nghiên cứu thực hiện không nhiều, lượng công việc tương đối lớn, trang thiết bị, tài liệu chưa đầy đủ và trình độ hạn chế cho nên chắc chắn đề tài này sẽ có ít nhiều khiếm khuyết từ thực tế đến ý tưởng lập trình, mong được sự lượng thứ và chỉ bảo thêm của các Thầy, Cô.

 

doc92 trang | Chia sẻ: maiphuongdc | Lượt xem: 1719 | Lượt tải: 4download
Bạn đang xem trước 20 trang tài liệu Đồ án Phân tích thiết kế chương trình quản lý công việc trên web, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ean phải có một hàm tạo không có tham số. Bean không nên có bất kỳ biến thể hiện (field) nào là ‘public’. Các giá trị bền vững nên được truy cập thông qua các phương thức gọi là getXxx và setXxx. Đối với các server-side Bean không nên dùng thư viện đồ hoạ. JSP sử dụng Beans. Các JSP element dùng cho Bean. jsp:useBean element Cho phép chúng ta tải một Bean với tên và phạm vi xác định vào trang JSP. Cú pháp: Nếu không có body, tức là không có tag nào trong thân của jsp:useBean thì có cú pháp là empty tag. TypeSpec có thể hoặc (|) trong các thuộc tính sau: TypeSpec ::= class = “className” | class = “className” type = “typeName” | type = “typeName” class = “className” | beanName = “beanName” type = “typeName” | type = “typeName” beanName = “beanName” | type = “typeName” Các giá trị của thuộc tính scope: page Đây là giá trị mặc định của scope. Bean với giá trị này sẽ có sẵn từ javax.servlet.jsp.PageContext trong trang hiện hành. Bean sẽ được loại bỏ khi một response gởi trở về client hoặc request được chuyển tới một trang mới. request Bean có giá trị này thì có sẵn từ đối tượng ServletRequest của trang hiện hành và bất kỳ trang được include hay forward nào bằng cách sử dụng phương thức getAttribute(name). Bean sẽ bị huỷ bỏ khi một response gởi trở về client. session Bean được sử dụng trong bất kỳ trang nào có tham gia vào một session của client. Có phạm vi trong cả một session của client. Bean này được lưu trữ trong đối tượng HttpSession. application Bean được sử dụng trong bất kỳ trang nào trong ứng dụng hiện hành (cả request hiện tại và tương lai). jsp:setProperty element Gán một giá trị hoặc nhiều giá trị (thuộc tính mảng) của thuộc tính vào Bean. Cú pháp: options có thể hoặc (|) trong các thuộc tính sau: options::=property =“*” | property =“propertyName” | property =“propertyName” param =“paraName” | property =“propertyName” value =“{ | string}” jsp:getProperty element Lấy giá trị của thuộc tính Bean để hiển thị giá trị này trong trang kết quả. Cú pháp: Phương pháp chuyển kiểu tự động JSP ĩ Bean Các thuộc tính của một thành phần JSP thì không giới hạn giá trị chuổi (string) nhưng rất quan trọng để hiểu rằng tất cả giá trị của thuộc tính được truy cập qua tag sẽ được chuyển thành kiểu chuổi. Tuy nhiên, phương thức getter không cần trả về kiểu String một cách tường minh vì JSP container sẽ tự động chuyển giá trị trả về này thành kiểu String nếu cần thiết. Đối với các kiểu dữ liệu cơ bản của Java, sự chuyển đổi được thể hiện trong bảng sau: Property Type Conversion to String boolean Java.lang.Boolean.toString(boolean) byte Java.lang.Byte.toString(byte) char Java.lang.Character.toString(char) double Java.lang.Double.toString(double) int Java.lang.Integer.toString(int) float Java.lang.Float.toString(float) long Java.lang.Long.toString(long) Tương tự, tất cả phương thức setter của thuộc tính được truy cập với tag sẽ được tự động chuyển từ String sang một kiểu gốc thích hợp bởi JSP container. Điều này được thực hiện qua các phương thức của các lớp vỏ bọc Java. Property Type Conversion from String boolean or Boolean java.lang.Boolean.valueOf(string) byte or Byte java.lang.Byte.valueOf(string) char or Character java.lang.Character.valueOf(string) double or Double java.lang.Double.valueOf(string) int or Integer java.lang.Integer.valueOf(string) float or Float java.lang.Float.valueOf(string) long or Long java.lang.Long.valueOf(string) Tìm hiểu cách INTROSPECTOR làm việc. Introspector là gì? Introspector là bộ phân tích mà qua đó Java xem xét các đoạn mã của chương trình để tìm ra những phương thức dùng để xây dựng và áp dụng cho từng thuộc tính cũng như tình huống cụ thể. Chúng ta không cần quan tâm đến các khai báo phức tạp khác. Ví dụ thiết lập hai phương thức sau: public void setAge(int age) public int getAge() Theo cách này Bean container sẽ hiểu là chương trình muốn tạo ra thuộc tính là age có kiểu int – Bean container sẽ chuyển các thuộc tính theo quy tắc: FoorBar à foorBar Z à z URL à URL Thiết kế các phương thức mẫu dùng cho thuộc tính. Đối với thuộc tính mang những trị đơn, hai phương thức getter và setter được viết theo mẫu sau (với getter và setter xem 4.Thuộc tính của Bean): public void setAttributeName(AttributeType param) public AttributeType getAttributeName() Đối với thuộc tính mang những trị kiểu boolean, phương thức getter được dùng với tiếp đầu ngữ là is thay cho get: public void setAttributeName(AttributeType param) public boolean isAttributeName() Đối với thuộc tính gồm nhiều phần tử (index attribute) các phương thức getter và setter cũng được thiết lập tương tự. Chúng ta có thể sử dụng một cặp phương thức hay cả hai cặp phương thức cũng được. public void setAttributeName(int index, AttributeType value) public AttributeType getAttributeName() và/hoặc public void setAttributeName(AttributeType[] value) public AttributeType[] getAttributeName() Khai báo các phương thức một các tường minh. Nếu không muốn bộ phân tích Introspector ngầm định, chúng ta có thể khai báo và xử lý các phương thức một cách tường minh nhờ vào một lớp phụ dùng để mô tả các phương thức được gọi là BeanInfo. Khi Beans có tên là xxx được biên dịch, trước tiên Bean container sẽ đi tìm lớp có tên là xxxBeanInfo. Nếu lớp này tồn tại, các thông tin trong lớp xxxBeanInfo sẽ được xử lý trước và áp dụng cho các phương thức được tìm thấy. Các phương thức không được mô tả trong xxxBeanInfo sẽ được áp dụng cách phân tích kiểu Introspector mặc định. Xem thêm III. Các giao tiếp bổ trợ cho Bean. Thuộc tính của Bean. Các phương thức truy xuất. Thuộc tính thật ra chỉ là những biến nằm trong một lớp, tuy nhiên những biến này không nên sử dụng trực tiếp mà nên thông qua các phương thức để truy xuất chúng. Thông thường biến được dùng vào hai mục đích đó là gán dữ liệu và lấy dữ liệu ra để tính toán. Java đưa ra hai loại phương thức để đáp ứng cho nhu cầu truy xuất biến đó là các phương thức getter mang ý nghĩa đọc dữ liệu từ biến và các phương thức setter mang ý nghĩa gán dữ liệu cho biến. Các loại thuộc tính. Chúng ta hãy xem các ví dụ sau: Thuộc tính mang những giá trị đơn. Bean sau đây lấy thời gian của hệ thống. Code 15: Java file package com.legiang.bean; import java .util.*; public class CurrentTimeBean { /*Data members*/ private int hours; private int minutes; /* Methods */ Code 15: Java file (tiếp theo) public CurrentTimeBean() { Date now = new Date(); this.hours = now.getHours(); this.minutes = now.getMinutes(); } public int getHours() { return hours; } public int getMinutes() { return minutes(); } } Code 16: JSP file <jsp:useBean id="time" class="com.legiang.bean.CurrentTimeBean"/> It is now minutes past the hour. Thuộc tính mang giá trị boolean. Code 17: Java file package com.legiang.bean; public class LogicBean { /*Data members*/ private boolean authorized; /*Methods*/ public LogicBean() { this.authorized = false; } public void setAuthorized(boolean authorized) { this.authorized = authorized; } public boolean isAuthorized() { Code 17: Java file (tiếp theo) return authorized; } } Code 18: JSP file <jsp:useBean id="logic" class="com.legiang.bean.LogicBean"/> Do you authorize? Answer: Thuộc tính mang giá trị mảng. Ví dụ này sẽ xây dựng một component mà có thể thực hiện các tính toán tĩnh trên một dãy số. Code 19: Java file package com.legiang.bean; import java.util.*; public class StatBean { /*Data members*/ private double[] numbers; /*Methods*/ public StatBean() { numbers = new double[0]; } public double getAverage() { double sum = this.getSum(); if (sum == 0) return 0; else return sum/numbers.length; } public double getSum() { Code 19: Java file (tiếp theo) double sum = 0; for (int i=0; i < numbers.length; i++) sum += numbers[i]; return sum; } public double[] getNumbers() { return numbers; } public double getNumbers(int index) { return numbers[index]; } public void setNumbers(double[] numbers) { this.numbers = numbers; } public void setNumbers(int index, double value) { numbers[index] = value; } public int getNumbersSize() { return numbers.length; } } Code 20: JSP file <% double[] mynums = {100, 250, 150, 50, 450}; stat.setNumbers(mynums); %> The average of <% double[] numbers = stat.getNumbers(); for (int i=0; i < numbers.length; i++) { if (i != numbers.length) out.print(numbers[i] + ","); else Code 20: Java file (tiếp theo) out.println("" + numbers[i]); } %> is equal to Ngoài các loại thuộc tính trên, Java còn cung cấp một số thuộc tính nâng cao khác dùng cho các Bean đồ hoạ. Các giao tiếp bổ trợ cho Bean. Trong khi điều này không phải là yêu cầu đặc biệt thì có một số giao tiếp cho phép chúng ta cài đặt vào Beans. Các giao tiếp này có thể được dùng để mở rộng tính năng các Bean của chúng ta đối với các tình huống khác nhau. Giao tiếp BeanInfo Chúng ta đã biết về cơ chế tương phản (reflection) trong mục trước, nhưng có phương pháp khác mà một lớp Bean có thể báo cho Bean container (như JSP container) biết về các thuộc tính của nó bằng cách cài đặt giao tiếp BeanInfo. Giao tiếp BeanInfo cho phép chúng ta tạo ra một lớp đồng hành với Bean của chúng ta mà định nghĩa các thuộc tính và các cấp độ truy cập của nó. Giao tiếp có thể được dùng để thích ứng với các lớp Java đã có đối với việc sử dụng của Bean mà không cần thay đổi giao tiếp đã tạo. Nó cũng được sử dụng để che dấu các thuộc tính nào được truy cập thường xuyên từ client, vì thỉnh thoảng cơ chế reflection chuẩn của Java có thể phơi bày nhiều thông tin mà chúng ta lại không muốn như thế. Để tạo lớp BeanInfo chúng ta chỉ cần đặt tên lớp cùng với tiếp vị ngữ BeanInfo (như SimpleBeanBeanInfo) và cài đặt giao tiếp java.beans.BeanInfo. Quy tắc đặt tên này là cách báo cho Bean container (như JSP container) biết để xác định lớp BeanInfo thích hợp cho Bean chúng ta. Giao tiếp Serializable JavaBeans sau khi được thiết kế và đem vào sử dụng người dùng sẽ tuỳ ý thay đổi các thuộc tính mà Bean cung cấp. Tuy nhiên khi chấm dứt chương trình thì các thuộc tính này cũng mất đi. Lần sau khi dùng các thuộc tính này phải được khởi tạo và đặt lại giá trị mới. Như vậy chu trình sống của Bean chỉ hạn hẹp trong quá trình hoạt động của chương trình, không sử dụng lại sau này được. Java cung cấp một khả năng lưu lại các đối tượng JavaBeans lên đĩa bằng cơ chế Serializable. Khi một đối tượng hay Bean được lưu xuống tập tin nhị phân thì tất cả biến hay các đối tượng con nằm bên trong lớp cha đều được lưu theo. Một số server hổ trợ cơ chế persistent session bằng cách ghi bất kỳ dữ liệu nào của session vào đĩa giữa các lần server ngừng hoạt động. Khi server hoạt đông trở lại thì dữ liệu được serialization được phục hồi trở lại. Một nguyên nhân tương tự đưa vào các server để hổ trợ cho việc nhóm các session lại trong các môi trường truyền thông chậm chạp (do hoạt động nhiều, ...). Nhiều server sử dụng cơ chế serialization để sao lặp dữ liệu của session giữa các web server trong nhóm. Nếu Beans của chúng ta không cài đặt giao tiếp Serializable thì server không thể lưu trữ hoặc chuyển Beans của chúng ta trong các tình huống này. Giao tiếp HttpSessionBindingListener Việc cài đặt giao tiếp HttpSessionBindingListener của Servlet API trong Beans chúng ta sẽ cho phép các thể hiện nhận được thông báo của các sự kiện session. Giao tiếp này khá đơn giản, chỉ cần định nghĩa hai phương thức: public void valueBound(HttpSessionBindingListener event) public void valueUnBound(HttpSessionBindingListener event) Phương thức valueBound() được gọi khi Bean được lưu trữ trong session của người dùng. Trong trường hợp của JSP, điều này sẽ thường xảy ra ngay khi Bean được khởi tạo bởi tag mà có xác định phạm vi “session” trong thuộc tính scope. Phương thức valueUnBound() được gọi khi đối tượng bị xoá khỏi session. Có vài tình huống làm cho Bean của chúng ta sẽ bị xoá khỏi session. Khi JSP container dự định chấm dứt một session của người dùng vì hoạt động kém, trước tiên JSP container xoá từng mục dữ liệu trong session, rồi kích hoạt valueUnBound(). Thứ hai, Sự kiện này sẽ được kích hoạt nếu servlet, scriptlet, hay đoạn mã Java nào đó xoá bỏ Bean khỏi session vì một số lý nguyên nhân. Mỗi sự kiện kết hợp với giao tiếp HttpSessionBindingListener thì có thể sử dụng để đạt được sự truy cập vào đối tượng session. Việc cài đặt giao tiếp này sẽ cho phép chúng ta tác động trở lại các sự kiện của session. Ví dụ đóng các nối kết không cần thiết, tạo các giao tác hoặc thực hiện các hoạt động bảo trì khác. Chương III : TAG LIBRARIES Tag library là gì ? Trong kỹ thuật JavaServer Pages, các action là các element có thể tạo ra và truy cập vào các đối tượng của ngôn ngữ lập trình và xuất vào những luồng xuất chuẩn như màn hình, máy in,… JSP định nghĩa ra chín action chuẩn mà phải được cung cấp bởi bất kỳ engine nào. Ngoài các action chuẩn này , từ JSP v1.1 trở lên cho phép xây dựng và phát triển các module có thể dùng lại được gọi là custom action. Trong trang JSP, một custom action được triệu gọi bằng cách dùng custom tag . Một tag library là một tập các custom tag. Các ứng dụng có thể được thực hiện bằng custom action bao gồm xử lý form, truy cập cơ sở dữ liệu và các dịch vụ ở mức xí nghiệp khác như email, quản lý thư mục và điều khiển luồng. Trước khi custom action xuất hiện thì JSP có một cơ chế dùng lại mã là các thành phần JavaBean kết hợp với scriplet. Tuy nhiên với JavaBean có một bất lợi là xây dựng phức tạp và khó quản lý. Các custom action làm dịu được vấn đề này bằng cách mang lại các lợi ích dưới góc độ khác của việc module hoá tính sử dụng lại cho các trang JSP. Các custom action gói gọn lại các tác vụ để chúng có thể được dùng lại trong hơn một ứng dụng và tăng hiệu xuất bằng cách khuyến khích phân chia công việc giữa các nhà phát triển thư viện và người sử dụng thư viện. Các tag library của JSP được tạo bởi các nhà phát triển, là người thành thạo ngôn ngữ lập trình Java và là chuyên gia trong giao tiếp với cơ sở dữ liệu và các dịch vụ khác. Các tag library được dùng bởi các nhà thiết kế ứng dụng web, là người có thể chỉ tập trung vào cách thức hiển thị hơn là quan tâm đến cách truy cập cơ sở dữ liệu và các dịch vụ khác. Một số đặt tính của các custom tag là: Chúng có thể được tuỳ biến thông qua các thuộc tính từ một trang đang gọi. Chúng được phép truy cập vào tất cả đối tượng có sẵn trong trang JSP. Chúng có thể thay đổi lời đáp mà được phát sinh bởi một trang đang gọi. Chúng có thể được lồng với nhau và cho phép các tương tác phức tạp trong một trang. Chúng có thể truyền thông với nhau. Chúng ta có thể tạo và khởi tạo một thành phần JavaBean, tạo một biến tham chiếu đến Bean đó trong một tag và sau đó sử dụng Bean này trong tag khác. Cách dùng các tags trong JSP. Phần này trình bày cách thức mà tác giả của trang web sử dụng tag library trong JSP và giới thiệu các loại tag khác nhau. Các ví dụ trong phần này sẽ được định nghĩa trong phần III. Khai báo các tag library. Trang JSP sẽ sử dụng các tag được định nghĩa trong một tag library bằng cách đưa vào taglib directive trong trang trước bất kỳ custom tag được sử dụng: Thuộc tính uri tham chiếu tới URI đó là định danh duy nhất cho tag library. URI có thể là URI tương đối hay tuyệt đối. Nếu URI tương đối thì nó phải được ánh xạ đến một URI tuyệt đối trong taglib element của bộ mô tả triển khai ứng dụng Web, tập tin cấu hình này cùng với ứng dụng Web được phát triển theo bản đặt tả Java Servlet và JavaServer Pages. Thuộc tính prefix định nghĩa một tiếp đầu ngữ để phân biệt với các tag library khác, do đó thuộc tính này giải quyết được vấn đề xung đột về các tên tag. Các loại tag. Những custom action được diễn đạt bằng cú pháp XML. Chúng có start tag, nội dung và end tag: body Một tag mà không có nội dung được biểu diễn như sau: Các tag đơn giản. Một tag đơn giản sau triệu gọi một action và xuất ra lời chào “Hello World.”. Các tag có thuộc tính. Một start tag của custom action có thể chứa các thuộc tính dưới dạng attr = ‘value’. Các thuộc tính này tuỳ biến các tham số dùng trong các phương thức của một lớp java. Các thuộc tính có thể được gán một hay nhiều tham số trong một đối tượng request hoặc từ một hằng chuổi. Chỉ có các kiểu thuộc tính trong bảng sau mới có thể được gán từ các giá trị tham số của request và của các hằng chuổi Kiểu thuộc tính Phương thức valueOf chuyển chuổi boolean or Boolean java.lang.Boolean.valueOf(String) byte or Byte java.lang.Byte.valueOf(String) char or Character java.lang.Character.valueOf(String) double or Double java.lang.Double.valueOf(String) int or Integer java.lang.Integer.valueOf(String) float or Float java.lang.Float.valueOf(String) long or Long java.lang.Long.valueOf(String) Giá trị thuộc tính có dạng được tính vào thời gian yêu cầu. Giá trị của biểu thức tuỳ thuộc vào kiểu thuộc tính được xác định trong đối tượng cài đặt tag còn gọi là tag handler (tag handler trong phần định nghĩa các tag). Các tag có nội dung. Tag có thể bao hàm các custom tag, scripting element, HTML, và nội dung nằm giữa start tag và end tag. Trong ví dụ sau sẽ đưa ra thông tin “lời chào” được cung cấp trong thân tag thay vì trong thuộc tính của nó. DHBK Ha Noi Các tag định nghĩa các biến kịch bản. Một tag có thể định nghĩa ra một biến mà biến này được dùng trong cùng một trang. Ví dụ sau đây minh hoạ cách thức định nghĩa và sử dụng một biến chứa một đối tượng được trả về. Kết hợp các tag. Các tag kết hợp với nhau bằng các phương pháp của các đối tượng dùng chung. Trong ví dụ sau, tag1 tạo một đối tượng có tên là obj1, sau đó được sử dụng lại bởi tag2. Qui tắc này được khuyến khích bởi bảng đặt tả JSP, một tag tạo ra một tên với thuộc tính id và tag thứ hai có thuộc tính name để dùng lại tên này. Trong ví dụ kết tiếp, dùng các tag lồng nhau tương tự như trong XML và HTML. Định nghĩa các tag. Để sử dụng các custom tag trong trang JSP, chúng ta cần phải định nghĩa ba thành phần riêng biệt: Phát triển tag handler và các lớp trợ giúp cho tag. Khai báo tag trong bộ mô tả thư viện tag (tag library descriptor) dưới dạng tập tin XML. Tạo tập tin JSP có sử dụng custom tag. Phần này mô tả các thuộc tính của tag handler và các bộ mô tả thư viện tag, cũng trình bày cách phát triển tag handler và các element của bộ mô tả thư viện đối với mỗi loại tag được giới thiệu trong phần trước. Tag handler. Tag handler là một đối tượng được gọi lên bởi JSP container để định trị cho custom tag trong xuốt quá trình thực thi của trang JSP có tham chiếu tới một tag nào đó. Các phương thức của tag handler được gọi bởi lớp cài đặt trang JSP vào các thời điểm khác nhau trong xuốt quá trình định trị cho tag. Khi gặp start tag của custom tag thì lớp cài đặt trang JSP gọi các phương thức để khởi tạo các giá trị thích hợp và sau đó triệu gọi phương thức doStartTag. Khi gặp end tag của custom tag thì phương thức doEndtag được gọi. Tuỳ theo mục đích của từng custom tag mà chúng ta xử lý các phương thức thích hợp trong từng giao tiếp cài đặt. Bảng sau mô tả các loại tag có các phương thức tương ứng để xử lý. Loại tag handler Các phương thức cần xử lý Simple doStartTag, doEndTag, release Attributes doStartTag, doEndTag, set/getAttribute1...N Body, No Interaction doStartTag, doEndTag, release Body, Interaction doStartTag, doEndTag, release, doInitBody, doAfterBody Tag handler có sự truy cập vào API mà cho phép nó truyền thông với trang JSP. Con đường vào API này là đối tượng pageContext, qua đó tag handler có thể truy cập vào mọi đối tượng ngầm định khác như request, session, application từ trang JSP. Các đối tượng ngầm định có thể có các thuộc tính kết hợp với chúng. Các thuộc tính như thế được truy cập qua các phương thức [get/set]Attribute thích hợp. Nếu tag được lồng nhau thì tag handler cũng có thể truy cập handler này (được gọi là parent) cùng với toàn bộ tag. Các tag handler phải được cài đặt hai giao tiếp hoặc Tag hoặc BodyTag. Các giao tiếp có thể được dùng để lấy đối tượng Java đã tồn tại và tạo ra một tag handler. Để định nghĩa các tag handler mới chúng ta có thể dùng các lớp TagSupport và BodyTagSupport như là các lớp cơ sở (xem III. 4. Tag handler được triệu gọi như thế nào?). Tag library descriptor. Tag library descriptor (TLD) là một tài liệu XML dùng để mô tả thư viện tag. Một TLD chứa toàn bộ thông tin về thư viện và mỗi tag chứa trong thư viện. JSP container và các công cụ phát triển JSP sử dụng TLD để xác định các tag. Các element của TLD sau dùng để định nghĩa thư viện tag: Code 21: HelloWorldTag.java <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library1.1//EN" ""> ... ... Tag element yêu cầu đối với mọi tag để xác định một lớp có trong thư viện tag. classname ... Các ví dụ. Để tạo các custom tag chúng ta cần hai import gói cơ bản: import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; // tag extension Các tag đơn giản. Tag handler Đối với các tag đơn giản chỉ cần cài đặt hai phương thức của giao tiếp Tag là doStartTag và doEndTag. doStartTag được triệu gọi khi JSP container gặp start tag, nó trả về SKIP_BODY vì thân tag chẳng có nội dung nào cả. Ngược lại khi gặp end tag thì JSP container gọi doEndTag, trả về EVAL_PAGE nếu phần còn lại của trang cần phải định trị, nếu không trả về SKIP_PAGE. Lớp tag handler sẽ được cài đặt như sau: Code 22: HelloWorldTag.java public HelloWorldTag extends TagSupport { public int doStartTag() throws JspException { try { pageContext.getOut().print("Hello World."); } catch (Exception ex) { throw new JspTagException("HelloWorldTag: " + e.getMessage()); } return SKIP_BODY; } public int doEndTag() { return EVAL_PAGE; } } TLD element Các tag mà không có thân phải khai báo nội dung của thân là rỗng. Code 23: helloworld.tld <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" ""> <!--Nếu có JSP v1.2 thì đổi lại ""--> 1.0 1.1 legiang A tag library from authors at helloWorld com.legiang.HelloWorldTag Ví dụ với tag đơn giản nhất EMPTY JSP page Code 24: hello.jsp <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> Code 24: hello.jsp (tiếp theo) Các tag có thuộc tính. Định nghĩa các thuộc tính trong tag handler. Đối với mỗi thuộc tínch của tag, chúng ta phải định nghĩa theo phong cách của JavaBean, tức là phải có phương thức get/set[Attribute] trong tag handler. Hãy nhớ rằng, nếu thuộc tính được đặt tên là id và tag handler kết thừa từ lớp TagSupport thì chúng ta không cần định nghĩa các phương thức get/set[Attribute] bởi v

Các file đính kèm theo tài liệu này:

  • doccn2.doc