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

Session trong servlet

Session là một phiên làm việc hay khoảng thời gian mà user làm việc với một ứng dụng. Một session được bắt đầu khi user truy cập vào hệ thống lần đầu tiên và kết thúc khi user thoát khỏi hệ thống. Một session chứa thông tin về người dùng qua các request
Khi người dùng truy cập vào một website lần đầu, người dùng sẽ được cấp một session ID duy nhất để xác định session của người đó. ID này được lưu ở cookies hay trong request parameter. Và client sẽ gửi lại session ID với mỗi request. Container sẽ xem ID và tìm session tương ứng với nó.
Đối tượng HttpSession đại diện cho một user session. Nó cung cấp cách để xác định một user truy cập nhiều lần vào một website và trên nhiều page. Servlet Container sẽ sử dụng HttpSession để tạo ra một session giữa một HTTP client và HTTP server. Session vẫn tồn tại trông một khoảng thời gian xác định, qua nhiều lần kết nối hay request tới một page từ client.
Khi một ứng dụng lưu một đối tượng hay loại bỏ một đối tượng trong session, session sẽ kiểm tra liệu đối tượng đó có được implement từ HttpSessionBindingListener. Nếu nó được implement, servlet sẽ thông báo cho đối tượng biết rằng nó được bound hoặc unbound từ session. Thông báo được gửi sau khi phương thức binding hoàn thành.
Khi session mà invalidated hoặc hết phiên, thông báo sẽ được gửi sau khi session đó vừa mới invalidatd hay hết phiên.
Để truy xuất đối tượng session ta sử dụng HttpSession.
protected void doPost(HttpServletRequest request,
    HttpServletResponse response)
        throws ServletException, IOException {
 
    HttpSession session = request.getSession();
}
Ta có thể lưu giá trị trong đối tượng session và nhận lại chúng sau. Để lưu giá trị vào session ta sử dụng phương thức setAttribute() của session.
session.setAttribute("userName", "theUserName");
Giá trị lưu trong session sẽ được lưu trong bộ nhớ của servlet container. Để lấy lại giá trị trong session ta sử dụng phương thức getAttribute()
session.getAttribute("userName");



Thứ Bảy, 13 tháng 9, 2014

Dispatcher in servlet

Một RequestDispatcher là một class vô cùng quan trọng trong Java. Nó giúp cho trang web chuyển request từ servlet này sang một servlet khác bằng cách cho phép gọi một servlet khác từ trong một servlet khác. Nó tạo ra một đối tượng nhận request từ client và gửi chúng đến bất kỳ resource nào như một servlet, HTML hay JSP file.
Để có được đối tượng RequestDispatcher ta sử dụng method getRequestDispather() từ đối tượng HttpServletRequest.  
protected void doPost(HttpServletRequest request,
                      HttpServletResponse response)
        throws ServletException, IOException {
   RequestDispatcher requestDispatcher =
    request.getRequestDispatcher("index.jsp");
}
Đoạn code trên cho ta một RequestDispatcher.Với request là một đối tượng của ServletRequest và index.jsp là tên của resource.Phương thức getRequestDispatcher() có tham số là chuỗi đường dẫn đến resource mà request được chuyển đến. Để gọi RequestDispatcher Ta sử dụng phương thức include() hoặc forward()  
requestDispatcher.forward(request, response);
requestDispatcher.include(request, response);
Khi gọi include() hoặc forward(), servlet container sẽ kích hoạt bất cứ resource nào (servlet, html file hoặc jsp file) mà mapping với url của RequestDispatcher . Giả sử resource là một servlet khác, thì servlet được gọi tới có thể truy xuất request như servlet gọi nó, và sẽ tạo response như servlet hiện tại. Có sự khác nhau giữa include() và forward()
Forward() method:
Chuyển một request từ một servlet tới resource khác trên server và chuyển hoàn toàn quyền cho servlet được chuyển tới. Trước khi forward, nó không xử lý gì về nội dung và đến servlet cuối cùng mới thực hiện điều đó (print ra màn hình)
Include() method
Để nhận kết quả trả về từ trang đích và tiếp tục xử lý. Kết quả của servlet được gọi sẽ được ghép với servlet được kích hoạt

Giả sử ta có một request gửi đến servlet có tên là GateKeeper. GateKeeper sẽ làm nhiệm vụ chuyển request đến các servlet tương ứng.


Để thực hiện điều này, đầu tiên ta tạo file index.jsp có form như sau
<body>
<div>Chose your anwser</div>
<form action="GateKeeper">
 <select name="answer">
  <option value="1">Answer 1</option>
  <option value="2">Answer 2</option>
  <option value="3">Answer 3</option>
  <option value="4">Answer 4</option>
 </select>
    <input type="submit" value="Submit" />
