Chủ Nhật, 6 tháng 7, 2014

MVC pattern


I/ Khái niệm:

1. Tách biệt phần ánh xạ, lưu trữ và xử lý dữ liệu (model) tách biệt với TP trình bày giao diện cho người dùng
Hiểu dễ hơn:
Tách biệt quá trình xây dựng chức năng cho ứng dụng và quá trình xây dựng giao diện cho người dùng.
Đưa ra Model để không cho người dùng tương tác trực tiếp vào dữ liệu vật lý (CSDL hay tập tin).
Như 2 điều trên ->tách Model và View. Nhưng cần có 1 thành phần lựa chọn và kết nối các thành phần này lại với nhau => Controller: đón nhận yêu cầu nhập xuất từ người dùng, xác định model tương ứng với view nhập để đưa model xử lý và hiện thị cho người dùng.

View: màn hình TV; Model: Nhận tín hiệu từ Controller; controller: ‘mop’(đồ điều khiển) bấm do bạn điều khiển.



Model:
- Là các thành phần hỗ trợ ánh xạ dữ liệu vật lí lên bộ nhớ, lưu trữ dữ liệu tạm thời, hỗ trợ các cách thức xử lý dữ liệu, hỗ trợ khả năng giao tiếp và trao đổi dữ liệu giữa các đối tượng khác trong bộ nhớ và cơ sở dữ liệu.
- 1 đối tượng Object trong khái niệm của lập trình hướng đối tượng
- Trong web của java, model là JavaBean hay Enterprise hay Web Service
View:
- Thành phần hỗ trợ trình bày dữ liệu và kết quả ra màn hình, hỗ trợ nhập thông tin từ người dùng
- Các thành phần này có khả năng truy cập Model, truy xuất Model thông qua những hành vi mà Model cho phép nhưng View không thể thay đổi các thành phần trong Model.
-Trong mô hình ứng dụng web: html, servlet, jsp…là thành phần đại diện VIEW.
Controller:
- Là các thành phần hỗ trợ kết nối người dùng server, đón nhập yêu cầu người dùng, thực hiện chuyển xử lí, lựa chọn và cập nhật Model và View tương ứng để trình bày cho người dùng.
- Hỗ trợ kết nối giữa người,model và view, giúp model xác định được view trình bày.

II/PHẦN CHÍNH:

