Struts 2 - Hành động

Actionslà cốt lõi của khung Struts2, vì chúng dành cho bất kỳ khung MVC (Model View Controller) nào. Mỗi URL được ánh xạ tới một hành động cụ thể, cung cấp logic xử lý cần thiết để phục vụ yêu cầu từ người dùng.

Nhưng hành động này cũng phục vụ trong hai năng lực quan trọng khác. Thứ nhất, hành động đóng một vai trò quan trọng trong việc chuyển dữ liệu từ yêu cầu đến chế độ xem, cho dù là JSP hay loại kết quả khác. Thứ hai, hành động phải hỗ trợ khung trong việc xác định kết quả nào sẽ hiển thị chế độ xem sẽ được trả lại trong phản hồi đối với yêu cầu.

Tạo hành động

Yêu cầu duy nhất cho các hành động trong Struts2là phải có một phương thức noargument trả về một đối tượng Chuỗi hoặc Kết quả và phải là một POJO. Nếu phương thức no-đối số không được chỉ định, thì hành vi mặc định là sử dụng phương thức execute ().

Tùy ý, bạn có thể mở rộng ActionSupport lớp triển khai sáu giao diện bao gồm Actiongiao diện. Giao diện Hành động như sau:

public interface Action {
   public static final String SUCCESS = "success";
   public static final String NONE = "none";
   public static final String ERROR = "error";
   public static final String INPUT = "input";
   public static final String LOGIN = "login";
   public String execute() throws Exception;
}

Chúng ta hãy xem xét phương pháp hành động trong ví dụ Hello World -

package com.tutorialspoint.struts2;

public class HelloWorldAction {
   private String name;

   public String execute() throws Exception {
      return "success";
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Để minh họa quan điểm rằng phương thức hành động kiểm soát chế độ xem, chúng ta hãy thực hiện thay đổi sau đối với execute và mở rộng lớp ActionSupport như sau:

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
   private String name;

   public String execute() throws Exception {
      if ("SECRET".equals(name)) {
         return SUCCESS;
      } else {
         return ERROR;  
      }
   }
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

Trong ví dụ này, chúng ta có một số logic trong phương thức thực thi để xem thuộc tính name. Nếu thuộc tính bằng với chuỗi"SECRET", chúng tôi trở lại SUCCESS kết quả là nếu không, chúng tôi trở lại ERRORkết quả là. Vì chúng tôi đã mở rộng ActionSupport, vì vậy chúng tôi có thể sử dụng hằng số ChuỗiSUCCESSvà ERROR. Bây giờ, hãy để chúng tôi sửa đổi tệp struts.xml của chúng tôi như sau:

<?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.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction"
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
   </package>
</struts>

Tạo chế độ xem

Hãy để chúng tôi tạo tệp jsp dưới đây HelloWorld.jsptrong thư mục WebContent trong dự án nhật thực của bạn. Để làm điều này, nhấp chuột phải vào thư mục WebContent trong trình khám phá dự án và chọnNew >JSP File. Tệp này sẽ được gọi trong trường hợp kết quả trả về là SUCCESS, là "thành công" của hằng chuỗi như được định nghĩa trong giao diện Hành động -

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Hello World, <s:property value = "name"/>
   </body>
</html>

Sau đây là tệp sẽ được gọi bởi khuôn khổ trong trường hợp kết quả hành động là LỖI, bằng với "lỗi" hằng chuỗi. Sau đây là nội dung củaAccessDenied.jsp

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>  
   <head>
      <title>Access Denied</title>
   </head>
   
   <body>
      You are not authorized to view this page.
   </body>
</html>

Chúng tôi cũng cần tạo index.jsptrong thư mục WebContent. Tệp này sẽ đóng vai trò là URL hành động ban đầu, nơi người dùng có thể nhấp vào để yêu cầu khung Struts 2 gọiexecutephương thức của lớp HelloWorldAction và hiển thị dạng xem HelloWorld.jsp.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>  
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

Vậy là xong, không cần thay đổi đối với tệp web.xml, vì vậy chúng ta hãy sử dụng cùng một web.xml mà chúng tôi đã tạo Exampleschương. Bây giờ, chúng tôi đã sẵn sàng chạyHello World ứng dụng sử dụng Struts 2 framework.

Thực thi ứng dụng

Nhấp chuột phải vào tên dự án và nhấp vào Export > WARTệp để tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Điều này sẽ cung cấp cho bạn màn hình sau:

Hãy để chúng tôi nhập một từ là "SECRET" và bạn sẽ thấy trang sau:

Bây giờ nhập bất kỳ từ nào khác ngoài "SECRET" và bạn sẽ thấy trang sau:

Tạo nhiều hành động

Bạn sẽ thường xuyên xác định nhiều hành động để xử lý các yêu cầu khác nhau và cung cấp các URL khác nhau cho người dùng, do đó bạn sẽ xác định các lớp khác nhau như được định nghĩa bên dưới -

package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;

class MyAction extends ActionSupport {
   public static String GOOD = SUCCESS;
   public static String BAD = ERROR;
}

public class HelloWorld extends ActionSupport {
   ...
   public String execute() {
      if ("SECRET".equals(name)) return MyAction.GOOD;
      return MyAction.BAD;
   }
   ...
}

public class SomeOtherClass extends ActionSupport {
   ...
   public String execute() {
      return MyAction.GOOD;
   }
   ...
}

Bạn sẽ cấu hình các hành động này trong tệp struts.xml như sau:

<?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.devMode" value = "true" />
   
   <package name = "helloworld" extends = "struts-default">
      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorld" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
      
      <action name = "something" 
         class = "com.tutorialspoint.struts2.SomeOtherClass" 
         method = "execute">
         <result name = "success">/Something.jsp</result>
         <result name = "error">/AccessDenied.jsp</result>
      </action>
   </package>
</struts>

Như bạn có thể thấy trong ví dụ giả định ở trên, kết quả hành động SUCCESSERROR’s được nhân đôi.

Để giải quyết vấn đề này, bạn nên tạo một lớp chứa các kết quả kết quả.