openplanning

Hướng dẫn lập trình Struts2 cho người mới bắt đầu (XML Config)

  1. Giới thiệu
  2. Tạo Maven Project
  3. Cấu hình Maven
  4. Cấu hình Struts & web.xml
  5. Code Project
  6. Luồng đi của chương trình
  7. Chạy ứng dụng

1. Giới thiệu

Tài liệu được viết dựa trên:
  • Eclipse 4.6
  • 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: Struts2XML
  • Package: org.o7planning.tutorial.struts2xml
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.
Maven tạo ra webapp project có thể sai cấu trúc bạn cần phải sửa lại.
Đâ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>Struts2XML</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>

    <name>Struts2XML 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>

        <!-- Jstl for jsp page -->
        <!-- http://mvnrepository.com/artifact/javax.servlet/jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>


        <!-- JSP API -->
        <!-- http://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</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>

    </dependencies>

    <build>
        <finalName>Struts2XML</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: /Struts2XML : 8080) -->
                <!--
                <configuration>
                  <path>/</path>
                  <port>8899</port>
                </configuration>
                -->
            </plugin>
        </plugins>
    </build>
    
</project>
Tới lúc này project của bạn đã không còn thông báo lỗi.

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

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>Struts2XML</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/Login.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="true" />
   <constant name="struts.custom.i18n.resources"
       value="ApplicationResources" />
 
   <package name="default" namespace="/" extends="struts-default">
       <action name="login"
           class="org.o7planning.tutorial.struts2xml.action.LoginAction">
           <result name="success" type="redirect">/userInfo</result>
           <result name="error">/WEB-INF/pages/Login.jsp</result>
       </action>
       
       <action name="userInfo"
           class="org.o7planning.tutorial.struts2xml.action.UserInfoAction">
           <result name="userInfoPage">/WEB-INF/pages/UserInfo.jsp</result>
       </action>
       
   </package>  
    
</struts>

5. Code Project

Tạo file ApplicationResources.properties trong src/main/resources:
ApplicationResources.properties
label.username= Username
label.password= Password
label.login= Login
error.login= Invalid Username/Password. Please try again.
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>

<br>
Username: admin, password: admin123

</body>
</html>
UserInfo.jsp
<%@ page contentType="text/html; charset=UTF-8"%>

<html>
<head>
<title>User Info</title>
</head>
 
<body>
    <h2>Hello, ${loginedUsername}...!</h2>
</body>
</html>
LoginAction.java
package org.o7planning.tutorial.struts2xml.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {

	private static final long serialVersionUID = 7299264265184515893L;

	private String username;
	private String password;

	@Override
	public String execute() {

		HttpServletRequest request = ServletActionContext.getRequest();

		if (this.username != null && this.password != null && this.username.equals("admin")
				&& this.password.equals("admin123")) {

			HttpSession session = request.getSession();
			
			// Lưu trữ userName vào trong trong session.
			session.setAttribute("loginedUsername", this.username);

			return "success";
		} else {
			addActionError(getText("error.login"));
			return "error";
		}
	}

	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;
	}
}
UserInfoAction.java
package org.o7planning.tutorial.struts2xml.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserInfoAction extends ActionSupport {

    private static final long serialVersionUID = 7299264265184515893L;
    
    
    @Override
    public String execute() {
    
        return "userInfoPage";
    }

 
}

6. Luồng đi của chương trình

Hình minh họa dưới đây mô tả luồng đi của chương trình từ khi người dùng truy cập trang cho tới khi Server đáp ứng lại yêu cầu.

    7. 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 Struts2XML
    • Base Directory: ${workspace_loc:/Struts2XML}
    • Goals: tomcat7:run
    Tomcat Maven Plugin đã được chạy
    Trên trình duyệt, nhập vào đường dẫn:
    Nếu bạn nhập sai username/password trang hiển thị sẽ như hình minh họa dưới đây:
    Trong trường hợp nhập đúng: