I. Điều tôi thấy :
-Tôi thấy cách học này làm cho ta mất khá nhiều thời gian vào việc tra cứu lý thuyết trên mạng do đó thời gian thực code bị giảm đi rất nhiều.
-Tôi thấy việc học với video khó tiếp cận code hơn nhiều so với học ở trên lớp.
-Tôi thấy mình đã đầu tư thời gian hơn rất nhiều cho việc học nhờ cách học này.
II.Điều cảm nhận được :
-Code cũng không nhàm chán như tôi nghĩ .
-Cảm thấy do tôi lười nên kết quả không cao chứ không phải do bài quá khó.
-Cảm thấy có thể làm được 1 trang web tương tự như facebook nếu chịu đầu tư nhiều thời gian và công sức hơn nữa.
-Cảm thấy việc code một trang web trên netbean khó hơn nhiều so với công cụ visual studio đã học trước đây
III.Điều tôi còn hạn chế :
-Code vẫn chưa rõ ràng còn lan man.
-Code vẫn hay gặp những lỗi nhảm do thiếu cẩn thận dẫn đến tốn rất nhiều thời gian để chỉnh sửa
-Chưa thuần thục được nhiều câu lệnh nên đôi khi phải mất thời gian tra cứu bài cũ
-Nhiều bài cũ còn chưa hiểu rõ được vấn đề
IV.Ưu điểm và nhược điểm của cách học này :
*Ưu điểm :
-Tôi thấy cách học này không bị nhàm chán.
-Gây nhiều áp lực hơn để giúp tôi có thể ngồi lên bàn làm việc
*Nhược điểm :
-Mất quá nhiều thời gian nhưng lại không thể hoàn thành bài thật tốt như là có giao diện đẹp , chức năng trơn tru vì tgian viết blog quá dài
-Video tuy ngắn nhưng chất lượng âm thanh và khả năng truyền đại không thể bằng việc học trực tiếp trên lớp
VI.Dự định của tôi :
_Làm đúng hẹn các bài blog thầy giao về nhà
Thứ Tư, 18 tháng 6, 2014
filter
Định nghĩa :
_Filter là một công cụ hoạt động như một giao diện giữa các client và ứng dụng web ví dụ như giữa JSP và servlet trên server .
_Filter được coi là thành phần để ta có thể sử dụng và thiết lập các cấu hình nhằm thực thi hành động lọc để kiểm tra sự chính xác trong truy suất.Filter có thể ghi lại các thông tin truy suất đến một tài nguyên nhất định, chuyển đổi dữ liệu.
Các bước làm việc của Filter :
Khi nhận được yêu cầu ServletFilter sẽ kiểm tra bộ lọc có Url trùng với Url được yêu cầu hay không.
Nếu trùng thì yêu cầu sẽ được thực thi.Nếu không trùng thì yêu cầu sẽ bị chặn lại.Điều này tiếp tục cho đến khi không có bộ lọc với các mẫu Url phù hợp thì thôi.
Sau khi nhận được yêu cầu servlet sẽ trả về (response) cho người dùng.Filter được áp dụng cho các yêu cầu là bộ lọc đầu tiên áp dụng cho các phản ứng.Phản ứng được thông qua web container và kết thúc.
Demo : bạn có thể tham khảo code ở đây : demo
Tạo 1 web application ở index ta code như sau :
Ta tạo trang home.jsp và login.jsp để lấy môi trường cho filter làm việc
Sau đó ở Packages ta tạo 1 filter ở categories Web
Sau đó chọn next, ở đây ta chọn new và dẫn đường link là trang home.jsp vào
Sau khi tạo class filter ta code như sau :
_Filter là một công cụ hoạt động như một giao diện giữa các client và ứng dụng web ví dụ như giữa JSP và servlet trên server .
_Filter được coi là thành phần để ta có thể sử dụng và thiết lập các cấu hình nhằm thực thi hành động lọc để kiểm tra sự chính xác trong truy suất.Filter có thể ghi lại các thông tin truy suất đến một tài nguyên nhất định, chuyển đổi dữ liệu.
Khi nhận được yêu cầu ServletFilter sẽ kiểm tra bộ lọc có Url trùng với Url được yêu cầu hay không.
Nếu trùng thì yêu cầu sẽ được thực thi.Nếu không trùng thì yêu cầu sẽ bị chặn lại.Điều này tiếp tục cho đến khi không có bộ lọc với các mẫu Url phù hợp thì thôi.
Sau khi nhận được yêu cầu servlet sẽ trả về (response) cho người dùng.Filter được áp dụng cho các yêu cầu là bộ lọc đầu tiên áp dụng cho các phản ứng.Phản ứng được thông qua web container và kết thúc.
Demo : bạn có thể tham khảo code ở đây : demo
Tạo 1 web application ở index ta code như sau :
Ta tạo trang home.jsp và login.jsp để lấy môi trường cho filter làm việc
Sau đó ở Packages ta tạo 1 filter ở categories Web
Sau đó chọn next, ở đây ta chọn new và dẫn đường link là trang home.jsp vào
Sau khi tạo class filter ta code như sau :
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
RequestDispatcher rd = request.getRequestDispatcher("Login.jsp");
rd.forward(request, response);
}
Thứ Ba, 17 tháng 6, 2014
GIới thiệu về JSP
Khái niệm : JSP (JavaServer Pages) còn được gọi là Java Scripting Preprocessor - Bộ tiền xử lý câu lệnh java là công nghệ java cho phép các nhà phát triển tạo nội dung cho HTML , XML hoặc 1 định dạng khác của trang web có chức năng động.....
JSP cho phép người dùng nhúng mã java vào một số hành động xử lý đã được định trước vòa nội dung của trang
Các elements của JSP :
Comments : khi bạn tạo ra 1 jsp và muốn thêm bình luận về những gì bạn đang làm.Chức năng này giúp code dễ hiểu hơn.
Declarations : ở cuối một trang JSP được dịch sang lớp Servlet, do đó khi ta khai báo 1 biến hoặc các phương thức trong JSP bên trong Declaration tag.Declaration được thực hiện bên trong lớp servlet nhưng ở ngoài phương thức dịch vụ.
Directives : chi phối thông báo biên dịch JSP cho nhập nội dung của tập tin vào trong nội dung hiện có.Việc này tương tự việc chúng ta lấy thông tin của tập tin và dán trực tiếp nội dung của bạn đang dùng.
Expressions : sinh ra với mục đích scriptless của trang JSP
Scriptlets : cho phép bạn biết mã java trong trang JSP
Các element action của JSP :
jsp :include : Tương tự như mục đích sử dụng một thủ tục con (subroutine), Java servlet tạm thời trao nhiệm vụ đặt yêu cầu và hồi âm cho trang JavaServer (JavaServer Page) chỉ định nào đấy. Quyền khống chế sẽ được hoàn lại cho trang JSP hiện tại, một khi trang JSP kia hoàn thành nhiệm vụ của nó. Dùng phương pháp này, mã trang JSP được chia sẻ với nhiều trang JSP, thay vì phải sao mã.
jsp :forward : Được dùng để trao nhiệm vụ đặt yêu cầu và hồi âm sang cho một trang JSP khác, hoặc cho một servlet khác. Quyền khống chế sẽ được hoàn trả lại cho trang JSP hiện tại.
jsp :fallback : Phần nội dung sẽ được hiển thị nếu trình duyệt web không hỗ trợ chương trình nhỏ (applets).
Lợi ích của JSP :
- Dễ dàng sử dụng , người dùng có thể làm việc với JSP mà không cần phải học cách viết java scriplet.
- Chứa tất cả các ưu điểm của Java
- Dễ dàng phát triển hơn là servlet
- Có các thẻ Library ( javaserver pages standard tag library) để làm việc thuận tiện, tránh viết đi viết lại
Hạn chế :
- Tuy được cải tiến so với Java Servlet tuy nhiên JSP vẫn được coi là công nghệ làm việc tương đối vất vả
- Yêu cầu không gian lưu trữ lớn hơn nhiều java servlet
JSP cho phép người dùng nhúng mã java vào một số hành động xử lý đã được định trước vòa nội dung của trang
Các elements của JSP :
Syntax Elements
|
Standard Syntax
|
XML Syntax
|
---|---|---|
Comments
|
<%--.. --%>
|
<!-- .. -->
|
Declarations
|
<%! ..%>
|
<jsp:declaration> .. </jsp:declaration>
|
Directives
|
<%@ include .. %>
|
<jsp:directive.include .. />
|
<%@ page .. %>
|
<jsp:directive.page .. />
| |
<%@ taglib .. %>
|
xmlns:prefix="tag library URL"
| |
Expressions
|
<%= ..%>
|
<jsp:expression> .. </jsp:expression>
|
Scriptlets
|
<% ..%>
|
<jsp:scriptlet> .. </jsp:scriptlet>
|
Declarations : ở cuối một trang JSP được dịch sang lớp Servlet, do đó khi ta khai báo 1 biến hoặc các phương thức trong JSP bên trong Declaration tag.Declaration được thực hiện bên trong lớp servlet nhưng ở ngoài phương thức dịch vụ.
Directives : chi phối thông báo biên dịch JSP cho nhập nội dung của tập tin vào trong nội dung hiện có.Việc này tương tự việc chúng ta lấy thông tin của tập tin và dán trực tiếp nội dung của bạn đang dùng.
Expressions : sinh ra với mục đích scriptless của trang JSP
Scriptlets : cho phép bạn biết mã java trong trang JSP
Các element action của JSP :
jsp :include : Tương tự như mục đích sử dụng một thủ tục con (subroutine), Java servlet tạm thời trao nhiệm vụ đặt yêu cầu và hồi âm cho trang JavaServer (JavaServer Page) chỉ định nào đấy. Quyền khống chế sẽ được hoàn lại cho trang JSP hiện tại, một khi trang JSP kia hoàn thành nhiệm vụ của nó. Dùng phương pháp này, mã trang JSP được chia sẻ với nhiều trang JSP, thay vì phải sao mã.
jsp :forward : Được dùng để trao nhiệm vụ đặt yêu cầu và hồi âm sang cho một trang JSP khác, hoặc cho một servlet khác. Quyền khống chế sẽ được hoàn trả lại cho trang JSP hiện tại.
jsp :fallback : Phần nội dung sẽ được hiển thị nếu trình duyệt web không hỗ trợ chương trình nhỏ (applets).
Lợi ích của JSP :
- Dễ dàng sử dụng , người dùng có thể làm việc với JSP mà không cần phải học cách viết java scriplet.
- Chứa tất cả các ưu điểm của Java
- Dễ dàng phát triển hơn là servlet
- Có các thẻ Library ( javaserver pages standard tag library) để làm việc thuận tiện, tránh viết đi viết lại
Hạn chế :
- Tuy được cải tiến so với Java Servlet tuy nhiên JSP vẫn được coi là công nghệ làm việc tương đối vất vả
- Yêu cầu không gian lưu trữ lớn hơn nhiều java servlet
Cookie in Servlet
Định nghĩa : cookie là một biến được lưu trữ trên máy tính của người truy cập . Mỗi khi trình duyệt kết nối tới máy chủ , các thông tin lưu trong cookie sẽ được gửi cùng lên máy chủ . Nhờ những thông tin này , các nhà thiết kế Web sẽ theo dõi được những hành vi của người sử dụng thông qua cookie . Nói một cách đơn giản cookie là một dạng bản ghi được tạo ra và lưu lại trên trình duyệt khi người dùng truy cập một website.
Lợi ích :
_ Sử dụng với mục đích thương mại để làm các trang web mua hàng trực tuyến , máy chủ sau khi sử dụng cookie có thể theo dõi khách hàng , sao lưu giao dịch và lịch sử mua hàng của khách hàng
_Sử dụng như một công cụ giúp người dùng dễ dàng lưu trữ các thông tin , lịch sử trong khi dùng.Tạo cho trình duyệt một cách dễ dàng , thuận tiện hơn,
_Làm các bước vào 1 trang web đơn giản hơn không tốn thời gian
Nhược điểm :
_Dễ phát tán mã độc
_Dễ bị mất thông tin cá nhân của người dùng ở những máy công cộng
Bài tập yêu cầu : bài toán yêu cầu viết demo chức năng lưu cookie tên đăng nhập của 1 ứng dụng login vào trong trình duyệt
Hướng giải quyết : ở đây tôi sẽ sử dụng trang login đã làm ở blog trước và sau đó thêm phương thức addCookie cho trang servlet chức năng login
Bài làm :
Bước 1 : tạo 1 web application sau đó trang index bạn code như sau :
Bước 2 : trong source packages ta tạo 1 servlet có tên là login thực thi action login và add cookie như sau :
Sau đó chạy và nhận được kết quả như sau : Bạn có thể down code ở đây
Thứ Hai, 16 tháng 6, 2014
Buiding Web Application Using JDBC
Yêu cầu đề bài : Xây dựng 1 ứng dụng web có chức năng Login và show ra các post của bản thân và bạn bè chủ tài khoản đã đăng nhập.Trong đó chúng ta phải lấy thông tin user name, password, post và các thông tin của post qua 1 database có sẵn.
Các công cụ để làm bài toán :
+ Thư viện sqljdbc4.bạn có thể download tại đây :SQLJDBC4 và add trong netbeans như sau :
+ File Css login và table tôi đã sử dụng : CSS
Bài làm :
+ Thành quả : bạn có thể down ở đây
Tạo một web application sau đó trang index tôi sẽ code như sau :
Sau đó tạo class lấy thông tin login.Ở đây của tôi là Validate.java .Class này có mục đích là kết nối với sql và lấy thông tin user , password. Thông qua thư viện mà ta đã add bằng cách sử dụng driver ta sẽ sử dụng câu lệnh sau :
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Sau đó là class check login. có nhiệm vụ kiểm tra thông tin nhập vào với thông tin đã lấy ở trong class validate.java .Ở đây tôi code như sau :
Sau khi đã xong phần login.tôi sẽ chuyển login đến 2 trang khác nhau.Khi ta login thành công sẽ đến trang welcome và nếu k thành công người dùng sẽ nhận được thông báo và giữ nguyên.
Trang welcome.java có chức năng là show là các post có sẵn trên database và hiển thị nó thành 1 table
Các công cụ để làm bài toán :
+ Thư viện sqljdbc4.bạn có thể download tại đây :SQLJDBC4 và add trong netbeans như sau :
chọn chuột trái vào mục libaries chọn Add Jar/Folder |
vào thư mục thư viện vừa down tìm file sqljdbc4.jar sau đó open |
Bài làm :
+ Thành quả : bạn có thể down ở đây
Form login |
Sau khi login vào tài khoản ta sẽ xem được những post mà tài khoản ấy viết |
Tạo một web application sau đó trang index tôi sẽ code như sau :
Sau đó tạo class lấy thông tin login.Ở đây của tôi là Validate.java .Class này có mục đích là kết nối với sql và lấy thông tin user , password. Thông qua thư viện mà ta đã add bằng cách sử dụng driver ta sẽ sử dụng câu lệnh sau :
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Sau đó là class check login. có nhiệm vụ kiểm tra thông tin nhập vào với thông tin đã lấy ở trong class validate.java .Ở đây tôi code như sau :
Sau khi đã xong phần login.tôi sẽ chuyển login đến 2 trang khác nhau.Khi ta login thành công sẽ đến trang welcome và nếu k thành công người dùng sẽ nhận được thông báo và giữ nguyên.
Trang welcome.java có chức năng là show là các post có sẵn trên database và hiển thị nó thành 1 table
Thứ Sáu, 13 tháng 6, 2014
Session in JavaServlet
Có 4 kĩ thuật xử lý các session đó chính là url rewriting , persistent cookies ,hidden FormVariables và Servlet API để tránh phạm vi tôi xin gửi bạn các link chi tiết để các bạn có thể tim hiểu JSP-Servlet.doc
Bài tập yêu cầu kết hợp 2 phương thức đã học là Mockdata và Session để làm làm ứng dụng Login with Mockdata
Đây là trang login đầu tiên tôi viết bằng Netbean : Demo
Kết quả thu được :
Giao dien login |
Khi ta dang nhap sai hoac khong nhap ki tu |
Hướng dẫn làm bài : Trước hết để có giao diện đẹp tôi đã sử dụng file css sau đây : CSS
Sau đó ta xử lý code trong class index như hình :
Sau đó đến ta tạo class User để thêm các trường tài khoản.Code như sau :
Tạo servlet LoginServlet để add data cho user và kiểm tra đăng nhập bằng đoạn code :
private static List<User> userList;
@Override
public void init(ServletConfig config) throws ServletException {
userList = new LinkedList<User>();
userList.add(new User("thanhntgc00493", "123thanh"));
}
public static List<User> getUser() {
return userList;
}
Kiểm tra đăng nhập bằng doạn code :
public User checkLogin(String user, String pass) {
for (int i = 0; i < this.userList.size(); i++) {
if (this.userList.get(i).getUsername().contains(user) && this.userList.get(i).getPassword().contains(pass)) {
return this.userList.get(i);
}
}
return null;
}
Ở đây chúng ta áp dụng mockdata để thay database bổ xung dữ liệu.
Servlet Context
Link bài demo : Demo
Servlet context dùng để duy trì
trạng thái cho ứng dụng web.Nó được tạo ra bởi các đối tượng container và sử dụng thông tin từ class web.xml
Để hiểu chi tiết hơn về servlet context tôi xin trích dẫn những thông tin cần thiết tại nguồn sau
Các phương thức của Servlet Context
|
|
java.lang.Object |
getAttribute (java.lang.String name)
Returns the servlet container attribute with the given name, or null
if there is no attribute by that name. |
java.util.Enumeration |
getAttributeNames ()
Returns an Enumeration
containing the attribute names available within this servlet context. |
getContext (java.lang.String uripath)
Returns a ServletContext
object that corresponds to a specified URL on the server. |
|
java.lang.String |
getInitParameter (java.lang.String name)
Returns a String
containing the value of the named context-wide initialization parameter, or null
if the parameter does not exist. |
java.util.Enumeration |
getInitParameterNames ()
Returns the names of the context's initialization parameters as an Enumeration
of String objects, or an empty Enumeration
if the context has no initialization parameters. |
int |
getMajorVersion ()
Returns the major version of the Java Servlet API that this servlet container supports. |
java.lang.String |
getMimeType (java.lang.String file)
Returns the MIME type of the specified file, or null if the
MIME type is not known. |
int |
getMinorVersion ()
Returns the minor version of the Servlet API that this servlet container supports. |
getNamedDispatcher (java.lang.String name)
Returns a RequestDispatcher
object that acts as a wrapper for the named servlet. |
|
java.lang.String |
getRealPath (java.lang.String path)
Returns a String
containing the real path for a given virtual path. |
getRequestDispatcher (java.lang.String path)
Returns a RequestDispatcher
object that acts as a wrapper for the resource located at the given path. |
|
java.net.URL |
getResource (java.lang.String path)
Returns a URL to the resource that is mapped to a specified path. |
java.io.InputStream |
getResourceAsStream (java.lang.String path)
Returns the resource located at the named path as an InputStream
object. |
java.lang.String |
getServerInfo ()
Returns the name and version of the servlet container on which the servlet is running. |
getServlet (java.lang.String name)
Deprecated. As of Java Servlet API 2.1, with no direct replacement. ServletContext . In this
version, this method always returns null
and remains only to preserve binary compatibility. This method will be
permanently removed in a future version of the Java Servlet API. In lieu of this method, servlets can share information using the ServletContext class and can
perform shared business logic by invoking methods on common non-servlet
classes. |
|
java.util.Enumeration |
This method was originally defined to return an Enumeration of all the servlet
names known to this context. In this version, this method always returns an
empty Enumeration
and remains only to preserve binary compatibility. This method will be
permanently removed in a future version of the Java Servlet API. |
java.util.Enumeration |
This method was originally defined to return an Enumeration of all the servlets
known to this servlet context. In this version, this method always returns an
empty enumeration and remains only to preserve binary compatibility. This
method will be permanently removed in a future version of the Java Servlet
API. |
void |
log (java.lang.Exception exception,
java.lang.String msg) Deprecated. As of Java Servlet API 2.1, use log(String
message, Throwable throwable) instead. |
void |
|
void |
log (java.lang.String message,
java.lang.Throwable throwable) Writes an explanatory message and a stack trace for a given Throwable
exception to the servlet log file. |
void |
removeAttribute (java.lang.String name)
Removes the attribute with the given name from the servlet context. |
void |
setAttribute (java.lang.String name,
java.lang.Object object) Binds an object to a given attribute name in this servlet context. |
Demo : bài làm đếm số lượt truy cập vào website
Hướng dẫn làm bài : tạo 1 web application trong đó ta tạo thêm 2 servlet là page1 và page2.các bạn vui lòng trờ về các blog trước để xem hướng dẫn cụ thể.Sau đó thêm phương thức đếm cho các class như sau
Sau đó ở trong thẻ <body> của mỗi servlet ta thêm đoạn code out.println("<h1>Số lượt xem trang :"+count+ "</h1>") để hiển thị ra giá trị count
Sau đó ta sẽ được kết quả :
Dispatcher
Là một quá trình xử lý các mã lệnh từ client lên server để gửi lại các mã lệnh phù hợp .Nói cách khác khi một người dùng muốn truy cập vào một website , trang web đó sẽ yêu cầu thông tin từ phía người dùng (slient) sau đó server sẽ làm việc với nó và cho phép người dùng truy cập
Quá trình dispatcher này phải qua 2 phương pháp quan trọng đó là forward và include.
Forward là phương pháp giúp chuyển tiếp 1 request từ 1 servlet tới tài nguyên khác trong server
Include là phương pháp giúp thêm các nội dung từ 1 servlet trong response
Bài test demo :demo
+ Nội dung yêu cầu :
+ Hướng dẫn làm bài :
Áp dụng các bài đã học để tạo ra web application với 3 servlet và 1 trang Jsp.bạn có thể tham khảo ở đây Link. Trong đó 3 servlet lần lượt là
GateKeeper dùng để load lên các data cần thiết
và tạo phương thức foward() để Request và Respon thông tin
ResponseServlet dùng để thêm các nội dụng để trả lời các thông tin mà minh đã lựa chọn ở trang index
trong class này ta sẽ sử dụng đoạn code :
RequestDispatcher rd = request.getRequestDispatcher("bannerServlet");
rd.include(request, response);
String choice = request.getParameter("choicess");
để kết nối với bannerservlet và xác nhận lựa chọn của người dùng
Class Jsp ta sẽ tạo có tên là error.jsp có tác dụng là thông báo lỗi khi người dùng chọn sai giá trị đã yêu cầu ở trang index
+ Kết quả :
Thứ Năm, 12 tháng 6, 2014
Mock Data
Thư viện mock data là một công cụ để có thể tự động tao ra các "fake data" khác nhau định dạng trong bộ nhớ như tên người , công ty....
Mock data cho phép các lập trình viên nhanh chóng tạo ra một lượng lớn dữ liệu để người dùng có thể tải trực tiếp vào môi trường làm việc
Demo mock data mock data
Các bước thực hiện : ta tạo 1 project java web application như ở bài Web Development đã hướng dẫn
sau đó ở class index.html code như hình
Mock data cho phép các lập trình viên nhanh chóng tạo ra một lượng lớn dữ liệu để người dùng có thể tải trực tiếp vào môi trường làm việc
Demo mock data mock data
Các bước thực hiện : ta tạo 1 project java web application như ở bài Web Development đã hướng dẫn
sau đó ở class index.html code như hình
Sau đó ở Folder web page dùng chuột trái chọn new > other > web > cascading style sheet
chọn next rồi đặt tên cho class là stylesheet.css .Class này sẽ là nơi chứa các nội dung giao diện của bài
Sau đó ở folder Source Packages dùng chuột trái chọn new > other > Java > Java Class
Chọn next rồi đặt tên cho class và package như hình
Ấn finish và thêm các entity
Chuột phải Source Packages > New > Other >Java > Java Class > đặt tên cho lớp là DataOfStudent và packages là :Source > next.Bên trong class này ta sẽ tạo 1 list các danh sách hiển thị
Chuột phải Source Packages > New > Other >Java > Servlet > đặt tên cho lớp là Mockdata và packages là :servlet > next > tích vào ô Add information to deployment descriptor (web.xml)
Ở class này ta sẽ thêm đường dẫn class Css đã làm và code hiển thị nội dung đã thêm vào bằng đoạn code :
out.println("<link href='stylesheet.css' rel='stylesheet' type='text/css'>");
để kết nối css trong class servlet và sử dụng class css bằng đoạn code :
out.println("<div class=\"thuộc tính css mà bạn muốn kế thừa \">");
Kết quả là :
Đăng ký:
Bài đăng (Atom)