</form>
</body>
Tạo một servlet có tên Gatekeeper để chuyển request đến các servlet khác. Gatekeeper sẽ chuyển request đến servlet tương ứng được map trong parameter của getRequestDispatcher()
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
               String answer = request.getParameter("answer");
               RequestDispatcher requestDispatcher = request.getRequestDispatcher("Answer" + answer);
               requestDispatcher.forward(request, response);
        }
Ta tạo thêm 4 servlet: Answer1, Answer2, Answer3, Answer4 với kết quả hiển thị tương ứng.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
               PrintWriter writer = response.getWriter();
               writer.println("This is Answer 2");
        }       

 Chạy file index.jsp ta được giao diện như hình dưới.
Khi chọn Answer 2 và nhấn Submit, request sẽ gửi tới servlet Gatekeeper, tại đây Gatekeeper sẽ xử lý và nhận vào parameter là Answer 2 và nó sẽ chuyển request này đến servlet Answer2, cuối cùng in ra kết quả như hình dưới.

Thứ Sáu, 12 tháng 9, 2014

Initialization parmeter in servlet

Trong các ứng dụng, để serlvet có thể truy xuất từ browser, ta phải cho servlet container biết servlet nào được deploy, và url nào được map với servlet đó. Và servlet có thể lấy các parameter đó bằng nhiều cách. Do người dùng nhập vào khi iput, parameter được ghi sẵn trong source code. Nhưng khi khởi tạo một servlet, khi đó người dùng chưa nhập các parameter, khi đó các parameter mà servlet đọc được sẽ là null. Còn đối với trường hợp ta ghi sẵn parameter trong source code thì khi ta cần thay đổi như khi thay đổi database chẳng hạn, ta sẽ phải build và deploy lại.
Trong servlet có một cách khác để đọc các paramter ngay từ lúc servlet được khởi tạo, đó là bằng cách ta khai báo các paramter đó trong một file Deployment Description gọi là web.xml. Khi khởi tạo lần đầu servlet sẽ load các parameter trong file web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

  <servlet>
    <servlet-name>Hello World</servlet-name>
    <servlet-class>hung.servlet.HelloWorld</servlet-class>
    <init-param>
       <param-name>myParam</param-name>
       <param-value>hungbktt@gmail.com</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>Hello World</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app> 
Đầu tiên để khai báo một servlet ta sử dụng thẻ <servlet> trong đó sẽ khai báo tên servlet và class của servlet. Sau đó ta phải mapping servlet với url bằng thẻ <servlet-mapping>. Để khai báo các parameter mà servlet có thể load được khi khởi tạo, ta khai báo chúng trong cặp thẻ <init-param> với tên của parameter và giá trị của chúng. Ta không thể dùng các init parameter cho đến khi servlet được khởi tạo.
Để servlet có thể load được các init parmeter, ta sử dụng đối tượng ServletConfig và phương thức getInitParameter() của đối tượng đó. Chú ý rằng ta không thể gọi phương thức getInitParameter() trong contructor.
public void init(ServletConfig servletConfig) throws ServletException{
    this.myParam = servletConfig.getInitParameter("myParam");
  }
Khi container khởi tạo một servlet, nó tạo ra một ServletConfig duy nhất cho servlet đó. Container đọc các servlet init parameter từ web.xml và đưa chúng vào đối tượng ServletConfig pass ServletConfig qua phương thức init() của servlet. init() được gọi khi Container load servlet lần đầu tiên
Dưới đây là ví dụ minh họa cho Initialization parmeter in servlet.
1. Ta khai báo trong file web.xml
2. Tạo servlet tương ứng với phương thức init()
3. Sau khi chạy ta được kết quả như với việc load parameter trong file web.xml
<servlet> còn có subelement là <load-on-startup> để điều khiển khi nào container load servlet. Nếu không khai báo <load-on-startup> thì container sẽ load servlet khi có request đầu tiên tới nó. Khi khai báo <load-on-startup> thì servlet sẽ được load ngay khi container khởi động
<servlet>
    <servlet-name>Hello World</servlet-name>
    <servlet-class>hung.servlet.HelloWorld</servlet-class>
    <init-param><param-name>adminEmail</param-name>
                <param-value>hungbktt@gmail.com</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
Số trong <load-on-startup>1</load-on-startup> cho container biết rằng thứ tự servlet sẽ được container load
Ngoài ra ta có thể khai báo parameter mà có tất cả các servlet trong hệ thống đều có thể đọc được bằng thẻ <context-param>
<context-param>
    <param-name>myParam</param-name>
    <param-value>the value</param-value>
</context-param>
Và để đọc được chúng ta sử dụng getServletContext()
String myContextParam = servletConfig.getServletContext().getInitParameter("myParam");