1/ Servlet (1 vd của controller):
- Servlet là đoạn chương trình java thực thi trên Web Server hỗ trợ người lập trình java xây dựn trang web động.
- Servlet nhận request- yêu cầu từ client, sau đó thực hiện yêu cầu xử lí để gửi response
- servlet được load sẵn ở Web Server duy nhất lần đầu tiên khi ứng dụng được deploy và đáp ứng tức thời yêu cầu của người dùng qua Web Container.
- Servlet được server hỗ trợ cơ chế multithread giúp giảm tài nguyên và quá tải trong việc xử lí của server hay container.
**Cơ chế hoạt động:
Khi có request từ client gửi đến Server hay Web Container
Container sẽ lựa chọn 1 instance Servlet tuwogn ứng để đáp ứng request đó
Servlet lựa chọn để thực hiện xử lí và kết nối DB nếu cần
Sau khi servlet thực hiện xong, sẽ gửi kết quả ra container để gửi response về cho người dùng.
Browser đón nhận kết quả và xuất giao diện.
***Dể tạo 1 servlet ta implements HttpServlet
- HttpServlet được kế thừa từ GenericServlet
-GnericServlet được kế thừa từ tp chính là Servlet, ngoài ra từ ServletConfig,java.io.Serializable
Lưu ý: tất cả các lớp đều thuộc package javax.servlet
****Khi servlet chấp nhận lời gọi từ clien, nó sẽ đón nhận 2 tham số là ServletRequest (đối tượng chứa đựng dữ liệu truyền từ client đến server) và ServletResponse (đối tượng chứa đựng dữ liệu được truyền từ server đến client)
Khi servlet áp dụng protocol HTTP để giao tiếp thì các thành phần mở rộng từ 2 lớp trên tương ứng được cung cấp đó là HttpServletRequest và HttpServletResponse
***Servlet định nghĩa 3 tầm thao tác: request, session, ServletContext
Đây là vùng không gian bộ nhớ được cung cấp cho mỗi ứng dụng web để chứa các thông tin để giao tiếp với các thành phần khác trong server.
Mỗi vùng ko gian tồn tại trong 1 khoảng thời gian nhất định tùy theo quy định:
-request: tồn tại từ lúc gửi request cho đến khi response
-session: 1 khoảng thời gian từ lúc mở trình duyệt đến đóng trình duyệt, hết thời gian session, session bị hủy…
-ServletContext: hiểu đơn giản là application tồn tại từ lúc bắt đầu ứng dụng đến khi ứng dụng bị undeploy ra khỏi server hay server bị crash
**servlet cung cấp thêm 1 interface RequestDispatcher hỗ trợ việc giao tiếp và xác định view tương ứng trong xử lí.
RequestDispatcher hỗ trợ container chuyển request object từ đối tượng của server từ thành phần này sang thành phần khác.
Đối tượng cuối cùng là đối tượng sẽ respone kết quả trả về hay cho phép nhúng đối tượng này sang đối tượng khác
Cơ chế này còn giúp che dấu thông tin xử lí của các đối tượng xử lí trên thành url của trình duyệt-đảm bảo tính bảo mật cao
2/ Model:
1 thành phần cấu thành object-đối tượng và behaviors-các hành vi
Đảm bảo 4 tính chất:
-abstraction (mang tính chất chung nhất của object)
-encapsulation (cho phép người dùng truy cập các trạng thái của object thông qua các behavior)
-hierarchy (tính kế thừa)
-Modularity (phân chia module theo từng nhóm chức năng và tách biệt các thành phần theo dạng component để có thể dễ dàng cài đặt, maintenance-bảo trì, và tái sử dụng-reusable)
VD: javaBeans
a. Đặc điểm JavaBeans:
- Là 1 java class implements từ Serializable vì là object sử dụng qua protocol và giao tiếp với thành phần trong và ngoài server
- Bắt buộc có package để tái dùng qua lệnh import
- thuộc tính properties bắt buộc khai báo là private; việc khai thác thông qua getTenThuocTinh hay setTenThuocTinh (encapsulate).Hàm get đổi thành is nếu là kiểu boolean
- Buộc phải có 1 constructor không tham số để khởi tạo object=>thao tác không bị lỗi khi giá trị thuộc tính chưa cập nhật.
- Cài đặt đầy đủ các phương thức và hành vi mà JavaBeans cần giao tiếp với thế giới bên ngoài.
3/ View:
ex: html, jsp…
JSP: Java Server Pages
- Đây là ngôn ngữ scripting dùng ở server để hỗ trợ ứng dụng trong việc trình bày trang web động-cập nhật dữ liệu.
- JSP tích hợp HTML, XML, Java Code, kể cả Servlet:
+ tạo thuận lợi xây dựng giao diện.
+ Mở rộng khả năng sử dụng JSP qua định nghĩa các tag mới như XML
+ Cho phép nhúng trực tiếp code Java vào JSP thông qua Declaration-Khai báo biến và hàm, scriptlets-chứa code trực tiếp của Java và Expression-tính toán biểu thức và in ra kết quả màn hình.
- Bản chất JSP là Servlet-> các thành phần của Servlet sẽ có tồn tại hết trên JSP
- Ngoài ra, JSP ko cần biên dịch mà nó được biên dịch khi có request lần đầu tiên yêu cầu đến server.
- JSP cung cấp các tp implicit object để ng dùng sử dụng các thành phần tương tác trên server mà ko cần khai báo, khởi tạo
- kết xuất JSP thực chất là HTML, File JSP có phần mở rộng là .jsp
***Chu kì JSP
Khi có 1 yêu cầu từ client đến server, container xác định trang jsp được yêu cầu. Trang JSP được đưa qua JSP Engine để xử lí. JSP Engine thực hiện các bước:
+ Đọc cấu trúc file của JSP File từ trên xuống dưới, từ trái qua phải để chuyển đổi sang java code tương ứng.
+ Phát sinh Servlet từ nội dung parsing ở bước trên để cấu tạo thành servlet.
+ Thực hiện biên dịch code Servlet
+ Sau khi biên dịch thành công thì quá trình hoạt động sẽ thực hiện đúng theo chu kì.
+ tuwowgn tư 3 phương thức init, services, destroy của Servlet thì JSP sẽ có 3 phương thức tuwowgn ứng là jspInit, jspService và jspDestroy.
3/
4 tầm thao tác: page-tồn tại trong page, request-tồn tại trong page, request – tồn tại từ lúc bắt đầu gửi request cho đến khi response thành cồng, session, application (từ khi deploy đến khi kết thúc ứng dụng) – ServletContext
Để trang JSP mang tính chất đặc thù của View thì Java Sun đưa ra các thành phần cải tiến để tránh việc trộn lẫn code và xử lý giao diện và tạo tính đặc thù của giao diện. Chúng đó là
EL expression language
Cách viết tắt ngắn gọn trên trang JSP và che dấu một phần code java được xử lý truy cập
Định nghĩa các tầm vực truy cập là requestScope, pageScope, sessionScope, applicationScope
Cú pháp: ${trị hay biểu thức hay hằng số}
JSTL: JSP Standard Tag Library định nghĩa ra các tag hỗ trợ chức năng xử lý trên trang JSP một cách đơn giản và rõ ràng. Chúng gồm các tag như core, sql, fmt – format, xml, function
Chúng ta đã nắm được cách sử dụng EL và JSTL qua các bài tutorial cụ thể như EJB (xem phần giao diện trình bày của EJB)

