Blog cá nhân của Đức NT (GC00464)

Thứ Năm, 25 tháng 9, 2014

Custom Tag

23:01 Posted by Đức NT No comments

Tìm hiểu về Custom Tag


Như chúng ta được biết thì trong 1 số trang JSP đôi khi ta phải nhúng code Java, việc nhúng code java vào 1 trang JSP lại trở thành 1 vấn đề lớn. Việc đọc hiểu code sẽ trở nên rất khó khăn, thêm vào đó là vấn đề tái sử dụng cũng khó hơn. Sau đây ta cùng tìm hiểu kĩ hơn về Custom Tag:
  • Custom Tag cho phép lập trình viên nhúng các đoạn code java vào trang JSP
  • Cung cấp cơ chế để tái sử dụng và bao gói code, lệnh phức tạp trong JSP
  • Làm đơn giản hóa, tái sử dụng Java Code
  • JSP 1.0 không hỗ trợ Tag Libraries
  • JSP 1.1 hỗ trợ lưu trữ các custom tag của người dùng đã tạo trong JSP
  • Cấu trúc của custom tag trong jsp giống như XML Tag

Custom Tag giống như một thẻ HTML bình thường, có thể không có boby hoặc không.

Expression Language

19:45 Posted by Đức NT No comments

Tìm hiểu về Expression Language


1. Expression Language là gì?
- EL là một phần của đặc tả của JSTL 1.0, đi kèm với JSP 1.2 và có thể được sử dụng như các attribute của thẻ JSTL

2. Expression Language có tác dụng gì?
- để hiển thị thông tin, dữ liệu và thực thi các thao tác một cách đơn giản mà ẩn đi được những dòng mã Java
- hỗ trợ sử dụng các đối tượng và các mảng
- hỗ trợ cả các đối tượng ẩn

3. Sử dụng như thế nào?
- Cú pháp của Expression Language là : ${expression} .
- Hai biểu thức thông dụng nhất của EL là : Static text. (Text tĩnh) và Standard and Custom tags.

Demo Expression Language


Tạo mới một Project gồm 1 JSP Page là index.jsp và 1 Servlet SumServlet

Thay thế toàn bộ code trong index.jsp như sau:
 <html>  
   <head>  
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
     <title>Expression Languane</title>  
   </head>  
   <body>  
     <form action="sum">  
       <input type="text" name="number1" value="${number1}">  
       +  
       <input type="text" name="number2" value="${number2}">  
       <button>=</button>  
       ${sumValue}  
     </form>  
   </body>  
 </html>  

Tại SumServlet
 @WebServlet(urlPatterns = {"/sum"})  
 public class SumServlet extends HttpServlet {  
   @Override  
   protected void doGet(HttpServletRequest request, HttpServletResponse response)  
       throws ServletException, IOException {  
     HttpSession session = request.getSession();  
 //    session.removeAttribute("number1");  
 //    session.removeAttribute("number2");  
 //    session.removeAttribute("sumValue");  
     int number1 = Integer.parseInt(request.getParameter("number1"));  
     int number2 = Integer.parseInt(request.getParameter("number2"));  
     int value = number1 + number2;  
     session.setAttribute("number1", number1);  
     session.setAttribute("number2", number2);  
     session.setAttribute("sumValue", value);  
     response.sendRedirect("index.jsp");  
   }  
   @Override  
   public String getServletInfo() {  
     return "Short description";  
   }  
 }  

Kết quả

Chạy Project

Nhập 2 số cần tính toán và nhận kết quả


Ở demo này mình dùng ServletSession để tính toán và lưu kết quả, bạn có thể dùng ${param} (một Expression Language khác) để làm ví dụ trên đơn giản hơn. Theo dõi video sau đây: youtu.be/SXqFtDSba9w

Demo Java Bean

18:59 Posted by Đức NT No comments
Java Bean là một class Java, nó được tạo ra để giảm thiểu sự dư thừa code , nên ta có thể tăng tính dùng lại của 1 bean class. Bạn có thể dùng ở nhiều nơi : HTML Form, Java mail API và trong kết nối database. Theo dõi Demo bên dưới:

Tạo một Java Class "NameHandler.java" nội dung như bên dưới

 package org.mypackage.hello;  
 /**  
  *  
  * @author nbuser  
  */  
 public class NameHandler {  
   private String name;  
   /** Creates a new instance of NameHandler */  
   public NameHandler() {  
     name = null;  
   }  
   public String getName() {  
     return name;  
   }  
   public void setName(String name) {  
     this.name = name;  
   }  
 }  

Tại trang index.jsp

 <html>  
   <head>  
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
     <title>JSP Page</title>  
   </head>  
   <body>  
     <h1>Entry Form</h1>  
     <form name="Name Input Form" action="response.jsp">  
       Enter your name:  
       <input type="text" name="name" />  
       <input type="submit" value="OK" />  
     </form>  
   </body>  
 </html>  

Tại trang respone.jsp

 <body>  
   <jsp:useBean id="mybean" scope="session" class="org.mypackage.hello.NameHandler" />  
   <jsp:setProperty name="mybean" property="name" />  
   <h1>Hello, <jsp:getProperty name="mybean" property="name" />!</h1>  
 </body>  


Kết quả

Chạy Project, trang index.jsp sẽ được khởi chạy mặc định.

Thứ Tư, 24 tháng 9, 2014

Implicit Objects

20:07 Posted by Đức NT No comments
JSP Implicit Objects are the Java objects that the JSP Container makes available to developers in each page and developer can call them directly without being explicitly declared. JSP Implicit Objects are also called pre-defined variables.

JSP supports nine Implicit Objects which are listed below:
Object Description
requestThis is the HttpServletRequest object associated with the request.
responseThis is the HttpServletResponse object associated with the response to the client.
outThis is the PrintWriter object used to send output to the client.
sessionThis is the HttpSession object associated with the request.
applicationThis is the ServletContext object associated with application context.
configThis is the ServletConfig object associated with the page.
pageContextThis encapsulates use of server-specific features like higher performance JspWriters.
pageThis is simply a synonym for this, and is used to call the methods defined by the translated servlet class.
ExceptionThe Exception object allows the exception data to be accessed by designated JSP.

The request Object:

The request object is an instance of a javax.servlet.http.HttpServletRequest object. Each time a client requests a page the JSP engine creates a new object to represent that request.

The request object provides methods to get HTTP header information including form data, cookies, HTTP methods etc.

The response Object:
The response object is an instance of a javax.servlet.http.HttpServletResponse object. Just as the server creates the request object, it also creates an object to represent the response to the client.

The response object also defines the interfaces that deal with creating new HTTP headers. Through this object the JSP programmer can add new cookies or date stamps, HTTP status codes etc.

The out Object:

The out implicit object is an instance of a javax.servlet.jsp.JspWriter object and is used to send content in a response.

The initial JspWriter object is instantiated differently depending on whether the page is buffered or not. Buffering can be easily turned off by using the buffered='false' attribute of the page directive.

The JspWriter object contains most of the same methods as the java.io.PrintWriter class. However, JspWriter has some additional methods designed to deal with buffering. Unlike the PrintWriter object, JspWriter throws IOExceptions.

Following are the important methods which we would use to write boolean char, int, double, object, String etc.

Method Description
out.print(dataType dt)Print a data type value
out.println(dataType dt)Print a data type value then terminate the line with new line character.
out.flush()Flush the stream.

The session Object:

The session object is an instance of javax.servlet.http.HttpSession and behaves exactly the same way that session objects behave under Java Servlets.

The session object is used to track client session between client requests.

The application Object:

The application object is direct wrapper around the ServletContext object for the generated Servlet and in reality an instance of a javax.servlet.ServletContext object.

This object is a representation of the JSP page through its entire lifecycle. This object is created when the JSP page is initialized and will be removed when the JSP page is removed by the jspDestroy() method.

By adding an attribute to application, you can ensure that all JSP files that make up your web application have access to it.

The config Object:

The config object is an instantiation of javax.servlet.ServletConfig and is a direct wrapper around the ServletConfig object for the generated servlet.

This object allows the JSP programmer access to the Servlet or JSP engine initialization parameters such as the paths or file locations etc.

The following config method is the only one you might ever use, and its usage is trivial:
 config.getServletName();  
This returns the servlet name, which is the string contained in the element defined in the WEB-INF\web.xml file


The pageContext Object:

The pageContext object is an instance of a javax.servlet.jsp.PageContext object. The pageContext object is used to represent the entire JSP page.

This object is intended as a means to access information about the page while avoiding most of the implementation details.

This object stores references to the request and response objects for each request. The application, config, session, and out objects are derived by accessing attributes of this object.

The pageContext object also contains information about the directives issued to the JSP page, including the buffering information, the errorPageURL, and page scope.

The PageContext class defines several fields, including PAGE_SCOPE, REQUEST_SCOPE, SESSION_SCOPE, and APPLICATION_SCOPE, which identify the four scopes. It also supports more than 40 methods, about half of which are inherited from the javax.servlet.jsp. JspContext class.

One of the important methods is removeAttribute, which accepts either one or two arguments. For example, pageContext.removeAttribute ("attrName") removes the attribute from all scopes, while the following code only removes it from the page scope:
 pageContext.removeAttribute("attrName", PAGE_SCOPE);  

The page Object:

This object is an actual reference to the instance of the page. It can be thought of as an object that represents the entire JSP page.

The page object is really a direct synonym for the this object.

The exception Object:
The exception object is a wrapper containing the exception thrown from the previous page. It is typically used to generate an appropriate response to the error condition.

Demo

Create 3 JSP pages is index.jsp, save.jsp and resutl.jsp

Code in index.jsp
 <%@page contentType="text/html" pageEncoding="UTF-8"%>  
 <!DOCTYPE html>  
 <html>  
   <head>  
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
     <title>Implitcit Objects</title>  
   </head>  
   <body>  
     <form action="save.jsp">  
       <input type="text" name="name"><input type="submit">  
     </form>  
   </body>  
 </html>  

Code in save.jsp
 <%@page contentType="text/html" pageEncoding="UTF-8"%>  
 <!DOCTYPE html>  
 <html>  
   <head>  
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
     <title>Save</title>  
   </head>  
   <body>  
     <%   
       String name = request.getParameter("name");  
       session.setAttribute("name", name);  
     %>  
     <a href="resutl.jsp">Result</a>  
   </body>  
 </html>  

Code in result.jsp
 <%@page contentType="text/html" pageEncoding="UTF-8"%>  
 <!DOCTYPE html>  
 <html>  
   <head>  
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
     <title>Resutl</title>  
   </head>  
   <body>  
     Hello, <% out.print(session.getAttribute("name")); %>  
   </body>  
 </html>  


Run project

Input your name:

Click "resutl" to see result

Resutl

Build web application using JDBC

19:44 Posted by Đức NT No comments
1. JDBC là gì?
JDBC là viết tắt của “Java DataBase Connectivity”. Nó là một API (Application Programming Interface) có chứa một tập hợp các lớp, các giao diện Java và các thông báo lỗi ngoại lệ nằm trong cùng một đặc tả mà theo đó cả các công ty sản xuất JDBC driver cũng như các nhà phát triển JDBC đều phải tuân thủ chặt chẽ khi phát triển ứng dụng.

How to Make Apple Butter

If you enjoy this tasty twist on jam, but can’t find it available commercially in your area, try making apple butter yourself. It used to be messy and extremely time-consuming to prepare, but if you use a slow cooker it's much easier to make, so you can be eating apple butter in a day!

Ingredients

  • 4 1/2 lbs. cooking apples, washed and quartered
  • 4 cups white sugar
  • 1/3 cup of apple cider
  • 1/2 teaspoon powdered cinnamon
  • 1/2 teaspoon ground nutmeg

Steps (click to watch video)


1. Quarter the apples; peel them first if you prefer them without the skin. Put the chopped apples into the slow cooker, then slowly add the sugar. Stir to coat.

How to Short Sell

When most people buy an investment like a stock, they're hoping for the stock price to go up. If the stock price is lower when they buy the stock than it is when they sell it, they've earned a profit. This process is called "going long." Selling a stock short, or "shorting" as it's colloquially known, is the opposite. Instead of betting that the price of an investment is going to go up in the future, people who short are betting that the price of an investment is going to go down in the future. How do you do this, and how do you make money doing this? Read this tutorial to find out just how to sell short.

Method 1 of 3: Understanding the Theory

Thứ Năm, 11 tháng 9, 2014

Servlet Context

21:05 Posted by Đức NT No comments

Servlet Context là gì?

Servlet context dùng để duy trì trạng thái cho ứng dụng web. Mỗi máy ảo Java chỉ có một context. Servlet context lưu lại 1 nội dung dùng chung cho nhiều servlet.

Servlet Context có 3 phương thức chính:

  1. getAttribute()
  2. setAttribute()
  3. removeAttribute()

Servlet Context giúp cung cấp thông tin liên lạc giữa các servlet, nó có sẵn cho bất kỳ servlet và JSP là một phần của ứng dụng web. Ngoài ra Servlet Context còn được sử dụng để có được thông tin cấu hình web.xml.
Video chi tiết: youtu.be/wOd885Lgjvc

Demo Servlet Context

Viết ra một ứng dụng đếm số lần truy cập trang.

- Tạo ra 1 servlet có nội dung như sau:
   protected void processRequest(HttpServletRequest request, HttpServletResponse response)  
       throws ServletException, IOException {  
     response.setContentType("text/html;charset=UTF-8");  
     ServletContext context = request.getServletContext();  
     Integer count = (Integer) context.getAttribute("count");  
     if (count == null) {  
       count = 0;  
     }  
     count++;  
     context.setAttribute("count", count);  
     try (PrintWriter out = response.getWriter()) {  
       /* TODO output your page here. You may use following sample code. */  
       out.println("<!DOCTYPE html>");  
       out.println("<html>");  
       out.println("<head>");  
       out.println("<title>Servlet Count1</title>");        
       out.println("</head>");  
       out.println("<body>");  
       out.println("<h1>Page views: " + count);  
       out.println("</body>");  
       out.println("</html>");  
     }  
   }  

- Chạy thử:

- Chạy thử nhiều lần:

- Tạo ra 1 servlet khác với nội dung tương tự servlet trên và chạy thử ta vẫn thấy biến cout (Page Views) tăng dần sau mỗi dần tải lại trang, nghĩa là 2 servlet này đều lấy chung nội dung từ Servlet context.

Servlet Context vs Session?

Cơ bản thì Servlet Context khá giống so với Session, chỉ khác rằng Servlet Context được lưu trữ ở server còn Session được lưu trữ bởi browser (client). Nếu đã hiểu được cơ bản về Session thì Servlet Context cũng rất dễ dàng để làm quen.

Cá sấu...

11:59 Posted by Đức NT 2 comments
Có lẽ anh em trong lớp ít có ai từng nhìn thấy cá sấu ngoài đời thật, mình cũng vậy :) Nay sưu tầm được album ảnh cá sấu đẹp quá, post lên cho mọi người xem.

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Girl Xinh HaiVL

Thứ Ba, 9 tháng 9, 2014

Session

23:09 Posted by Đức NT No comments

Sử dụng Session

Khi một request được gửi đến server qua giao thức HTTP, server sẽ không thể lưu giữ các thông tin của client, vì thế người ta nghĩ ra nhiều phương pháp khác để hạn chế khuyết điểm này, Session là một trong số đó.

Demo Session

Develop user story "Login" with mock data instead of database.

Tạo một project với 2 servlet tên ServLoginDashboard. Dùng LinkedList để làm một "database đơn giản" :)

Code ở index.html
 <html>  
   <head>  
     <title>Session Test</title>  
     <meta charset="UTF-8">  
     <meta name="viewport" content="width=device-width, initial-scale=1.0">  
   </head>  
   <body>  
     <h1>Hello, Guest!</h1>  
     <a href="ServLogin">Login to view this page.</a>  
   </body>  
 </html>  

Code ở ServLogin
   protected void processRequest(HttpServletRequest request, HttpServletResponse response)  
       throws ServletException, IOException {  
     response.setContentType("text/html;charset=UTF-8");  
     try (PrintWriter out = response.getWriter()) {  
       String user = request.getParameter("username");  
       HttpSession session = request.getSession();  
       if (user != null) {  
         session.setAttribute("username", user);  
       }  
       String username = (String) session.getAttribute("username");  
       if (username == null) {  
         out.println("<!DOCTYPE html>");  
         out.println("<html>");  
         out.println("<head>");  
         out.println("<title>Servlet ServLogin</title>");  
         out.println("</head>");  
         out.println("<body>");  
         out.println("<h1>Login</h1>");  
         out.println("<form action=\"ServLogin\">");  
         out.println("Username: <input name=\"username\">");  
         out.println("<input type=\"submit\" value=\"Login\">");  
         out.println("</form>");  
         out.println("</body>");  
         out.println("</html>");  
       } else  
       if (!listUsername.contains(username)) {  
         session.setAttribute("username", null);  
         out.println("<!DOCTYPE html>");  
         out.println("<html>");  
         out.println("<head>");  
         out.println("<title>Login failed</title>");  
         out.println("</head>");  
         out.println("<body>");  
         out.println("<h1>Login failed</h1>");  
         out.println("<div>The username could not be found, try again.</div>");  
         out.println("<form action=\"ServLogin\">");  
         out.println("Username: <input name=\"username\">");  
         out.println("<input type=\"submit\" value=\"Login\">");  
         out.println("</form>");  
         out.println("</body>");  
         out.println("</html>");  
       }   
       else {  
         RequestDispatcher rd = request.getRequestDispatcher("Dashboard");  
         rd.forward(request, response);  
       }  
     }  
   }  
   protected List<String> listUsername;  
   @Override  
   public void init() throws ServletException {  
     listUsername = new LinkedList<>();  
     listUsername.add("ducntgc00464");  
   }  


Code ở Dashboard
 protected void processRequest(HttpServletRequest request, HttpServletResponse response)  
       throws ServletException, IOException {  
     response.setContentType("text/html;charset=UTF-8");  
     try (PrintWriter out = response.getWriter()) {  
       HttpSession session = request.getSession();  
       String username = (String) session.getAttribute("username");  
       out.println("<!DOCTYPE html>");  
       out.println("<html>");  
       out.println("<head>");  
       out.println("<title>Servlet Dashboard</title>");        
       out.println("</head>");  
       out.println("<body>");  
       out.println("<h1>Hello, " + username + "</h1>");  
       out.println("</body>");  
       out.println("</html>");  
     }  
   }  

Hoàn thành
1. Giao diện trang index, click vào "Login to view this page." sẽ chuyển đến ServLogin, nếu đã từng đăng nhập thành công bạn sẽ không cần đăng nhập mà vẫn xem được trang.

2. Giao diện trang ServLogin khi chưa từng đăng nhập hoặc đã từng đăng nhập nhưng chưa thành công.

3. Giao diện trang ServLogin khi đăng nhập sai.

4. Khi đăng nhập thành công (foward đến Dashboard).
Download Source Code: http://www.mediafire.com/download/m2rlhfd4g73coyg/SessionTest.rar

Cảm nhận về Session

Sử dụng Session phức tạp hơn so với Dispatcher, có nhiều câu lệnh và phương thức hơn nên cũng khó nhớ hơn. Nhờ Session tôi hiểu được cách một số website bán hàng lưu giỏ hàng của khách hàng như thế nào, điều mà tôi thắc mắc bấy lâu nay :)

Dispatcher

17:33 Posted by Đức NT No comments

RequestDispatcher là gì?

RequestDispatcher là phương pháp giúp bạn duyệt đến trang cần thiết và bảo lưu tham số người dùng đã nhập vào. Nó bảo toàn địa chỉ url sau khi chuyển đến trang index hoặc trang success. Và chính điều này giúp bạn không đánh mất giá trị của các định danh.

RequestDispatcher có 2 phương thức quan trọng:
  1. foward()
  2. include()
Video chi tiết: youtu.be/3PRNK-Vc6qk

Demo RequestDispatcher

Implement an application as following:
Depends of the question, GateKeeper will forward request to corresponding Answers.



Tạo 1 project như sau:

Kết quả:

Request Form

Khi trả lời đúng

Khi trả lời sai
Download Source Code: https://www.mediafire.com/?5b869ndrk4wiah7

Nhận xét

RequestDispatcher tương đối dễ và không quá khó nhớ, ta có thể ra một vài ứng dụng web tuyệt vời nhưng không phức tạp nhờ RequestDispatcher. Phương thức foward() có phần giống với response.sendRedirect(url), tuy nhiên ta không nên sử dụng phương thức này vì nó chỉ có thể giúp bạn chuyển đến trang bạn cần, mà không bảo toàn các tham số và giá trị của chúng.

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

Init Servlet Parameter

22:10 Posted by Đức NT No comments
Ở bài viết Servlet Lifecycle ta đã biết init servlet là phần cuối cùng trước khi servlet được đưa vào phục vụ. Khi tạo ra một servlet ta cần thêm các thông tin ban đầu cho nó, gọi là init-parameter. Có thể dùng phương thức init(ServletConfig config) để lấy ra các thông số của init-parameter (nằm trong Web Confib - web.xml).

Demo:


Video hướng dẫn chi tiết: youtu.be/R9rQ5kuNqzo

Như vậy để tạo ra 1 servlet config ta phải làm theo các bước sau:
1. Tạo Servlet
2. Thêm Init Param
3. Lấy ra Init config bằng cách
-Override init(config)
-config.getInitParam()

Việc lấy ra các thông số init-parameter và hiển thị khá dễ, bạn có thể sửa các thông số này ở phần Web Config (web.xml). Tuy nhiên khi làm thật thì đây là các thông số dùng để kết nối tới database, nếu nhập sai sẽ không kết nối được.