Nói về ServletContext và ServletConfig trong Jakarta EE Servlet

58

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

ServletContext là một đối tượng được khởi tạo bởi Web Container khi chúng ta deploy ứng dụng Jakarta EE web application. Nó được sử dụng lưu trữ và lấy thông tin mà chúng ta cấu hình cho tất cả các Servlet có trong ứng dụng. Còn ServletConfig thì giúp chúng ta lấy thông tin được định nghĩa cho một Servlet cụ thể nào đó. Cụ thể như thế nào? Trong bài viết này, mình sẽ thảo luận với các bạn về ServletContext và ServletConfig trong Jakarta EE Servlet các bạn nhé!

  Tạo ứng dụng Jakarta EE MVC sử dụng Maven trong Eclipse
  Định nghĩa request URL trong ứng dụng Jakarta EE RESTful Web Services

Xem thêm các việc làm COBOL hấp dẫn trên TopDev

Đầu tiên, mình sẽ mới một Jakarta EE Servlet Maven project để làm ví dụ:

Bây giờ, mình sẽ tạo mới 2 Servlet:

HelloWorldServlet

package com.huongdanjava.jakartaee.servlet;

import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloWorldServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
// Writing the message on the web page
PrintWriter out = resp.getWriter();
out.println("Hello Servlet");
}
}

và HuongDanJavaServlet:

package com.huongdanjava.jakartaee.servlet;

import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HuongDanJavaServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
// Writing the message on the web page
PrintWriter out = resp.getWriter();
out.println("Huong Dan Java Servlet");
}
}

rồi khai báo chúng trong tập tin web.xml như sau:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">

<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.huongdanjava.jakartaee.servlet.HelloWorldServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>huongdanjavaServlet</servlet-name>
<servlet-class>com.huongdanjava.jakartaee.servlet.HuongDanJavaServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>huongdanjavaServlet</servlet-name>
<url-pattern>/huongdanjava</url-pattern>
</servlet-mapping>
</web-app>

Kết quả khi chạy ứng dụng, request tới http://localhost:8080/hello như sau:

Và request tới http://localhost:8080/huongdanjava như sau:

Nếu các bạn định nghĩa thông tin cho tất cả các Servlet trong ứng dụng sử dụng một hoặc nhiều tag <context-param> trong tập tin web.xml như sau:

<context-param>
<param-name>name</param-name>
<param-value>Khanh</param-value>
</context-param>

<context-param>
<param-name>website</param-name>
<param-value>Huong Dan Java</param-value>
</context-param>

Khi đó, trong cả 2 Servlet mà mình định nghĩa ở trên đều có thể lấy được thông tin cấu hình này bằng cách sử dụng đối tượng ServletContext, ví dụ như sau:

package com.huongdanjava.jakartaee.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloWorldServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
// Writing the message on the web page
PrintWriter out = resp.getWriter();
out.println("Hello Servlet");

ServletContext servletContext = getServletContext();
out.println(servletContext.getInitParameter("name"));
out.println(servletContext.getInitParameter("website"));
}
}

Hay:

package com.huongdanjava.jakartaee.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HuongDanJavaServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
// Writing the message on the web page
PrintWriter out = resp.getWriter();
out.println("Huong Dan Java Servlet");

ServletContext servletContext = getServletContext();
out.println(servletContext.getInitParameter("name"));
out.println(servletContext.getInitParameter("website"));
}
}

Phương thức getServletContext() sẽ trả về đối tượng ServletContext được manage bởi Web Container mà ứng dụng đang được deploy, được khởi tạo lúc chúng ta deploy ứng dụng.

Kết quả:

Hay:

Còn nếu các bạn định nghĩa thông tin cho một Servlet cụ thể nào đó bằng cách khai báo tag <init-param> bên trong tag <servlet>, thì thông tin này sẽ không available với các Servlet khác của ứng dụng và chúng ta lấy những thông tin này sử dụng ServletConfig.

Ví dụ bây giờ, mình khai báo tập tin web.xml như sau:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">

<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.huongdanjava.jakartaee.servlet.HelloWorldServlet</servlet-class>
<load-on-startup>1</load-on-startup>

<init-param>
<param-name>name</param-name>
<param-value>Khanh</param-value>
</init-param>

<init-param>
<param-name>website</param-name>
<param-value>Huong Dan Java</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>huongdanjavaServlet</servlet-name>
<servlet-class>com.huongdanjava.jakartaee.servlet.HuongDanJavaServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>huongdanjavaServlet</servlet-name>
<url-pattern>/huongdanjava</url-pattern>
</servlet-mapping>
</web-app>

thì với đoạn code ở trên, chúng ta sẽ không lấy được thông tin context-param nữa:

Và:

Các bạn có thể lấy thông tin được khai báo trong HelloServlet bằng cách sử dụng ServletConfig như sau:

package com.huongdanjava.jakartaee.servlet;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloWorldServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
// Writing the message on the web page
PrintWriter out = resp.getWriter();
out.println("Hello Servlet");

ServletConfig servletConfig = getServletConfig();
out.println(servletConfig.getInitParameter("name"));
out.println(servletConfig.getInitParameter("website"));
}
}

Kết quả:
Request tới http://localhost:8080/huongdanjava, các bạn sẽ thấy kết quả như sau:

Còn nhiều thông tin khác mà các bạn có thể cấu hình với Jakarta EE Servlet và cũng có thể sử dụng ServletContext và ServletConfig để lấy những thông tin này các bạn nhé!