Hướng dẫn lập trình Struts2 cho người mới bắt đầu
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- Giới thiệu

Tài liệu được viết dựa trên:
  • Eclipse 4.6 (NEON)
  • Struts 2 (2.3.20)
Bạn đang xem hướng dẫn tạo ứng dụng Hello World Struts, sử dụng XML để cấu hình. Bạn có thể xem ví dụ tương tự sử dụng Annotation để cấu hình tại:

2- Tạo Maven Project

  • File/New/Other..
Nhập vào:
  • Group Id: org.o7planning
  • Artifact Id: Struts2Annotation
  • Package: org.o7planning.struts2annotation
Project đã được tạo ra, và có thông báo lỗi, bạn đừng lo lắng vì điều đó, lý do là bạn chưa khai báo thư viện Servlet.
Đây là hình ảnh Project sau khi hoàn thành:

3- Cấu hình Maven

Cấu hình Maven để khai báo các thư viện sử dụng. Gồm thư viện Servlet, Struts2.Đồng thời cấu hình Maven Tomcat Plugin dùng cho việc chạy ứng dụng web trực tiếp trên Eclipse.
pom.xml
<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/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>org.o7planning</groupId>
  <artifactId>Struts2Annotation</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>Struts2Annotation Maven Webapp</name>
 
  <url>http://maven.apache.org</url>
 
 
  <dependencies>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
      </dependency>



      <!-- Servlet Library -->
      <!-- http://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
      </dependency>


      <!-- http://mvnrepository.com/artifact/org.apache.struts/struts2-core -->
      <dependency>
          <groupId>org.apache.struts</groupId>
          <artifactId>struts2-core</artifactId>
          <version>2.3.20</version>
      </dependency>

      <!-- http://mvnrepository.com/artifact/org.apache.struts/struts2-convention-plugin -->
      <dependency>
          <groupId>org.apache.struts</groupId>
          <artifactId>struts2-convention-plugin</artifactId>
          <version>2.3.20</version>
      </dependency>

  </dependencies>


  <build>
      <finalName>Struts2Annotation</finalName>
      <plugins>

          <!-- Config: Maven Tomcat Plugin -->
          <!-- http://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin -->
          <plugin>
              <groupId>org.apache.tomcat.maven</groupId>
              <artifactId>tomcat7-maven-plugin</artifactId>
              <version>2.2</version>
              <!-- Config: contextPath and Port (Default: /Struts2Annotation : 8080) -->
              <!--
                  <configuration>
                      <path>/</path>
                      <port>8899</port>
                  </configuration>
                -->
          </plugin>


      </plugins>
  </build>

</project>

4- Cấu hình Struts & web.xml

Sử dụng servlet >= 3
web.xml
<?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"
     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>Struts2Annotation</display-name>


    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>

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

    <welcome-file-list>
        <welcome-file>/WEB-INF/pages/helloStruts2.jsp</welcome-file>
    </welcome-file-list>
    

</web-app>
struts.xml là một file resource nó cần được đặt trong src/main/resources, file này làm nhiệm vụ cấu hình struts.
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

   <constant name="struts.enable.DynamicMethodInvocation" value="false" />
   <constant name="struts.devMode" value="false" />
   <constant name="struts.custom.i18n.resources" value="ApplicationResources" />

</struts>

5- Code Project

ApplicationResources.properties
label.username= Username
label.password= Password
label.login= Login
error.login= Invalid Username/Password. Please try again.
helloStruts2.jsp
<html>
<head>
<title>Struts 2 - Hello World</title>
</head>

<body>

    <h2>Hello Struts2</h2>

</body>

</html>
login.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Struts 2 - Login Application </title>
</head>
 
<body>
<h2>Struts 2 - Login Application</h2>
<s:actionerror />

<s:form action="/login" method="post">
    <s:textfield name="username" key="label.username" size="20" />
    <s:password name="password" key="label.password" size="20" />
    <s:submit method="execute" key="label.login" align="center" />
</s:form>

</body>

</html>
userInfo.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>User Info</title>
</head>
 
<body>
    <h2>Howdy, <s:property value="username" />...!</h2>
</body>
</html>
HelloAction.java
package com.o7planning.struts2annotation.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

@Action(value = "hello", //
results = { //
        @Result(name = "helloPage", location = "/WEB-INF/pages/helloStruts2.jsp")
} //
)
public class HelloAction  extends ActionSupport {
 
    private static final long serialVersionUID = 1L;

    @Override
    public String execute() {
         
        return "helloPage";
    }
   
}
LoginAction.java
package com.o7planning.struts2annotation.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

@Action(value = "login", //
       results = { //
               @Result(name = "showForm", location = "/WEB-INF/pages/login.jsp"), //
               @Result(name = "loginSuccess", location = "/WEB-INF/pages/userInfo.jsp"), //
               @Result(name = "loginError", location = "/WEB-INF/pages/login.jsp") //
       } //
)
public class LoginAction extends ActionSupport {

   private static final long serialVersionUID = 7299264265184515893L;
   private String username;
   private String password;

   public LoginAction() {

   }

   @Override
   public String execute() {
       if (this.username == null && this.password == null) {
           return "showForm";
       }
   
       // User name và password hợp lệ.
       else if ("admin".equals(this.username) && "admin123".equals(this.password)) {
           return "loginSuccess";
       }
 
       // Username hoặc password không đúng
       else {
           // Xem trong ApplicationResources.properties
           String message= getText("error.login");
           
           addActionError(message);
           
           return "loginError";
       }
   }

   public String getUsername() {
       return username;
   }

   public void setUsername(String username) {
       this.username = username;
   }

   public String getPassword() {
       return password;
   }

   public void setPassword(String password) {
       this.password = password;
   }

}

6- Chạy ứng dụng

Để chạy ứng dụng trực tiếp trên Eclipse, bạn cần cấu hình chạy Tomcat Maven Plugin.
Nhập vào:
  • Name: Run Struts2Annotation
  • Base Directory: ${workspace_loc:/Struts2Annotation}
  • Goals: tomcat7:run
Tomcat Maven Plugin đã được chạy:
Trên trình duyệt, nhập vào đường dẫn:
Và URL:
Nếu bạn nhập vào Username/password không chính xác, trang sẽ hiển thị như hình minh họa dưới đây:
Trường hợp nhập đúng:

7- Nguyên tắc hoạt động của Struts 2 (Annotaion version)

Luồng đi của ứng dụng:
Câu hỏi đặt ra là nếu cấu hình các class Action trong struts.xml thì Struts còn dễ tìm, trong trường hợp ngược lại các class trong ứng dụng là rất nhiều. Struts dùng cách nào để tìm kiếm các class Action phù hợp với hành động của người dùng?
  1. Thư viện struts2-convention-plugin-*.jar làm nhiệm vụ tìm kiếm.
  2. Nó đọc vào struts2.xml để xem chỉ dẫn của bạn nếu có, ngược lại nó sẽ tìm theo chỉ dẫn mặc định của Struts.
  3. Mặc định:
    • Tìm kiếm các class có đuôi Action.
    • Tìm kiếm các class mà package có đuôi: action, actions, struts, struts2.
Như vậy các class Action bạn phải đặt tên theo quy tắc này, hoặc phải cấu hình quy tắc riêng của bạn trong struts.xml