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

MVC Design Pattern

I. Vấn đề

Trước đây khi chúng ta lập trình một trang jsp,chúng ta thường đan xen các mã html cùng với các mã jsp. Điều này sẽ dẫn đến những khó khăn sau có thể gặp phải:
Người thiết kế giao diện cũng cần phải biết các ngôn ngữ lập trình, hoặc bạn phải trực tiếp thiết kế chúng.

Việc bảo trì chúng thường rất khó khăn, vì một phần các mã chương trình lẫn lộn với mã html.

Khi có lỗi xảy ra, việc tìm ra lỗi và định vị ỗi cũng là một vấn đề khó khăn.. .v.v


II. Mô hình MVC.

Ngày nay người ta dùng mô hình MVC cho những dự án lớn để có thể giải quyết những vấn đề trên. Ứng dụng được chia ra làm 3 phần: Phần View, Model và Controller
Model: Mô hình là các lớp java có nhiệm vụ:
- Nhận các yêu cầu từ khung nhìn
- Thi hành các yêu cầu đó (tính toán, kết nối CSDL …)
- Trả về các giá trị tính toán cho View.

View: Bao gồm các mã tương tự như JSP để hiển thị form nhập liệu, các kết quả trả về từ Model…

Bộ điều khiển: Đồng bộ hoá giữa Khung nhìn và Mô hình. Tức là với một trang JSP này thì sẽ tương ứng với lớp java nào để xử lý nó và ngược lại, kết quả sẽ trả về trang jsp nào.

*Lưu ý rằng chúng ta chỉ áp dụng các mô hình, cấu trúc vào trong các dự án lớn, phức tạp còn trong những bài toán nhỏ thì không cần sử dụng bất kì một mô hình nào.

Ưu điểm của mô hình MVC.

- Linh hoạt trong việc phát triển và dễ dàng cho việc mở rộng dự án.
- Các bộ phận tách rời nhau vì vậy dễ dàng cho việc fix.

Login and Logout

Vấn đề

Như chúng ta đã biết thì trong bất kì một dự án nào liên quan đến quản lý thì đều phải có thao tác đăng nhập và đăng xuất.

Vậy trong Java Servlet chúng ta sẽ làm chúng như thế nào? Trong bài này chúng ta hãy cùng tìm hiểu và làm một demo nho nhỏ về Login và Logout.

I. Tài nguyên được bảo vệ và tài nguyên tự do truy cập

Ví dụ trong website của chúng ta có các tài nguyên là các trang: Register.jsp , Login.jsp, ViewAllPost.jsp.

Trong số này thì Register.jsp và ViewAllPost.jsp là 2 tài nguyên được bảo vệ (bắt buộc phải đăng nhập để xác định quyền hạn truy cập).

Hình trên biểu diễn trình tự của  việc login.
Đầu tiên người dùng gửi một request đến, Filter Authenticate sẽ check xem liệu request đó có được phép truy cập vào tài nguyên không? Nếu như được phép thì cho phép tiếp tục truy cập. Nếu không thì chuyển request đến trang login. Nhiệm vụ của trang login là gửi thông tin đăng nhập của người dùng đến LoginServlet và check xem có đúng là tài khoản trong hệ thống không? Nếu đúng thì cho truy cập lại trang cũ. nếu không thì trả về trang Login.jsp.

Bắt đầu làm demo.

Đầu tiên chúng ta tạo 3 trang JSP là Register, Login, ViewAllPost và một filter là Authenticate. Filter Authenicate sẽ chặn lại request đến tất cả các trang trong hệ thống.
Trong Filter Authenticate chúng ta khai báo một phương thức như sau:

public boolean isFreeAccess(String url) {
        if ((!"".equals(url) && url.contains("Welcome")) || (!"".equals(url) && url.contains("LoginServlet.jsp"))) {
            return true;
        }
        return false;
    }

Phương thức này dùng để check và phân loại request.

Tiếp đến trong phương thức doFilter chúng ta viết những đoạn mã sau:

String url = httpRequest.getRequestURI();
        request.setAttribute("wantedUrl", url);

        if (isFreeAccess(url) || httpRequest.getSession().getAttribute("username") != null) {
            chain.doFilter(request, response);
        } else {
            RequestDispatcher dis = request.getRequestDispatcher("Login.jsp?url=" + url + "");
            dis.forward(request, response);
        }

Tiếp đến ở trang Login chúng ta khai báo một form có action="LoginServlet" và có 3 input. với type của 3 cái lần lượt là "text", "password","hidden" dùng để lấy thông tin của người dùng và truyền đường dẫn mà người dùng muốn truy cập.

Ở trong LoginServlet ta sẽ code nghiệp vụ tiến hành check thông tin của người dùng và chuyển hướng họ đến trang muốn đến nếu thông tin username và password cung cấp là chính xác.
Nếu không thì ta sẽ trở lại trang Login.jsp.

- Tiếp đến ta sẽ tạo ra thêm một servlet với tên là LogoutServlet. Khi gọi đến servlet này ta sẽ tiến hành huỷ bỏ session và chuyển hướng đến trang Login.jsp

Custom Tags

I. Tại sao cần dùng Custom Tags.

Ưu điểm

Có nhiều lúc chúng ta cần nhúng code Java vào  trong trang JSP, nhưng khi ta nhúng như vậy thì khiến cho việc đọc và hiểu trở nên vô cùng khó khăn cho lập trình viên.

Custom Tags cung cấp các kĩ thuật để chứa đựng và tái sử dụng những đoạn code phức tạp, có sẵn hoặc những nhiệm vụ trong trang JSP.

Cung cấp khả năng tái sử dụng code và sự đơn giản của Java Code.

Những thông tin nên biết về Custom Tags.


Để có thể sử dụng tốt Custom Tags thì những thông tin sau đây sẽ rất có ích đối với bạn:

- JSP 1.0 không hỗ trợ “Tag Libralies”.

- JSP 1.1 hỗ trợ sự sáp nhập của người dùng được được tạo bởi Custom tags trong một file JSP.

- Cấu trúc của Custom Tags trong trang JSP cũng giống như XML tags.

a. Các loại thẻ Custom Tags.

Empty Tag


Vd. <td:welcome/>
Đây là thẻ không có body cũng như Attribute.

Custom tags with Attribute.

    Vd: <td:welcome color= ‘blue”></tdwelcome>

   Đây là loại thẻ Custom Tags có Attribute color là “blue”.

Custom tags có body.

   Vd:
<td:welcome>
                <%= today_date %>
</welcome>

Custom tags lồng nhau.


b. Các phần của Custom Tags.

 Đó là Tag Library Description và Tag Handler.

Tag Handler

Là đoạn code thực sự xử lý công việc như nêu ở phần ưu điểm phía trên.

Tag Library


Là nơi mà mô tả.

IV. Mô hình làm việc của Custom Tags


Như biểu đồ ta thây khi trình duyệt thực hiện Request lên server ,  request sẽ đi qua JSP 
engine sau đó. Trong trường hợp này JSP sẽ tìm trong TLD file để tìm hiểu đặc tả cho file đó.
Sau khi chúng ta có Tag rồi thì chúng ta sẽ biết chúng đượ c xử lấy ở đâu, bằng tag handler nào thì nó sẽ gọi đến tag handler đó  và xử lý,  sau đó trả kết quả về cho JSP Engine và JSP Engine trả về cho trình duyệt. Đó là một vòng đời của một JSP file với Custom Tags.

V. Các loại Custom Tags.

a. Classic Tags

Đây là phiên bản gốc của Custom Tag. Nó cho phép ta dùng các Script Elements để nhúng các dòng code giống như sau vào trang JSP như: <%! Code %>, <%   Code  %>, <%= Expression%>

b. Cái thứ hai chúng ta có là Simple Tags.

Loại Tags này có cấu trúc đơn giản hơn, chúng ta chỉ việc implement chúng.
Có 2 loại :
Loại thứ nhất là dùng code java, nó giống như cái handler, tuy nhiên trên thực tế thì nó có hơi khác một chút.
Loại thứ 2 dùng làm giao diện Tag File.


VI. Tag Life Cycle.


Custom Tags In Jsp

I. Tại sao cần dùng Custom Tags.

Ưu điểm


Có nhiều lúc chúng ta cần nhúng code Java vào  trong trang JSP, nhưng khi ta nhúng như vậy thì khiến cho việc đọc và hiểu trở nên vô cùng khó khăn cho lập trình viên.

Custom Tags cung cấp các kĩ thuật để chứa đựng và tái sử dụng những đoạn code phức tạp, có sẵn hoặc những nhiệm vụ trong trang JSP.

Cung cấp khả năng tái sử dụng code và sự đơn giản của Java Code.

.       Những thông tin nên biết về Custom Tags.

Để có thể sử dụng tốt Custom Tags thì những thông tin sau đây sẽ rất có ích đối với bạn:

- JSP 1.0 không hỗ trợ “Tag Libralies”.

- JSP 1.1 hỗ trợ sự sáp nhập của người dùng được được tạo bởi Custom tags trong một file JSP.

- Cấu trúc của Custom Tags trong trang JSP cũng giống như XML tags.

        Các loại thẻ Custom Tags.

·         Empty Tag

Vd. <td:welcome/>
Đây là thẻ không có body cũng như Attribute.

·      Custom tags with Attribute.

    Vd: <td:welcome color= ‘blue”></tdwelcome>

   Đây là loại thẻ Custom Tags có Attribute color là “blue”.

        Custom tags có body.
   Vd:
<td:welcome>
                <%= today_date %>
</welcome>

        Custom tags lồng nhau.

d.            Các phần của Custom Tags.
 Đó là Tag Library Description và Tag Handler
·               Tag Handler
Là đoạn code thực sự xử lý công việc như nêu ở phần ưu điểm phía trên.
·              Tag Library
·              Là nơi mà mô tả.

II. Mô hình làm việc của Custom Tags




Như biểu đồ ta thây khi trình duyệt thực hiện Request lên server ,  request sẽ đi qua JSP engine sau đó. Trong trường hợp này JSP sẽ tìm trong TLD file để tìm hiểu đặc tả cho file đó.
Sau khi chúng ta có Tag rồi thì chúng ta sẽ biết chúng đượ c xử lấy ở đâu, bằng tag handler nào thì nó sẽ gọi đến tag handler đó  và xử lý,  sau đó trả kết quả về cho JSP Engine và JSP Engine trả về cho trình duyệt. Đó là một vòng đời của một JSP file với Custom Tags.

III. Các loại Custom Tags.

a.       Classic Tags
Đây là phiên bản gốc của Custom Tag. Nó cho phép ta dùng các Script Elements để nhúng các dòng code giống như sau vào trang JSP như: <%! Code %>, <%   Code  %>, <%= Expression%>

b.      Cái thứ hai chúng ta có là Simple Tags.
Loại Tags này có cấu trúc đơn giản hơn, chúng ta chỉ việc implement chúng.
Có 2 loại :
Loại thứ nhất là dùng code java, nó giống như cái handler, tuy nhiên trên thực tế thì nó có hơi khác một chút.
Loại thứ 2 dùng làm giao diện Tag File.

Tag Life Cycle.

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

Expression Language

I. Sơ lược Expression Language.

- Nó là một tính năng mới của JSP 2.0 (Các phiên bản trước không có).

- Nó cho phép nhà phát triển JSP có thể truy cập các đối tượng Java thông qua quy ước, dễ sử dụng và nhanh chóng.

- Các biểu thức Expression Language JSP được sử dụng trong:

+ Static text.

+ Stadard and Custom tags.

Cấu trúc của Expression Language là : ${expression}

a. Ưu điểm

- Nhanh chóng, dễ sử dụng.

- Cú pháp dễ dàng cho việc truy xuất vào biến.

VD: $ {sessionScope.username}

- Hỗ trợ các toán tử +, - , * , \

- Các biểu thức JSP EL được ước định tại thời điểm chạy.

II. Biến và thuộc tính (Variable and Attribute)

- Các biến được dùng để lưu trữ, và truy cập lúc cần thiết các giá trị trong chương trình JSP.

- Các biến được quy như một thuộc tính mà được lưu trữ trong một "Standard Scope" như Session, Request, Page, Application.

- Ta có thể truy cập đến giá trị của biến bằng dùng dấu (.) hoặc dấu [] 

Ví dụ: 

                      ${sessionScope.color} = ${sessionScope["color"]}

III. Các implicit Object



Tôi đã làm sẵn một bài demo để các bạn có thể tham khảo. download tại đây

Java Bean Using

I. Java Beans là gì?

Thứ nhất Java Bean là một đối tượng của Java. Nó là một lớp Java đơn giản Nó chứa đựng tất cả các trạng thái cũng như hành vi của  các thành phần của phần mềm.

II. Cấu trúc lớp Java Beans

- Luôn luôn đặt các lớp Java Beans trong package.

- Các hàm khởi tạo của lớp Java Bean không được phép có tham số.

- Getter method được sử  dụng để lấy về thuộc tính của một lớp Java Bean.

- Setter method được sử dụng để gán thuộc tính cho đối tượng của lớp Java Bean.

III. Phạm vi truy cập của Java Beans.

- Khả năng truy cập là thế mạnh của Java Beans vì nó có phạm vi hoạt động rộng, dễ dàng sử dụng

- Java Beans chứa 4 scope sau:

+ Session:  Có thể truy cập trong một Session.

+ Application : Có thể truy cập trong toàn bộ ứng dụng.

+ Page. Có phạm vi truy cập trong trang hiện tại.

+Request. Có phạm vi truy cập trong request hiện thời.

Tóm lại: Nói cho nó dễ hiểu thì nó là thế này: Nếu các bạn đã học lập trình desktop application rồi thì cái thằng JavaBean này nó chính là: 

+ một lớp java bình thường.

+ chứa các thuộc tính, phương thức, hàm khởi tạo không được phép có tham số (bạn không cần viết hàm khởi tạo cho lớp này mặc định sẽ có một hàm khởi tạo không có tham số được tạo ra)  

+ bắt buộc phải để lớp này trong package.

Việc gọi ra và set thuộc tính cho lớp Java Bean trong trang JSP bằng cú pháp:


        <jsp:useBean class="wpsj.entity.User" id="user" scope="session"/>


        <jsp:setProperty name="user" property="name" param="username"/>

thì nó chính là việc bạn tạo đối tượng của một lớp trong lập trình Java Desktop Application. và gán thuộc tính cho đối tượng đó. (Chẳng qua là Java Web cho nên nó khác khác tí :v )

Ok. Dưới đây là bài đề mô (Demo):

Ta sẽ làm một ứng dụng web, có một trang JSP với tên là index chứa input để lấy dữ liệu từ phía người dùng và hiển thị nó ra một trang khác.


Đầu tiên tạo một trang JSP và một form với 2 input như hình dưới:







Tiếp theo tạo một trang JSP khác với tên là "nameProcessor.jsp" (chính là tên trong action của thẻ form)  sau đó viết vào đoạn code dưới.

        <jsp:useBean class="wpsj.entity.User" id="user" scope="session"/>

        <jsp:setProperty name="user" property="name" param="username"/>


        <a href="trangkhac.jsp">Trang khác</a>

Tiếp theo đó tạo một trang Jsp nữa với tên là "trangkhac.jsp" và viết dòng code dưới đây vào trong thẻ <body>.

           <jsp:useBean class="wpsj.entity.User" id="user" scope="session"/>

           <h3>Your name is: <jsp:getProperty name="user" property="name"/></h3>

