Kiến trúc 1 và 2 JSP (model 1 & 2architecture) - phần 2 pps

31 359 0
Kiến trúc 1 và 2 JSP (model 1 & 2architecture) - phần 2 pps

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

- Tên lớp Bean phải có tiếp vĩ ngữ Bean chẳng hạn UserBean, DataAccessBean, Thật quy tắc khơng u cầu bắt buộc định hướng thông dụng cho phép nhà phát triển khác hiểu vai trò lớp - Một Bean phải có hàm tạo khơng có tham số - Bean khơng nên có biến thể (field) ‘public’ - Các giá trị bền vững nên truy cập thông qua phương thức gọi getXxx setXxx - Đối với server-side Bean không nên dùng thư viện đồ hoạ II JSP sử dụng Beans Các JSP element dùng cho Bean a) jsp:useBean element Cho phép tải Bean với tên phạm vi xác định vào trang JSP Cú pháp: Nếu khơng có body, tức khơng có tag thân jsp:useBean có cú pháp empty tag TypeSpec (|) 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ị thuộc tính scope: - page Đây giá trị mặc định scope Bean với giá trị có sẵn từ javax.servlet.jsp.PageContext trang hành Bean loại bỏ response gởi trở client request chuyển tới trang - request Bean có giá trị có sẵn từ đối tượng ServletRequest trang hành trang include hay forward cách sử dụng phương thức getAttribute(name) Bean bị huỷ bỏ response gởi trở client - session Bean sử dụng trang có tham gia vào session client Có phạm vi session client Bean lưu trữ đối tượng HttpSession - application Bean sử dụng trang ứng dụng hành (cả request tương lai) b) jsp:setProperty element Gán giá trị nhiều giá trị (thuộc tính mảng) thuộc tính vào Bean Cú pháp: options (|) thuộc tính sau: options::=property =“*” | property =“propertyName” | property =“propertyName” param =“paraName” | property =“propertyName” value =“{ | string}” c) jsp:getProperty element Lấy giá trị thuộc tính Bean để hiển thị giá trị trang kết Cú pháp: Phương pháp chuyển kiểu tự động JSP Bean Các thuộc tính thành phần JSP không giới hạn giá trị chuổi (string) quan trọng để hiểu tất giá trị thuộc tính truy cập qua tag chuyển thành kiểu chuổi Tuy nhiên, phương thức getter không cần trả kiểu String cách tường minh JSP container tự động chuyển giá trị trả thành kiểu String cần thiết Đối với kiểu liệu Java, chuyển đổi thể bảng sau: Property Type boolean Conversion to String 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 phương thức setter thuộc tính truy cập với tag tự động chuyển từ String sang kiểu gốc thích hợp JSP container Điều thực qua phương thứ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 a) Introspector gì? Introspector phân tích mà qua Java xem xét đoạn mã chương trình để tìm phương thức dùng để xây dựng áp dụng cho thuộc tính tình cụ thể Chúng ta khơng cần quan tâm đến 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 Bean container hiểu chương trình muốn tạo thuộc tính age có kiểu int – Bean container chuyển thuộc tính theo quy tắc: FoorBar foorBar Z URL b) z URL Thiết kế phương thức mẫu dùng cho thuộc tính Đối với thuộc tính mang trị đơn, hai phương thức getter setter viết theo mẫu sau (với getter setter xem 4.Thuộc tính Bean): public void setAttributeName(AttributeType param) public AttributeType getAttributeName() Đối với thuộc tính mang trị kiểu boolean, phương thức getter dùng với tiếp đầu ngữ 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) phương thức getter setter thiết lập tương tự Chúng ta sử dụng cặp phương thức hay hai cặp phương thức public void setAttributeName(int index, AttributeType value) public AttributeType getAttributeName() và/hoặc public void setAttributeName(AttributeType[] value) public AttributeType[] getAttributeName() c) Khai báo phương thức tường minh Nếu khơng muốn phân tích Introspector ngầm định, khai báo xử lý phương thức cách tường minh nhờ vào lớp phụ dùng để mô tả phương thức gọi BeanInfo Khi Beans có tên xxx biên dịch, trước tiên Bean container tìm lớp có tên xxxBeanInfo Nếu lớp tồn tại, thông tin lớp xxxBeanInfo xử lý trước áp dụng cho phương thức tìm thấy Các phương thức khơng mơ tả xxxBeanInfo á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 Bean a) Các phương thức truy xuất Thuộc tính thật biến nằm lớp, nhiên biến không nên sử dụng trực tiếp mà nên thông qua phương thức để truy xuất chúng Thông thường biến dùng vào hai mục đích gán liệu lấy liệu để tính tốn Java đưa hai loại phương thức để đáp ứng cho nhu cầu truy xuất biến phương thức getter mang ý nghĩa đọc liệu từ biến phương thức setter mang ý nghĩa gán liệu cho biến b) Các loại thuộc tính Chúng ta xem ví dụ sau: - Thuộc tính mang giá trị đơn Bean sau lấy thời gian 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 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 Do you authorize? Answer: Thuộc tính mang giá trị mảng - Ví dụ xây dựng component mà thực tính tốn tĩnh 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; } Thuộc tính prefix định nghĩa tiếp đầu ngữ để phân biệt với tag library khác, thuộc tính giải vấn đề xung đột tên tag Các loại tag Những custom action diễn đạt cú pháp XML Chúng có start tag, nội dung end tag: body Một tag mà khơng có nội dung biểu diễn sau: a) Các tag đơn giản Một tag đơn giản sau triệu gọi action xuất lời chào “Hello World.” b) Các tag có thuộc tính Một start tag custom action chứa thuộc tính dạng attr = ‘value’ Các thuộc tính tuỳ biến tham số dùng phương thức lớp java Các thuộc tính gán hay nhiều tham số đối tượng request từ chuổi Chỉ có kiểu thuộc tính bảng sau gán từ giá trị tham số request 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 tính vào thời gian yêu cầu Giá trị biểu thức tuỳ thuộc vào kiểu thuộc tính xác định đối tượng cài đặt tag gọi tag handler (tag handler phần định nghĩa tag) c) Các tag có nội dung Tag bao hàm custom tag, scripting element, HTML, nội dung nằm start tag end tag Trong ví dụ sau đưa thông tin “lời chào” cung cấp thân tag thay thuộc tính DHBK Ha Noi d) Các tag định nghĩa biến kịch Một tag định nghĩa biến mà biến dùng trang Ví dụ sau minh hoạ cách thức định nghĩa sử dụng biến chứa đối tượng trả e) Kết hợp tag Các tag kết hợp với phương pháp đối tượng dùng chung Trong ví dụ sau, tag1 tạo đối tượng có tên obj1, sau sử dụng lại tag2 Qui tắc khuyến khích bảng đặt tả JSP, tag tạo tên với thuộc tính id tag thứ hai có thuộc tính name để dùng lại tên Trong ví dụ kết tiếp, dùng tag lồng tương tự XML HTML III Định nghĩa tag Để sử dụng custom tag trang JSP, cần phải định nghĩa ba thành phần riêng biệt: - Phát triển tag handler lớp trợ giúp cho tag - Khai báo tag mô tả thư viện tag (tag library descriptor) dạng tập tin XML - Tạo tập tin JSP có sử dụng custom tag Phần mơ tả thuộc tính tag handler mơ tả thư viện tag, trình bày cách phát triển tag handler element mô tả thư viện loại tag giới thiệu phần trước Tag handler Tag handler đối tượng gọi lên JSP container để định trị cho custom tag xuốt trình thực thi trang JSP có tham chiếu tới tag Các phương thức tag handler gọi lớp cài đặt trang JSP vào thời điểm khác xuốt trình định trị cho tag Khi gặp start tag custom tag lớp cài đặt trang JSP gọi phương thức để khởi tạo giá trị thích hợp sau triệu gọi phương thức doStartTag Khi gặp end tag custom tag phương thức doEndtag gọi Tuỳ theo mục đích custom tag mà xử lý phương thức thích hợp giao tiếp cài đặt Bảng sau mô tả loại tag 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 Body, Interaction doStartTag, doEndTag, release doStartTag, doEndTag, release, doInitBody, doAfterBody Tag handler có truy cập vào API mà cho phép truyền thơng với trang JSP Con đường vào API đối tượng pageContext, qua tag handler truy cập vào đối tượng ngầm định khác request, session, application từ trang JSP Các đối tượng ngầm định có thuộc tính kết hợp với chúng Các thuộc tính truy cập qua phương thức [get/set]Attribute thích hợp Nếu tag lồng tag handler truy cập handler (được gọi parent) với toàn tag Các tag handler phải cài đặt hai giao tiếp Tag BodyTag Các giao tiếp dùng để lấy đối tượng Java tồn tạo tag handler Để định nghĩa tag handler dùng lớp TagSupport BodyTagSupport lớp sở (xem III Tag handler triệu gọi nào?) Tag library descriptor Tag library descriptor (TLD) tài liệu XML dùng để mơ tả thư viện tag Một TLD chứa tồn thông tin thư viện tag chứa thư viện JSP container công cụ phát triển JSP sử dụng TLD để xác định tag Các element TLD sau dùng để định nghĩa thư viện tag: Code 21: HelloWorldTag.java Tag element yêu cầu tag để xác định lớp có thư viện tag classname Các ví dụ Để tạo custom tag cần hai import gói bản: import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; // tag extension a) Các tag đơn giản - Tag handler Đối với tag đơn giản cần cài đặt hai phương thức giao tiếp Tag doStartTag doEndTag doStartTag triệu gọi JSP container gặp start tag, trả SKIP_BODY thân tag chẳng có nội dung Ngược lại gặp end tag JSP container gọi doEndTag, trả EVAL_PAGE phần cịn lại trang cần phải định trị, khơng trả SKIP_PAGE Lớp tag handler cài đặt 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à thân phải khai báo nội dung thân rỗng Code 23: helloworld.tld 1.0 1.1 legiang A tag library from authors at http://www.legiang.com/ helloWorld com.legiang.HelloWorldTag Ví dụ với tag đơn giản nhất EMPTY - JSP page Code 24: hello.jsp Code 24: hello.jsp (tiếp theo) b) Các tag có thuộc tính - Định nghĩa thuộc tính tag handler Đối với thuộc tínch tag, phải định nghĩa theo phong cách JavaBean, tức phải có phương thức get/set[Attribute] tag handler Hãy nhớ rằng, thuộc tính đặt tên id tag handler kết thừa từ lớp TagSupport không cần định nghĩa phương thức get/set[Attribute] thứ TagSupport làm sẵn Lớp tag handler cài đặt sau: Code 25: HelloWorldTag.java (sữa lại Code 22 ) public HelloWorldTag extends TagSupport { private String name = “World.”; public void setName(String name) { this.name = name; } public int doStartTag() throws JspException { try { pageContext.getOut().print("Hello " + name); } catch (Exception ex) { throw new JspTagException("HelloWorldTag: " + e.getMessage()); Code 25: HelloWorldTag.java (sữa lại Code 22) (tiếp theo) } return SKIP_BODY; } public int doEndTag() { return EVAL_PAGE; } } - TLD element Đối với thuộc tính phải xác định thuộc tính yêu cầu (bắt buộc) giá trị xác định biểu thức Nếu thuộc tính tag khơng bắt buộc tag handler nên cung ấp giá trị mật định TLD cho tag handler sau: Code 26: TLD file (overwrite helloworld.tld) helloWorld com.legiang.HelloWorldTag Ví dụ với tag đơn giản nhất name false false EMPTY - JSP page Code 27: paramtag.jsp Code 27: paramtag.jsp (tiếp theo) Tag With Attributes c) Các tag có nội dung - Tag handler Tag handler cho loại cài đặt khác phụ thuộc vào tag handler có tương tác với thân hay khơng Tương tác có nghĩa tag handler đọc sữa đổi nội dung thân tạo giá trị lặp lại cho thân tag Các tag có tương tác với phần thân: tag handler khơng cần tương tác với phần thần tag handler nên cài đặt giao tiếp Tag dẫn xuất từ lớp TagSupport Nếu thân tag cần định trị doStartTag cần phải trả EVAL_BODY_INCLUDE, ngược lại trả SKIP_BODY Các tag có tương tác với phần thân: tag handler phải cài đặt giao tiếp BodyTag BodyTagSupport, thường cài đặt phương thức doInitBody doAfterBody Hai phương thức tương tác với nội dung thân chuyển vào tag handler lớp cài đặt trang JSP Đối tượng BodyContent cung cấp vài phương thức để đọc ghi nội dung Tag handler sử dụng phương thức getString, getReader BodyContent để trích thơng tin từ phần thân phương thức writeOut(out) để ghi nội dung thân vào luồng xuất Phương thức getPreviousOut thường sử dụng để bảo đảm kết trả tag handler có sẳn tồn tag handler Các phương thức dùng loại tag này: doInitBody: gọi sau nội dung thân gán trước định giá trị, thường dùng để thực khởi tạo giá trị mà tuỳ thuộc vào nội dung thân doAfterBody: gọi sau nội dung thân định trị Nếu thân trị nhiều lần lặp lặp lại nên trả EVAL_BODY_TAG, ngược lại trả SKIP_BODY release: tag handler nên xác lập lại trạng thái giải phóng tài nguyên dành riêng phương thức release Ví dụ sau đọc nội dung thân, chuyển nội dung đó, sau ghi lại thay đổi vào luồng xuất Code 28: TransformTag.java public class TransformTag extends BodyTagSupport { public int doAfterBody() throws JspTagException { BodyContent bc = getBodyContent(); String body = bc.getString(); bc.clearBody(); try { getPreviousOut().print(body.transform()); } catch (IOException e) { throw new JspTagException("TransformTag: " + e.getMessage()); } return SKIP_BODY; } } - TLD element TLD sữa đổi lại ví dụ bodycontent tag đặt tên file transform.tld JSP Với tag có phần thân bodycontent tag có hai giá trị Một JSP, phần thân bao gồm custom tag, scripting element văn HTML Tất thứ lại có giá trị tagdependent Chú ý giá trị element khơng ảnh hưởng tới tiến trình thông dịch thân - JSP page Code 29: transformtag.jsp Tag With Body Tag With Body Hi! BKHN University d) Các tag định nghĩa biến kịch - Tag handler Tag handler đảm nhận việc tạo gán đối tượng tham chiếu biến kịch vào ngữ cảnh truy cập từ trang Để Làm điều cách dùng phương thức pageContext.setAttribute(name, value, scope) pageContext.setAttribute(name, value) Thông thường thuộc tính chuyển vào ... version= "1. 0" encoding="ISO-8859 -1 " ?> - JSP page Code 24 : hello .jsp Code 24 : hello .jsp. .. - JSP page Code 27 : paramtag .jsp Code 27 : paramtag.jsp

Ngày đăng: 09/08/2014, 08:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan