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