Thứ Tư, 18 tháng 6, 2014

Reflect about your first week's learning

Sau gần 2 tuần áp dụng phương pháp học mới có một số điều tôi đã rút ra được như sau:

I. Những điều đã làm được:
-Hiểu được cách tự học,cách học qua các video.
-Giành nhiều thời gian cho việc tìm hiểu lý thuyết hơn đều hiểu rõ sâu hơn về nội dung lý thuyết.
-Thời gian code tăng lên,niềm đam mê với code ngày một lớn.
-Học được cách học những kỹ năng mới

II.Những điều chưa làm được :
-Khả năng tự học còn chưa cao
-Đôi lúc còn lười biếng,có cảm giác sợ code
-Code của vẫn chưa rõ ràng , chưa nhanh và phải rèn luyện thêm.

-Khả năng làm việc theo nhóm chưa được tốt.

III.Ưu điểm và nhược điểm của cách học này :
*Ưu điểm :
-cách học này rất hay và không bị nhàm chán.
_Nâng cao kĩ năng làm nhóm

-Nâng cao khả năng tự học
*Nhược điểm :
-thời gian ngoài giờ trên lớp của bạn cũng eo hẹp đi
-Không có nhiều thời gian cho các hoạt động khác.

IV.Plan :


+Làm đúng hẹn các bài blog thầy giao về nhà 
+ Cố gắng nghe đọc hiểu hết các bài lý thuyết + demo của thầy
+ Cố gằng hoàn thành các nhiệm vụ mà thầy đặt sẵn cho mỗi 1 hôm học
+ Và áp dụng những gì đã học được vào ass.

JSP - Java Server Pages

JSP - Java Server Pages


Jsp được sử dụng để tạo web động (dynamic web), trong ứng dụng web đa tầng (multi layered web app), JSP được sử dụng làm tầng trình diễn. Nó cũng có khả năng tương tác với tầng ứng dụng (application layer) và tạo ra web động dựa trên business logic.

Khi JSP được gọi lần đầu, nó được trình biên dịch phân tích và biên dịch thành servlet class. Nếu biên dịch thành công, jsp servlet class này sẽ được nạp vào bộ nhớ. Trong lần gọi tiếp theo, servlet clas này đã ở sẵn trong bộ nhớ, tuy nhiên nó có thể được update. Bởi vậy, trình biên dịch sẽ so sánh timestamp của jsp servlet với jsp. Nếu jsp mới hơn thì nó sẽ biên dịch lại. Vì vậy bạn có thể cảm thấy mỗi khi vào trang jsp lần đầu bao giờ cũng thấy chậm hơn các lần sau.

Vòng đời của JSP (Life circle)
1)    Translation: JSP được dịch thành JSP servlet với 3 phương thức: jspInit(), _jspService() và jspDestroy(). VD: public class SimplePage_jsp extends HttpJspBase.
2)    Compilation: JSP servlet được biên dịch sang class

3)    Thực thi các phương thức init() và service() và chuyển về dạng html để hiển thị lên browser.



Một số thành phần của JSP:

 -JSP Scripting Elements được viết bên trong <code> <%%> </ code>. Các mã bên trong <code> <%%> </ code> được xử lý bởi các công cụ JSP trong bản dịch của các trang JSP. Bất kỳ văn bản khác trong trang JSP được coi là HTML hoặc văn bản đơn giản.

-Comment : JSP comment được sử dụng khi bạn đang tạo một trang JSP và muốn đưa vào bình luận về những gì bạn đang làm. JSP comment ​​chỉ nhìn thấy trong trang JSP. Những ý kiến ​​không có trong mã nguồn servlet trong giai đoạn dịch, cũng không xuất hiện trong các phản ứng HTTP. Cú pháp của JSP bình luận như sau : <%-- JSP comment --%> 

  -Declaration : Chúng ta biết rằng ở cuối một trang JSP sẽ được dịch sang lớp Servlet. Vì vậy, khi chúng ta khai báo một biến hoặc các phương thức trong JSP bên trong Declaration Tag  , nó có nghĩa là declaration được thực hiện bên trong lớp Servlet nhưng ngoài phương thức dịch vụ. Bạn có thể khai báo thành viên tĩnh và phương thức trong Declaration Tag. Cú pháp của Declaration Tag : <%! declaration </ i>%>

<%@page import="java.util.Calendar"%>
<%!
    String getSystemTime() {
        return Calendar.getInstance().getTime().toString();
    }
%>

<%
    out.println("Current Time: " + getSystemTime());
%>

  -Expression Language : Expression Language (EL) đã được thêm vào JSP 2,0 . Mục đích của EL là để sản xuất scriptless trang JSP. Cú pháp của EL trong một JSP như sau: <% = JavaExpression%>

  -Scriptlet Tag : Scriptlet Tag cho phép bạn viết mã java trong trang JSP. Cú pháp của Scriptlet Tag như sau :<% <i> mã java </ i>%>

 -Directive Tag : Directive Tag  xung cấp nhứng hướng dẫn đặc biệt cho container Web tại thời điểm trang dịch. Directive tag có 3 loại : page, include and taglib


Attribute
Kiểu giá trị
Giá trị mặc định
language
Scripting language name
"java"
info
String
Depends on the JSP container
contentType
MIME type, character set
"text/html;charset=ISO-8859-1"
extends
Class name
None
import
Fully qualified class name or package name
None
buffer
Buffer size or false
8192
autoFlush
Boolean
"true"
session
Boolean
"true"
isThreadSafe
Boolean
"true"
errorPage
URL
None
isErrorPage
Boolean
"false"
 
VD: errorPage
Đây là trang web phát sinh lỗi. Khi phát sinh lỗi sẽ gọi đến trang errorPage.jsp (directive của trang này phải đặt là isErrorPage = true)


Filter

Filter là một bổ xung mới cho Servlet 2.3, cho phép bạn chắn 1 request trước khi nó tới các tài nguyên. Nói cách khác, filter cho bạn quyền truy cập đến các HttpServletRequest và HttpServletResponse trước khi chúng được chuyển đến 1 servlet.

Filter có thể rất đắc dụng. Ví dụ, bạn có thể viết 1 filter để lưu tất cả các request được gửi đến và log địa chỉ IP của các máy gửi request. Bạn cũng có thể sử dụng filter như một phương tiện để mã hóa và giải mã. Cũng có thể dùng để xác thực user, nén dữ liệu, xác thực dữ liệu..vv...

Khi viết 1 filter, về cơ bản bạn sẽ làm việc với 3 interface trong package javax.servlet:
1)    Filter
2)    FilterConfig
3)    Filter Chain

Filter interface

Vòng đời (life circle của 1 filter gồm 3 method):
1)    public void init(FilterConfig filterConfig)
2)    public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
3)    public void destroy()

FilterConfig interface

Bao gồm các phương thức:
1)    getFilterName: Trả về tên của filter
2)    getInitParameter(String): trả về giá trị của param tương ứng của para-name
3)    getInitParameterNames(): trả về tập giá trị của tên tham số khởi tạo của filter. Dữ liệu trả về là Enumeration của String.
4)    getServletContext(): trả về tham chiếu tới ServletContext của filter.

FilterChain interface

Có thể sử dụng nhiều hơn 1 filter. VD: 2 filter Filter và Filter1 áp dụng cho cùng 1 servlet FilteredServlet.


Demo(Tiếp nối bài assignment)
     Đầu tiên, ta sẽ thử gõ link :http: //localhost:8080/Assignment/home.jsp . Ta thấy mặc dù chưa đăng nhập nhưng vẫn vào đc trang home.jsp


    Hướng dẫn các bạn sử dụng filter để khắc phục lỗi trên

   Bước 1: Tạo 1 file filter trong packages wpsj.filter

                  







                  Ấn next, chọn ô add information...,nhap Url
  


Code sinh ra tai Web.xml



        


Bước 2:  code cho trang HomeFilter.java vừa tạo.
    
        


Kết quả :

       Chạy trang Home.jsp
 
 :
    Trang Home.java đã không chạy được và chuyển lại trang Login,dù trên link đường đẫn vẫn tới trang home,jsp



Source code:

Thứ Ba, 17 tháng 6, 2014

Use cookie


 Tổng quan về cookie:

Cookie là 1 đoạn dữ liệu được ghi vào đĩa cứng hoặc bộ nhớ của máy người sử dụng. Nó được trình duyệt gởi ngược lên lại server mỗi khi browser tải 1 trang web từ server.

Những thông tin được lưu trữ trong cookie hoàn toàn phụ thuộc vào website trên server. Mỗi website có thể lưu trữ những thông tin khác nhau trong cookie, ví dụ thời điểm lần cuối ta ghé thăm website, đánh dấu ta đã login hay chưa, v.v…

Cookie được tạo ra bởi website và gởi tới browser, do vậy 2 website khác nhau (cho dù cùng host trên 1 server) sẽ có 2 cookie khác nhau gởi tới browser. Ngoài ra, mỗi browser quản lý và lưu trữ cookie theo cách riêng của mình, cho nên 2 browser cùng truy cập vào 1 website sẽ nhận được 2 cookie khác nhau.


-Cookie được lưu bởi server và gửi về client cùng response. Request được gửi tới server cùng với cookie nhưng ko thay đổi giá trị của cookie. Giá trị của cookie được lưu trong bộ nhớ (ổ cứng ) của client.
VD1: lưu cookie (sử dụng response)
Cookie c1 = new Cookie("userName", "Helen");
            Cookie c2 = new Cookie("password", "Keppler");
            c2.setMaxAge(300);
            response.addCookie(c1);
            response.addCookie(c2);
Cookie được chia làm 2 loại là cookie bị xóa ngay sau khi đóng trình duyệt. Loại thứ 2 gọi là persisting cookies, loại là c2 trong ví dụ trên. Ta sử dụng setMaxage(int) để đặt tuổi theo giây cho cookie.
VD2: Đọc giá trị của cookies:
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
   Cookie cookie = cookies[i];
   out.println("Name->" + cookie.getName() + " Value->" + cookie.getValue());

}

Demo sử dụng cookie

B1:Tạo mới web project
B2:Trong index.html ,tạo 1 form login code như hình dưới đây:


B3:Tạo trang LoginServlet,với đoạn code như dưới đây:



Chạy ứng dụng,ta được giao diện trang login như sau


Sau khi đăng nhập,ta thông tin cookie sẽ được lưu,ở đây ta sẽ hiên thị ra thông tin của cookie




Source code:link




Kết nối cơ sở dữ liệu trong Java Web bằng JDBC

Đối với phần lớn những ứng dụng được xây dựng trên thực tế, việc lưu trữ thông tin trong cơ sở dữ liệu là hết sức quan trọng. Với lượng dữ liệu khổng lồ mà các ứng dụng này thường xuyên phải lưu trữ và xử lý trong quá trình hoạt động thì việc sử dụng một hệ quản trị cơ sở dữ liệu (Database Management System - DBMS) là điều không thể thiếu được khi triển khai ứng dụng.
           -Hôm nay ta sẽ xây dựng 1 ứng dụng web application sử dụng kết nối JDBC với Sql Server.
B1:Tạo mới cơ sở dữ liệu ,có nội dụng như sau:
-SocialNetwork database

B2:Sau đó ta tiến hành tạo một project Web application
B3:Chèn thêm thư viện sqljdbc4.Ta chọn chuột phải vào Librabries/Add jar or folder


B4:Tao class DataAccess,class này chứa các câu lệnh kết nối với database




Code kết nối với database trong class DataAccess:


B5:Tạo class User,Posts,UserDB với nội dung code như sau:


class User,khai báo các trường,khởi tạo constructor

class Posts,khai báo các trường,khởi tạo constructor


Hàm checkLogin trong class UserDB



Ham getAllPosts trong class UserDB

B6:Tao LoginServlet để thực hiện chức năng đăng nhập





B7:Tạo HomeServlet để hiên thị tên người dùng và xem toàn bộ danh sách post



Chạy ứng dụng:
Giao diện trang login

Sau khi đăng nhập thành công,kết quả như sau:


Hy vọng với những hướng dẫn cơ bản của tôi các bạn sẽ tạo được một ứng dụng sử dụng kết nối JDBC với Sql Server đơn giản.



Source code:link












Thứ Bảy, 14 tháng 6, 2014

ServletContext

Servlet context dùng để duy trì trạng thái cho ứng dụng web.Tồn tại một context cho mỗi ứng dụng web trên một máy ảo java.

Đối tượng Servlet context biểu diễn các tài nguyên dùng chung cho một nhóm các servlet bao gồm các thông tin về môi trường như là tên của server,một phương thức log() để ghi lại nhật ký vào file log của server.Ngoài ra Servlet còn cho phép các servlet trong cùng một context có thể dùng chung thông tin thông qua các thuộc tính context điều này tương tự như thuộc tính session dùng để lưu vết trạng thái của trình khách trên server.

-Một số method() của Servlet Context

+getAttribute(String name):trả về các thuộc tính với tên được chỉ định ,hoặc null nếu không có thuộc tính bằng tên đó.

+getIntParameter(String name):trả về giá trị tham số với tên được chỉ định,hoặc null nếu tên không tồn tại.

+setAttribute(String name,Object obj):thiết lập một đối tượng với tên thuộc tính được đưa ra trong pham vi áp dụng.

+removeAttribute(String name):loại bỏ các thuộc tính với tên được chỉ định.

+getContext(String uripath):Trả về một đối tượng ServletContext tương ứng với một URL được chỉ định trên máy chủ.

Còn nhiều method khác nữa,các bạn tham khảo thêm tại đây:link



Demo:

B1:Tạo mới project
B2:Tạo 2 Servlet Page1 và Page2



B3:Sau khi tạo 2 Servlet ta tiến hành xử lý code như hình dưới đây:




B4:Chạy ứng dụng:





Kết quả: Mỗi lần refresh page1,page2 sẽ tăng lên 1 đơn vi.








Thứ Sáu, 13 tháng 6, 2014

Session

Session – Lưu dấu session

Vì phương thức HTTP là stateless (ko lưu các thông tin lịch sử), điều này ảnh hưởng sâu sắc đến lập trình ứng dụng web. Có 4 kỹ thuật để lưu dấu session:
1)    URL rewritting – Thêm các tham số vào cuối URL
2)    Hidden fields – Sử dụng các trường ẩn
3)    Cookies – Sử dụng cookie để trao đổi dữ liệu giữa client và server
4)    Session objects – Sử dụng các đối tượng có phạm vi (scope) là session để truyền thông tin.

URL Rewritting:

VD: Http://localhost:8080/Demo/test?x=abc&y=xyz
Phần sau ?x=abc&y=xyz là phần được thêm vào để truyền 2 parameter x và y
Để lấy giá trị này ta dùng lệnh request.getParameter(“x”), tương tự với y.

Hidden fields:

<INPUT TYPE=HIDDEN Name=hField VALUE="abc”>
Để lấy giá trị này ta dùng lệnh request.getParameter(“hField”).

Cookies:

Cookie được lưu bởi server và gửi về client cùng response. Request được gửi tới server cùng với cookie nhưng ko thay đổi giá trị của cookie. Giá trị của cookie được lưu trong bộ nhớ (ổ cứng ) của client.
VD1: lưu cookie (sử dụng response)
Cookie c1 = new Cookie("userName", "Helen");
            Cookie c2 = new Cookie("password", "Keppler");
            c2.setMaxAge(300);
            response.addCookie(c1);
            response.addCookie(c2);
Cookie được chia làm 2 loại là cookie bị xóa ngay sau khi đóng trình duyệt. Loại thứ 2 gọi là persisting cookies, loại là c2 trong ví dụ trên. Ta sử dụng setMaxage(int) để đặt tuổi theo giây cho cookie.
VD2: Đọc giá trị của cookies:
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
   Cookie cookie = cookies[i];
   out.println("Name->" + cookie.getName() + " Value->" + cookie.getValue());
}

Session objects:

HttpSession session = request.getSession(true);
      session.setAttribute("loggedIn", new String("true"));

Vì có phạm vi (scope) là sesion nên giá trị này có thể được đọc bởi các servlet (hoặc JSP) khác.

Ở đây ta sẽ làm demo sử dụng session object,các bước thực hiện như sau:

B1:Tạo mới project
B2:Trong trang index tao form gồm textbox username và nút submit


B3:Tạo LoginServlet để nhận thông tin để truyền vào session object




B3:Tạo HomeServlet để lấy thông tin session hiển thị ra,lưu ý khi sử dụng phương thức getAttribute() ta phải ép kiểu.


Kết quả:Giao diện trang Index



Sau khi nhấn submit thông tin session đã được nhận


Hiển thị session



LoginwithMockData&Session:link



Use request dispatcher


Request dispatcher gồm 2 phương thức là include (để lấy nội dung của một trang khác vào servlet hiện thời. Phương thức forward để chuyển đến 1 URL khác. Bạn có thể lấy RequestDispatcher theo 1 trong 3 cách sau:
·         Sử dụng phương thức getRequestDispatcher của javax.servlet.ServletContext interface, tham số truyền vào là chuỗi chứa đường dẫn tới tài nguyên khác. Đường dẫn là đường dẫn tương đối với gốc của ServletContext.  
·         Sử dụng phương thức getRequestDispatcher của javax.servlet.ServletRequest interface, tham số truyền vào là chuỗi chứa đường dẫn tới tài nguyên khác. Đường dẫn là tương đối với HTTP request hiện hành. Đường dẫn có thể là tương đối nhưng nó ko thể mở rộng ra ngoài servlet context hiện hành.
·         Sử dụng phương thức getNamedDispatcher của javax.servlet.ServletContext interface, tham số truyền vào là chuỗi chứa tên của tài nguyên khác (VD: tên 1 servlet được định nghĩa trong web.xml).
 Sự khác biệt giữa 2 phương thức này là javax.servlet.Context.getRequestDispatcher() có thể dùng đường dẫn tương đối.

request.getRequestDispatcher("/index.jsp").include(request, response);
request.getRequestDispatcher("/index.jsp").forward(request, response);


forward() method:



Include() method:


Demo:Implement an application as following:

Depends of the question, GateKeeper will forward request to corresponding Answers.

Bước 1:Tạo mới một Project
Bước 2:Tạo thêm 1 trang none.jsp nếu câu hỏi ta nhập vào la sai.



Bước 3:Tại trang Index tạo form chứa 1 textbox và 1 nút submit để gửi thông tin đi


Bước 4:Tạo GateKeeper Servlet để nhận thông tin từ trang Index.html,và sẽ kiểm tra xem thông tin nhập từ trang Index có đúng hay không,nếu thông tin đúng sẽ chuyển tiếp tới Response Servlet,còn thông tin sai sẽ về trang None.jsp


Bước 5:Override phương thức init() để thêm dữ liệu



 Bước 6:Tạo phương thức forward để request va response thông tin


Bươc 7:Tạo Response Servlet để tiếp nhận và trả thông tin


Kết quả: Giao diên tại trang Index



Giao diên khi câu hỏi đúng


Giao diên khi câu hỏi sai