Tạo một ứng dụng Struts 2 mới

Trong bài viết này chúng ta sẽ cùng tạo một dự án Struts 2 mới dành cho những lập trình viên bắt đầu sử dụng Struts 2 lần đầu tiên.

Download Struts framwork từ http://struts.apache.org. Để tạo một ứng dụng mới chúng ta sẽ bắt đầu tạo một ứng dụng web từ đầu.

Tạo cấu trúc ứng dụng web  với các thư mục như sau. Ứng dụng web của chúng ta sẽ chạy trên Tomcat server

\MyStrutsFolder\
\MyStrutsFolder\META-INF\
\MyStrutsFolder\WEB-INF\
\MyStrutsFolder\WEB-INF\classes\
\MyStrutsFolder\WEB-INF\lib\

Sau đây là những file cơ bản nhất ta cần cho ứng dụng.

Copy các file sau từ thư mục \struts-2.0.11-all\struts-2.0.11\lib vào thư mục WEB_INF/lib của ứng dụng ta mới tạo:

struts2-core.jar
xwork.jar
ognl.jar
freemarker.jar
commons-logging.jar

Nếu bạn cần thêm plugin hoặc thư viện nào khác thì cũng copy vào thư mục WEB_INF/lib

Tạo file web.xml trong thư mục \WEB-INF như sau:

<?xml version="1.0"?>
<!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>
  <display-name>My Application</display-name>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

Tạo file struts.xml file trong thư mục \WEB-INF\classes như sau:

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts><!-- Configuration for the default package. -->
	<package name="default" extends="struts-default">
         ...
	</package>
</struts>

Ta đã có một ứng dụng Struts 2 bạn có thể bắt đầu viết code bằng việc thêm vào các file jsp, java ...etc

Các phương thức thường dùng của Session trong Hibernate

Vòng đời của Hibernate

Trong Hibernate một đối tượng có thể thuộc 3 trạng thái:

Transient: Đối tượng không có quan hệ với Session hiện tại của Hibernate.

Persistent: Đối tượng có quan hệ với Session hiện tại của Hibernate và trạng thái của nó được đồng bộ với cơ sở dữ liêu

Detache: Đối tượng đã từng có trạng thái persistent nhưng hiện tại đã không còn giữ quan hệ với Session.

Ở đây chúng ta nói một đối tượng có quan hệ với Session nghĩa là Session có tham chiếu đến đối tượng đó, hay một cách khác là chịu sự quản lý của Session (dùng tiếng Việt giải nghĩa kỹ thuật khó kinh khủng).

  • save() dùng để lưu một đối tượng với trạng thái transient thành đối tượng persistent, trả về id persist() giống save nhưng không trả về gì cả.
  • saveOrUpdate() nếu là đối tượng mới thì lưu xuống db, nếu không thì update xuống db, cái này sẽ select để kiểm tra trước khi save hoặc update
  • merge() kiểm tra xem có đối tương nào với id như thế tồn tại trong session không, nếu có thì update vào đối tượng đã tồn tại đó, nếu không thì tạo mới một đối tượng và save xuống
  • load() dùng để load một đối tượng từ database lên, nó sẽ có trạng thái persistent, throw exception nếu id không tồn tại
  • get() giống load(), trả về null nếu không tồn tại
  • refresh() refresh một đối tượng đang ở trạng thái persistent
  • delete() load đối tượng lên và xoá nó đi, nếu không muốn load lên thì dùng session.createQuery(“delete from user where …”).executeUpdate()
  • evict() tách một đối tượng ra khỏi session, biến nó từ trạng thái persistent thành transient
  • isDirty() kiểm tra xem session có sync với db không

Chú ý sự khác nhau giữa saveOrUpdate và merge
saveOrUpdate()
-Nếu đối tượng đã được persistent thì không làm gì cả
-Nếu có đối tượng khác được persistent với cùng id thì throw exception
-Nếu đối tượng không có id hoặc có id mới thì gọi save
-Trường hợp khác thì update (có id đã có trong db nhưng chưa được persistent)
merge()
-Nếu có đối tượng trong session với cùng id thì cập nhật giá trị từ thằng ngoài vào. Như vậy thằng ngoài vẫn detach.
-Nếu trong session không có đối tượng vào với cùng id như thế thì load lên từ db. Nếu load lên không có thì tạo đối tượng mới. Xong rồi cập nhật dữ liệu từ thằng ngoài vào thằng trong session.
-Đối tượng trả về ở trạng thái detach

Khác nhau giữa Struts 1 và Struts 2 phần 1

Trong bài viết dưới đây chúng ta sẽ cùng nhau so sánh những đặc tính quan trọng của Struts 2 so với Struts 1:

1. Phụ thuộc vào Servlet API
Các Action trong Struts 1 bị phụ thuộc vào servlet API bởi vì các đối tượng HttpServletRequest và HttpServletResponse được truyền vào phương thức execute của Action khi Action được thực thi. Trong trường hợp của Struts 2, Action chỉ là một class bình thường và chúng ta không cần truyền đối tượng HttpServletRequest và HttpServletResponse cho phương thức execute.

Do Struts 2 không phụ thuộc vào API của servlet nên chúng ta có thể dễ dàng test các Action mà không cần chạy chúng trong web container. Mặc dù vậy các Action của Struts 2 vẫn có cách để truy cập đến các đối tượng request và response khi cần.

2. Các lớp Action
Tư tưởng lập trình dựa trên việc extends từ class có sẵn chứ không phải dựa vào việc sử dụng interface chính là nhược điểm của Struts 1.
Action của Struts 1 được quy định phải extends một lớp abstract của Struts 1, trong khi đó trong Struts 2 Action của bạn có thể là bất kỳ một lớp Java nào.
Struts 2 cũng cung cấp một interface chung cho các Action là interface ActionSupport, tuy vậy việc implement interface này không bắt buộc.

3. Validate dữ liệu
Struts1 and Struts 2 both supports the manual validation via a validate method.
Cả Struts 1 và 2 đều hỗ trợ validate dữ liệu thông qua phương thức validate.
Struts 1 sử dụng phương thức validate dữ liệu trong class ActionForm, hoặc validate dựa vào thành phần mở rộng Common Validator. Struts 2 hỗ trợ validate bằng phương thức validate và sử dụng XWork Validation. XWORK Validation hỗ trợ việc validate dữ liệu bằng việc kết hợp một chuỗi các bộ validate và validate dữ liệu dựa vào kiểu của thuộc tính và ngữ cảnh.