Thứ Sáu, 4 tháng 7, 2014

Custom tag in JSP page

         1.Custom tags
Custom tag được mô tả chi tiết trong 1 file XML gọi là tag library, trong file XML chúng ta khai báo các thẻ có trong bộ custom tag và các class thực thi của từng thẻ. Các class thực thi được gọi là các tag handler; chúng ta có 2 loại class handler:
-         Simple tag handler: chỉ dùng cho các thẻ không có các thành phần chứa scripting và không có body
-         Classic tag handler: được sử dụng khi các thành phần của thẻ có chứa scripting.
Khi một trang JSP có chứa custom tag được chuyển đổi sang servlet, các custom tag sẽ được chuyển đổi sang các phương thức được khai báo trong tag handler. Khi Web container thực thi trang JSP, các phương thức này sẽ được gọi kèm theo.

 Ưu điểm của Custom tags:
Custom tag có 3 ưu điểm chính sau:
-         Tách rời các phương thức logic khỏi lớp View: Custom tag và Scriptlet cung cấp các chức năng tương đương. Điểm khác biệt giữa 2 kỹ thuật này là chúng được viết ở nơi nào. Trong khi scriptlet cho phép nhúng trực tiếp 1 đoạn code vào trong trang JSP, custom tag là những đoạn code chạy phía sau để tổ chức lại HTML.
-         Dễ sử dụng: Custom tag rất dễ sử dụng cho người lập trình Java hay người không biết lập trình Java.
-         Dễ cài đặt: Custom tag sau khi xây dựng xong sẽ được đóng gói vào file jar và có thể sử dụng cho nhiều trang web khác nhau.
Hình sau mô tả các thành phần của Custom tag:


         2.Tag library descriptor

         Đây là một file XML mô tả các custom tags trong ứng dụng JSP. Nó định nghĩa 1 custom tag và được          lưu với phần mở rộng .tld.

      3.Tag handler

         là một file java đơn giản chứa code cho các chức năng của custom tag. Có 2 loại classic simple.

             Từng bước tạo 1 custom tag:

TLD là một xml file định nghĩa thư viện thẻ và các thẻ. Dòng đầu tiên là xml header chuẩn:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
     TLD file chứa thẻ gốc <taglib. Thẻ này có các thẻ con sau:
·         tlibversion
·         jspversion
·         shortname
·         info
·         uri
·         tag
1)    tlibversion chỉ định version của thư viện thẻ có định dạng sau:
([0-9])* ("." [0-9])? ("." [0-9])? ("." [0-9])?
 
2)    The jspversion chỉ định JSP version. Định dạng giống với tlibversion:
([0-9])* ("." [0-9])? ("." [0-9])? ("." [0-9])?
3)    shortname chỉ định shortname của thu viện tag library. Giá trị này phải bắt đầu bằng chữ và không chứa khoảng trắng.
4)    info chứa thông tin cho mục đích làm tài liệu. Dữ liệu mặc định là rỗng.
5)    uri chỉ định link trỏ đến thư viện thẻ.
     6)  tag là thành phần quan trọng nhất của tag library. Bạn có thể chỉ định hơn 1 thẻ tag.


      Demo tạo custom tags:
Tạo TLD có nội dung như sau:
       <?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
    <tlibversion>1.0.123.123.234</tlibversion>
    <jspversion>1.2</jspversion>
    <shortname></shortname>
    <info>Example tags</info>
    <uri></uri>
    <tag>
        <name>myTag</name>
        <tagclass>com.aptech.customtag.HelloTag</tagclass>
        <attribute>
            <name>name</name>
            <required>true</required>
        </attribute>
    </tag>
</taglib>

Khai báo trong web.xml

<jsp-config>
      <taglib>
            <taglib-uri>/hello</taglib-uri>
            <taglib-location>/WEB-INF/tlds/hello.tld</taglib-location>
      </taglib>
</
jsp-config>

Tạo Tag Handler

package com.aptech.customtag;

import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class HelloTag extends TagSupport {

    private String name;

    public int doEndTag() throws JspException {
        JspWriter out = pageContext.getOut();
        try {
            out.println("<hr/>");
        } catch (Exception e) {
        }
        return super.doEndTag();
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    public int doStartTag() {
        try {
            JspWriter out = pageContext.getOut();
            out.println("<hr/>");
                out.println("Hello " + name);
        } catch (Exception ex) {
            throw new Error("All is not well in the world.");
        }
        return SKIP_BODY;
    }                  
}

Xử lý tag trong JSP

<%@ taglib uri="/WEB-INF/tlds/hello.tld" prefix="hello" %>
<html>
        <head>
                <title>Your Standard Hello World Demo</title>
        </head>
        <body bgcolor="#ffffff">
                <hello:myTag name="Hai"/>
        </body>
</html>

Thứ Tư, 2 tháng 7, 2014

Expression Language

-Expression Language - 1 tính năng mới trong JSP 2.0. Nó là 1 cách đơn giản hơn để viết lại các biểu thức trên JSP hơn phiên bản trước đó( ngắn hơn và có thể dùng với custom tags).

JSP Expression Language (EL) giúp ta có thể dễ dàng truy cập dữ liệu ứng dụng được lưu trữ trong các thành phần JavaBeans. JSP EL cho phép bạn tạo ra các biểu thức cả (a) số học và (b) hợp lý. Trong một biểu thức JSP EL, bạn có thể sử dụng số nguyên, số dấu chấm động, dây, các hằng số được xây dựng trong đúng và sai cho các giá trị boolean, và null.


 Toán tử cơ bản trong EL:

Arithmetic Operators (toán tsố học)

+, –, *, /(div), %(mod)

Relational Operators (Toán tử quan hệ)

== ( eq), != (ne), < (lt), > (gt), <= (le), >= (ge)

Logical Operators (toán tử logic)

&&(and), ||(or), !(not)

The empty Operator (toán tử empty)

Nếu đối tượng có giá trị là null thì trả về true và ngược lại. Cú pháp: ${empty x}

Biểu thức điều kiện (conditionally expression)

${ test ? expression1 : expression2 }

VD:  ${1==2 ? "aaa" : "bbb"}

JSP EL Implicit Objects:


-pageScope: tồn tại trong phạm vi trang jsp.

-requestScope :  phạm vi yêu cầu ,chu trình vòng đời từ request đến respone.

-sessionScope : phạm vi phiên ,mô tả các phiên làm việc của người dùng.

-applicationScope :  phạm vi ứng dụng ,klhi ứng dụng được bật lên.

-param : truy xuất parameter của người dùng truyền đến trong request.

-paramValues : ​​Yêu cầu các thông số như collection của chuỗi .
header, yêu cầu HTTP header.

headerValues : ​​yêu cầu HTTP tiêu đề như collection của chuỗi .

initParam : thông số ngữ cảnh khởi .

-cookie :giá trị Cookie .

pageContext : Các đối tượng JSP pageContext cho trang hiện tại.

Standard Action & JavaBean

1.Khái niệm

-JavaBean là software component được viết bởi ngôn ngữ Java.

-JavaBean tạo ra các component độc lập platform

-JavaBean có khả năng nhúng vào các component, application hay applet khác nhau.

-khác biệt chủ yếu giữa Java Bean và Java class thông thường là Java Bean được vận dụng 

theo cơ chế Serializable (các giá trị của các thuộc tính trong bean được đưa tới các phương 

thức instance của Bean)
-JSP truy cập Java Bean qua các tag action và nhận kết quả trả về mà không cần biết cấu trúc

 của Java Bean và cách thức xử lý của nó.
-Java Bean cài đặt các phương thức xử lý và không hiển thị khi thực hiện các xử lý
-Java Bean là Java Class tuân thủ 3 yếu tố sau:
+Phải có 1 constructor không có tham số (mặc định có sẵn nếu không implement).
 Constructor này được gọi khi element của JSP tạo bean.

+Các thuộc tính (field) của bean không được khai báo public

+Việc truy xuất các thuộc tính của bean sẽ thông qua phương thức getXxx hay

setXxx (accessor method) đối với các thuộc tính cần lữu trữ (persistent)
+Lưu ý:
•Các thuộc tính khai báo với ký tự đầu là chữ thường và các accessor sẽ

 bắt đầu bằng chữ in hoa (vd: length – getLength và setLength)

•Các thuộc tính có kiểu dữ liệu là boolean thì phương thức gọi chúng sẽ có 

dạng isXxx thay vì getXxx
•JSP actions sẽ truy cập phương thức get/set/is để truy cập bean

-JSP cung cấp 03 Java bean tag (standard actions)

+jsp:useBean

+jsp:setProperty

+Jsp:getProperty

2.Cách sử dụng JavaBean trong JSP

•Khai báo
<jsp:useBean id=“<định danh>” class=“<tên class>” [scope = “loại scope”]/>
–id: tương tự khai báo biến, đại diện cho đối tượng truy xuất đến Bean
–class: tên class được sử dụng
–scope: khả năng chia xẻ hay tầm hoạt động của Bean. Mặc định là request

•Cơ chế thực hiện: JSP Engine/ Container thực hiện
–Tìm kiếm class tương ứng được khai báo trong class
–Khởi tạo instance thông qua constructor
–Gán định danh id cho instance để có thể truy xuất trên trang JSP
–Xác định phạm vi hoạt động của instance này.

•Cách khai báo biến dùng scriptlet tương đương Java Bean:
<% <tên class> <định danh> = new <tên class>(); %>
Ví dụ:
–<jsp:useBean id=“book1” class=“store.book”/> tương đương
–<% store.book book1 = new store.book(); %>

•Ép kiểu dữ liệu: tên biến trả về có cùng kiểu dữ liệu class sử dụng

<jsp:useBean id=“<định danh>” class=“<tên class>” type = “<kiểu dữ liệu>” 

[scope = “loại scope”]/>

–type: kiểu dữ liệu của Java

•Cách khai báo biến dùng scriptlet tương đương Java Bean:
<% <kiểu dự liệu> <định danh> = new <tên class>(); %>
Ví dụ:
–<jsp:useBean id=“abc” class=“cd” type=“Runnable” />
–tương đương <% Runnable abc = new cd(); %>
•Cú pháp sử dụng khác của Java bean
<jsp:useBean …> statement </jsp:useBean>
Ví dụ
<jsp:useBean id="count" class="ABean.AccessBean" scope="application">

  <jsp:setProperty name="count" property="firstPage" value="ATest.jsp" />
</jsp:useBean>





Implicit Object

Trong bài này ta sẽ học về các implicit object ,tức là các object mặc định có sẵn ,chúng ta cũng có thể gọi chúng bằng các tên có sẵn(API).
-Trong JSP,ta có thể dùng những object này cho những biểu thức hoặc những đoạn scriptlets
+Khi object dùng cho đoạn scriptlet cú pháp như sau:
<%session.getAttribute("attributeName")%>
+Khi object dùng cho biểu thức cú pháp như sau:
${sessionScope.attributeName}
-Nhưng scopes cơ bản cho những object này là :
+page : phạm vi tồn tại trong 1 trang
+session: implicit object tồn tại trong một phiên làm việc
+request:  implicit object sẽ tồn tại từ lức client request cho đến khi respone trả về
+application: implict object tồn tại trong vòng đời của ứng dụng.

-Implicit object gồm có 4 nhóm khác nhau:
+ Các object liên hệ với trang JSP
+ Các object tồn tại mà có quan hệ với input và output của trang JSP
+Các object cung cấp context cho trang JSP
+Các object xử lý lỗi


Demo:
Module 8:Write a JSP application to display all header values such as host, user-
agent, accept, accept-language, connection, cookie and host. Use object of Enumeration class and method getHeaderNames() of request object to accomplish the application.

Module8.2: Develop a JSP-based web application to store the timestamp of when the user logged in and display this timestamp information when the user visits the site again.