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

Cảm nhận sau 1 tuần học

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à 

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 :

    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 :
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>

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

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 :

 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
+ File Css login và table tôi đã sử dụng : CSS
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

Session là phiên làm việc của một người dùng, nó chỉnh thời gian làm việc mà người dùng giao tiếp với ứng dụng
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.

Sau khi thêm data và câu lệnh kiêm tra đăng nhập ta sẽ thêm nội dung trang đăng nhập vào :

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.
This method was originally defined to retrieve a servlet from a 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
getServletNames()
          Deprecated. As of Java Servlet API 2.1, with no replacement.
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
getServlets()
          Deprecated. As of Java Servlet API 2.0, with no replacement.
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.
This method was originally defined to write an exception's stack trace and an explanatory error message to the servlet log file.
 void
log(java.lang.String msg)
          Writes the specified message to a servlet log file, usually an event log.
 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 
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à :