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");

3 nhận xét: