My proud configuration file

** What is a configuration file?**

Các file cấu hình là các tập tin văn bản để kiểm soát hành vi của các chương trình trên máy tính. Thường chúng được đọc 1 lần, khi chương trình khởi động từ script hoặc lệnh nào đó. Process sẽ khởi động loại hoặc HUP là thứ cần thiết để nó hoạt động.

** What is configuration management?**

Khi nói về quản lý cấu hình, đặc biệt là trên nhiều máy tính, nó giúp dễ dàng quản lý các task công việc của bạn. Sau khi tất cả, Configs vẫn đang tồn tại trong các tập tin. Tính đóng gói sẽ giúp quản lý tệp tin tốt hơn, sử dụng dễ dàng hơn.

Trong ứng dụng (nói chung), tính di động là một phần rất quan trọng. Có thể ứng dụng chạy tốt trên máy của bạn, nhưng sang một máy tính khác - một môi trường khác thì không như ý. Hoặc bạn cũng muốn tùy chỉnh 1 option nào đó mà không muốn phải mở source code ra và thay đổi nó...Và rất nhiều trường hợp nữa, mà những lúc như vậy, file config là một giải pháp hữu hiệu.

Thông thường 1 ứng dụng sẽ có các file configs để quản lý những từng phần và từng tâng của ứng dụng đó. Sau đây tôi sẽ giới thiệu 1 vài file config cần thiết trong framework java spring.

Những file cầu hình cần thiết khi xây dựng 1 ứng dụng web bằng framework spring-hibernate trên nền tảng Maven, tool Eclipse.

1. POM.xml

File pom chứa tất cả các thông tin về dự án. Hiểu file pom là điều quan trọng đối với người mới tiếp cận maven.

Chúng ta sẽ xem từng phần tử trong file pom để giúp bạn làm quen với cơ bản về POM:

  • project Đây là phần tử trên cùng trong tất cả các file pom.xml

  • modelVersion Phần tử này chỉ ra phiên bản của mô hình đối tượng mà file

  • POM sử dụng. Phiên bản của bản thân mô hình đối tượng rất ít thay đổi nhưng nó là bắt buộc để đảm bảo tính ổn định khi các nhà phát triển Maven nghĩ rằng nó cần thiết để thay đổi mô hình.

  • groupId : Phần tử này chỉ ra định danh duy nhất của nhóm hoặc tổ chức tạo ra dự án. groupId là một trong định danh chính của một dự án được đặt tên dựa theo domain đầy đủ của tổ chức của bạn. Ví dụ ở đây: org.sonatype.mavenbook.simple

  • artifactId: Phần tử này tên gốc của artifact chính được tạo ra bởi dự án.

  • Artifact chính cho một dự án chính điển hình là một file Jar. Một artifact điển hình được tạo ra bởi Maven sẽ có hình thức <artifactId>-<version>.<extension> (ví dụ simple-1.0-SNAPSHOT.jar trong tình huống dự án này). (Định nghĩa về artifact: trong thuật ngữ phần mềm nói chung, một ‘artifact’ là một thứ gì đó được tạo ra bởi quá trình phát triển phần mềm, cho dù là một tài liệu liên quan đến phần mềm hoặc một file thực thi. Trong thuật ngữ của Maven, artifact là kết quả của quá trình build trong maven, nói chung là một fie jar, hay war trong dự án web hoặc một file thực thi khác. Một artifact trong maven được xác định bởi một hệ tọa độ gồm groupId, artifactId và version. Maven sử dụng groupId, artifactId và version để xác định sự phụ thuộc (thường là các file jar khác ) cần để build và chạy code của bạn.) package: Phần tử này chỉ kiểu đóng gói được sử dụng bởi artifact này (ví dụ JAR, WAR, EAR vân vân)

  • version: Phần tử này chỉ ra phiên bản của artifact được tạo ra bởi dự án.

  • Bạn sẽ thường xuyên nhìn thấy chữ SNAPSHOT trong phiên bản, chỉ ra rằng dự án đang ở trong giai đoạn phát triển.

  • name: Phần tử này chỉ ra tên của dự án. Điều này được sử dụng trong tài liệu được tạo ra bởi maven.

  • url:Phần tử này chỉ ra trang của dự án có thể được tìm thấy. Điều này được sử dụng trong tài liệu được tạo ra bởi maven.

  • description: Phần tử này cung cấp phần mô tả ngắn gọn về dự án. Điều này được sử dụng trong tài liệu được tạo ra bởi maven.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>CRUDWebAppMaven</groupId>
	<artifactId>CRUDWebAppMaven</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<properties>
		<org.springframework.version>3.0.5.RELEASE</org.springframework.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>

		<!-- Hibernate resources -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>3.6.7.Final</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>4.3.0.Final</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-commons-annotations</artifactId>
			<version>3.3.0.ga</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-annotations</artifactId>
			<version>3.3.1.GA</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>3.3.2.GA</version>
		</dependency>
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>1.1.2</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.1.2</version>
		</dependency>
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>20030825.184428</version>
		</dependency>
		<dependency>
			<groupId>commons-pool</groupId>
			<artifactId>commons-pool</artifactId>
			<version>20030825.183949</version>
		</dependency>
		<!-- MySQL -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.6</version>
		</dependency>
		<!-- Log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.14</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
	</dependencies>

	<build>
		<testSourceDirectory>src/main/test</testSourceDirectory>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<excludes>
					<exclude>**/*.java</exclude>
				</excludes>
			</resource>
			<resource>
				<directory>src/main/webapp</directory>
				<excludes>
					<exclude>**/*.java</exclude>
				</excludes>
			</resource>
		</resources>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

2. WEB.xml

Trong WebContent có thư mục WEB-INF chứa file web.xml và thư mục lib đây là thư mục chứa các thư viện java (các file .rar) cần dùng.

Để sử dụng Spring MVC, ta phải cấu hình trong file web.xml để tạo một servlet từ lớp org.springframework.web.servlet.DispatcherServlet. Servlet này còn gọi là front servlet, là nơi đón tiếp tất cả các yêu cầu đến ứng dụng web, sau đó dựa vào thông tin cấu hình mà chuyển tiếp các yêu cầu này đến các controller tương ứng để xử lý chúng. Ở đây, servlet có tên spring-servlet.xml sẽ đón nhận tất cả các yêu cầu từ các đường dẫn có chứa “/“, cái này được định nghĩa trong thẻ <url-pattern>.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>CRUDWebAppMavenized</display-name>

	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:log4j.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>spring</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>spring</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>

3. Spring-servlet.xml

Ta cấu hình dispatcherServlet trỏ về dispatcher của spring. Mọi request sẽ đi qua dispatcher này trước khi được xử lý. Trong file này ta cũng cấu hình file context cho spring, và tên file này ta có thể thay đổi tùy theo ý thích (ở đây là spring-servlet.xml)

Toàn bộ thông tin cấu hình cần thiết cho một ứng dụng web sử dụng Spring MVC được khai báo trong file spring-servlet.xml. Ở trong ví dụ này, ta để ý rằng tên của file cấu hình sẽ là tên của front servlet mà ta khai báo ở web.xml ghép với đuôi “-servlet“. Làm như thế sẽ là một cách chỉ thị để Spring tự động biết được đó là file có chứa các thông tin cấu hình và cần phải load lên trong quá trình khởi tạo lúc đầu. Trong ví dụ này, ta sử dụng thẻ context:component-scan để chỉ ra tên của package mà ở đó có chứa các controller của ứng dụng.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

	<context:annotation-config />
	<context:component-scan base-package="com.joseph" />

	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
		p:location="/WEB-INF/jdbc.properties" />

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
		p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" />
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation">
			<value>classpath:hibernate.cfg.xml</value>
		</property>
		<property name="configurationClass">
			<value>org.hibernate.cfg.AnnotationConfiguration</value>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${jdbc.dialect}</prop>
				<prop key="hibernate.show_sql">true</prop>
			</props>
		</property>
	</bean>
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
	<tx:annotation-driven />
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
</beans>

4. jdbc.properties

Hibernate có tác dụng tự động hóa quá trình kết nối và thao tác trên CSDL dựa vào những cấu trúc định nghĩa bằng file .xml để thực hiện việc tạo CSDL, bảng, các ràng buộc trên bảng, các quan hệ tham chiếu… có nghĩa là việc kết nối tới csdl khi dùng hibernate giúp người lập trình ít quan tâm hơn tới việc thao tác trên dữ liệu mà quan tâm tới những ràng buộc dữ liệu nhiều hơn, thông qua các annotation được định nghĩa, làm cho việc thao tác CSDL hướng đối tượng hoàn toàn. Tóm lại là dùng hibernate là dùng các file config và các lớp liên kết để tạo CSDL chứ không dùng tay hay lớp DAO như cách làm thông thường.

Để kết nối DB bằng Hibernate người ta sử dụng file cấu hình jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.databaseurl=jdbc:mysql://localhost:3306/studentdb
jdbc.username=root
jdbc.password=123456

#These configurations depends on your setup

Kết Luận

Các file config đóng vai trò rất quan trọng trong các ứng dụng, việc cấu hình file config sẽ giúp quản lý tốt hơn các thông số, cấu hình của ứng dụng. Thay vì khai báo ở rất nhiều nơi trong ứng dụng thì ta chỉ cần khai báo trong các file configs >> nâng cao hiệu suất quản lý ứng dụng.