Ok. Đây là source code của bài Demo. Các bạn có thể download tại đây và demo 2 tại đây


Thứ Ba, 1 tháng 7, 2014

Improved Implicit Object

JSP Implicit Object là gì?

JSP Implicit Object là các đối tượng của Java được chứa sẵn trong JSP Container giúp cho nhà phát triển trong mỗi trang JSP. Nhà phát triển có thể trực tiếp gọi mà không cần tốn công khai báo. Ngoài ra nó còn dùng để gọi các biến đã được khai báo.
Thế nhưng vấn đề ở đây là nó quá dài vào 
JSP hỗ trợ 9 Implicit Objects sau:


Thế nhưng vấn đề lại sinh ra rằng:

Đã khi nào bạn cảm thấy quá phức tạp, lằng nhằng khi phải gõ quá nhiều dòng mã cho việc thao tác với biến trong trang jsp chưa?

<% out.print(session.getAttribute("username"));%>

Dòng code trên đây là một ví dụ điển hình khi ta muốn show ra giá trị của một session (sử dụng object out). Bạn có thấy nó quá dài dòng về cú pháp vì thế dễ dẫn đến nhầm lẫn trong khi viết ?.

Giải pháp

Thay vì phải gõ dòng code chật vật như trên với khả năng nhầm lẫn cao, JSP đã làm sẵn cho ta một số đối tượng để chỉ việc lôi ra dùng một cách nhanh gọn nhằm giảm thiểu sự lằng nhằng, nhầm lẫn. Đó là các Expressions.

${sessionScope.username}

Ok. Bạn đang thắc mắc, khó hiểu làm sao lại thay bằng dòng code trên? OK mình sẽ giải thích cho các bạn, cứ yên tâm là nó very simple, cực kì đơn giản :v. Để dễ hiểu hơn ta lôi 2 dòng code trên xuống làm "CHUỘT BẠCH". 
            <% out.print(session.getAttribute("username"));%>
                                               &
                                ${sessionScope.username}


Ở trên ta sẽ thấy phần màu xanh nước biển ở dòng code trên sẽ có màu tương ứng với phần code dưới và có thêm chữ Scope. Phần chữ màu đỏ ở trên cũng chính là phần chữ màu đỏ ở dưới.

So sánh trên giúp ta hình dung ra được cách đơn giản hơn để nhúng code java vào trang JSP. 

Các Scope căn bản trong trang jsp là: 

- SessionScope: lấy ra đối tượng session.  Tồn tại trong một phiên làm việc.

- RequestScope: lấy ra đối tượng request. Thời gian tồn tại từ khi client gửi request cho đến khi server response.

- PageScope: Tồn tại trong phạm vi một trang.

- ApplicationScope: Tồn tại trong vòng đời của ứng dụng.

Bây giờ chúng ta sẽ làm một demo nho nhỏ biển diễn ứng dụng của những thứ trên .

Đầu tiên tạo một trang jsp với một form gồm 2 input một input có type="text" và một có type="submit" cho phép người dùng nhập vào thông tin về username. Sau đó hiển thị nó ra trong một trang JSP khác, sử dụng Implict



Tiếp đó ta tạo một trang jsp với tên là process và viết vào đó dòng code sau:
           <h1>
            <% 
                String username = request.getParameter("username");
                session.setAttribute("username", username);
                %>
        </h1>
        <a href="Result.jsp">Show</a>
========================================================================
Ở bước trên ta tiến hành lấy thông tin của input và tống nó vào trong session.

Tiếp đến ta tạo một trang JSP với tên là Result.jsp và  sẽ lấy thông tin của session và hiển thị ở đây.
Để hiển thị ta chỉ cần viết vào phần body của trang này các dòng code sau:

                                   <h1>Hello: ${sessionScope.username}</h1>

với username là tên của session đã khởi tạo ở trang process.jsp.

Như vậy là ta đã hoàn thành xong demo và hiểu hơn về Implicit Objects cũng như cách dùng của chúng.

Các bạn có thể Download source code ở đây.