Thứ Sáu, 5 tháng 9, 2014

Develop an web app with servlet



    1. Trên menu chính của Eclipse chọn File>New>Project


    2. Trong cửa sổ hiện ra chọn Web > Dynamic Web Project.
    3. Click Next.
    4. Điển tên cho Web project.
    5. Click Next.
    6. Chọn folder để lưu java sources, mặc định sẽ là src, sau đó chọn Next
    7. Context root mặc định là tên của project, có thể chọn tên khác
    8. Content directory mặc định cho project là Webcontent, ta có thể chọn tên khác sau đó chọn Next

    9. Ta được 1 project hiện thị như bên dưới

    10. Chuột phải vào project chọn New>Servlet
    11. Điền package và Class cho servlet sau đó nhấn Next

    12. Có thể thêm description sau đó nhấn Next

    13. Chọn các method sau dó nhấn Finish
    14. Trong phương thức doGet() ta thêm đoạn code bên dưới
    15. Click chuột phải vào servlet HelloWorld
    16. Chọn server để chạy Servlet sau đó chọn Next và Finish
    17. Ta được kết quả như bên dưới

    =======================================================================
    Create HTML program with servlet.
    1. Click chuột phải vào Webcontent chọn New>HTML file. Đặt tên file là index.html
    2. Thêm vào đoạn code như bên dưới
    3. Tạo 1 servlet tên là HelloServlet
    4. Thêm đoạn code như bên dưới cho servlet vừa tạo

    5. Click chuột phải vào file index.html, chọn Run as> Run on server. Chọn server để run program
    6. Giao diện hiển thị như bên dưới, input firstname, lastname vào sau đó nhấn submit
    7. Ta được kết quả như hình dưới






    Chủ Nhật, 31 tháng 8, 2014

    Describe Servlet Life Cycle

    Servlet Life Cycle có thể được định nghĩa như một quá trình từ khi nó được tạo cho đến khi nó bị phá hủy.
    - Servlet được khởi tạo bằng cách gọi phương thức init()
    - Servlet gọi phương thức service() để xử lý một request của client
    - Servlet kết thúc qua việc gọi phương thức destroy()
    - Cuối cùng, servlet được thu gom bởi các bộ thu gom của JVM

    • The init() method

    Phương thức init được thiết kế để gọi chỉ một lần. Nó được gọi khi servlet được tạo lần đầu tiên, mỗi request của người dùng sau sẽ không được gọi lại. Vì vậy nó được sử dụng cho việc khởi tạo một lần. Servlet thường được tạo khi một user gọi url đàu tiên tương ứng tới servlet, nhưng cũng có thể chỉ rõ khi nào servlet được load khi server khởi động lần đầu.
    Khi một user gọi một servlet, một thể hiện của mỗi servlet được tạo, với mỗi kết quả request của user trọng một thread được chuyển tới doGet hoặc doPost thích hợp. Phương thức init() tạo hoặc tải một vài dữ liệu đơn giản sẽ được sử dụng trong suốt chu kỳ sống của servlet.

    • The service() method
    Phương thức service() là phương thức chính để thực hiện nhiệm vụ cụ thể. Servlet gọi phương thức service() để xử lý request gửi từ client và định dạng respone trả lại client.
    Mỗi khi server nhận một request cho servlet, server tạo ra một thread mới và gọi service. Phương thức service kiểm tra loại HTTP request (GET, POST, PUT, DELETE) và gọi phương thức doGet, doPOST, doPUT, doDelete tương ứng
    Phương thức service() được gọi và tham gia vào phương thức doGet, doPost, doPut, doDelete tương ứng. Vì vậy ta không cần phải làm gì với phương thức service() nhưng phải override phương thức doGet, doPost() phụ thuộc vào loại request nhận từ client

    • The doGet() method
    Một kết quả request loại Get từ một một request cho một url hoặc từ một trang HTML không có phương thức cụ thể và nó được xử lý by phương thức doGet()

    • The doPost() method
    Một kết quả request loại Post từ một trang HTML chỉ rõ danh sách POST được xử lý bỏi phương thức doPost()

    • The destroy() method
    Phương thức destroy() được gọi chỉ một lần vào thời điểm kết thúc một vòng làm việc của servlet. Phương thức này cho phép thay đổi đóng kết nối databases, dừng thread chạy ngầm, ghi cookie...
    Sau khi phương thức destroy() được gọi, servlet được đánh dấu cho bộ thu gom rác.

    Describe HTTP properties

    - HTTP viết tắt của Hypertext Transfer Protocol. Là một giao thức stateless nằm ở tầng ứng dụng, giúp giao tiếp giữa các hệ thống phân tán với nhau.
    - HTTP sử dụng giao thức TCP/IP để giao tiếp giữa các client và server, tuy nhiên có thể sử dụng giao thức UDP. Cổng giao tiếp mặc định của HTTP là 80. Giữa client và server giao tiếp với nhau thông qua request và respone. Trong đó client sẽ gửi HTTP request đến server và nhận HTTP respone trả về từ phía server
    - HTTP request gồm hai thành phần quan trọng đó là url và verb được gửi từ phía client. Còn HTTP respone trả về có chứa status code và message body
    - Verb: Client sử dụng các phương thức GET, POST, PUT và DELETE để gửi đến server

    • GET: Sử dụng để truy vấn dữ liệu , tài nguyên trên server với các tham số và giá trị nằm ngay trên URL. Phương thức này sẽ gửi một yêu cầu và lấy tài nguyên trên server, sau đó sẽ gửi trở lại client. Tài nguyên đó có thể là một trang HTML, hình ảnh video hoặc file văn bản.
    • POST: Sử dụng trong trường hợp tạo ra sự thay đổi về dữ liệu tài nguyên trên server như upload một file hoặc submit một web form
    • PUT: Dùng để cập nhật nguồn tài nguyên hiện có.
    • DELETE: Dùng để xóa nguồn tài nguyên hiệnc có
    • Ngoài ra còn có một số phương thức ít được sử dụng như: HEAD, TRACE và OPTIONS.
    - URL: Là một đường dẫn trong đó bao gồm protocol, host, port, resource path và query.
    - Status code là thông tin server gửi trả về cho client, chính là kết quả xử lý request của server

    Describe Java Web Tech


    1. Wep application
    Web application là một ứng dụng phân tán, nó có thể làm việc trên nhiều máy tính và được liên kết thông qua network hoặc server. Web application được truy cập với một web browser và mỗi browser tương ứng với một client.Trong doanh nghiệp, khả năng cập nhật và nâng cấp web applications không cần deploy và cài đặt trên nhiều máy tính client, vì lý do đó mà nó trở nên phổ biến.



    2. Java web technologies
    Có rất nhiều công nghệ về Java được sử dụng, dưới đây là một số công nghệ được sử dụng trong Java web.
    • Java Servlet API
    Java Servlet API định nghĩa các class HTTP. Một servlet class kế thừa khả năng của server, máy chủ lưu trữ ứng dụng được truy cập bằng mô hình request-response. Mặc dù serverlet có thể đáp ứng mọi loại request, chúng thường được mở rộng khả năng ứng dụng được host bởi web server. Bạn nên sử dụng servlet để lấy dữ liệu nhập vào online và hiển thị trên giao diện như một trang với định dạng HTML, hoặc sử dụng các servlet khác nhau để ghi dữ liệu ra file hoặc database. Servlet chạy trên server không cần ứng dụng GUI hay hay giao diện người dùng. Sự mở rộng của Java servlet khiến cho nhiều ứng dụng web trở nên có thể
    Trong servlet hai packages javax.servlet và javax.servlet,html cung cấp các class và interfaces để định nghĩa servlet. HTML servlet class kế thừa từ abtract class javax.servlet.http.HttpServlet cung cấp framework xử lý giao thức HTTP

    • JavaServer Page technology
    JavaServer Page (JSP) cung cấp việc tạo nội dung trang web động một cách đơn giản hóa và nhanh nhất. JSP cho phép việc phát triển nhanh chóng ứng dụng nền tảng web mà server và platform độc lập nhau. JSP cho phép thêm một đoạn servlet code trực tiếp vào tài liệu text-base. Một JSP là một tài liệu text-base chứa hai loại text
     - Dữ liệu tĩnh có thể được thể hiện trong bất kỳ định dạng text-base nào như HTML, WML hay XML
    - Thành phần JSP quyết định cấu trúc nội dung động như thế nào
    Packages tham gia vào tạo trang JSP là javax.el, javax.serlet.jsp, javax.servlet.jsp.el và javax.servlet.jsp.tagext. Một trang JSP có thể đơn giản như HTML với một đoạn code JSP và đuôi mở rộng .jsp

    • JavaServer Faces technology
    JavaServer Faces (JSF) là một framework UI để xây dựng ứng dụng web. Thành phần chính của JSF bao gồm thành phần GUI framework, một model để tạo ra các thành phần và chuẩn RenderKit để sinh ra các thẻ HTML
    Chức năng này có sẵn thông qua chuẩn Java API và file cấu hình XML. Thêm vào đó Sun Java Studio Creator IDE thúc đẩy công nghệ JSF trong công cụ GUI kéo thả, cho phép bạn sử dụng cộng nghệ mà không cần viết hoặc hiểu code.