Struts 2 - การดำเนินการ

Actionsเป็นแกนหลักของเฟรมเวิร์ก Struts2 เช่นเดียวกับเฟรมเวิร์ก MVC (Model View Controller) ใด ๆ URL แต่ละรายการถูกจับคู่กับการดำเนินการเฉพาะซึ่งจัดเตรียมตรรกะการประมวลผลซึ่งจำเป็นต่อการให้บริการคำขอจากผู้ใช้

แต่การกระทำนี้ยังทำหน้าที่ในความสามารถที่สำคัญอีกสองอย่าง ประการแรกการดำเนินการมีบทบาทสำคัญในการถ่ายโอนข้อมูลจากคำขอไปยังมุมมองไม่ว่าจะเป็น JSP หรือผลลัพธ์ประเภทอื่น ๆ ประการที่สองการดำเนินการต้องช่วยกรอบในการพิจารณาว่าผลลัพธ์ใดควรแสดงมุมมองที่จะถูกส่งกลับในการตอบสนองต่อคำขอ

สร้างการดำเนินการ

ข้อกำหนดเดียวสำหรับการดำเนินการใน Struts2คือต้องมีหนึ่งเมธอด noargument ที่ส่งคืนอ็อบเจ็กต์ String หรือ Result และต้องเป็น POJO หากไม่ได้ระบุวิธีการไม่มีอาร์กิวเมนต์ลักษณะการทำงานเริ่มต้นคือการใช้เมธอด execute ()

คุณสามารถเลือกขยายไฟล์ ActionSupport คลาสที่ใช้หกอินเทอร์เฟซรวมถึง Actionอินเตอร์เฟซ. อินเทอร์เฟซ Action มีดังนี้ -

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;
}

ลองมาดูวิธีการดำเนินการในตัวอย่าง 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;
   }
}

เพื่อแสดงให้เห็นจุดที่วิธีการดำเนินการควบคุมมุมมองให้เราทำการเปลี่ยนแปลงต่อไปนี้กับไฟล์ execute วิธีการและขยายคลาส ActionSupport ดังนี้ -

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;
   }
}

ในตัวอย่างนี้เรามีตรรกะในเมธอด execute เพื่อดูแอตทริบิวต์ name หากแอตทริบิวต์เท่ากับสตริง"SECRET"เรากลับมา SUCCESS เป็นผลลัพธ์มิฉะนั้นเราจะกลับมา ERRORดังผลลัพท์. เนื่องจากเราได้ขยาย ActionSupport ดังนั้นเราจึงสามารถใช้ค่าคงที่ของสตริงได้SUCCESSและข้อผิดพลาด ตอนนี้ให้เราแก้ไขไฟล์ 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.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>

สร้างมุมมอง

ให้เราสร้างไฟล์ jsp ด้านล่าง HelloWorld.jspในโฟลเดอร์ WebContent ในโปรเจ็กต์ eclipse ของคุณ ในการดำเนินการนี้ให้คลิกขวาที่โฟลเดอร์ WebContent ใน project explorer และเลือกNew >JSP File. ไฟล์นี้จะถูกเรียกในกรณีที่ผลตอบแทนคือ SUCCESS ซึ่งเป็นค่าคงที่ของสตริง "ความสำเร็จ" ตามที่กำหนดไว้ในอินเทอร์เฟซ Action -

<%@ 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>

ต่อไปนี้เป็นไฟล์ที่จะเรียกใช้โดยเฟรมเวิร์กในกรณีผลการดำเนินการคือ ERROR ซึ่งเท่ากับค่าคงที่สตริง "ข้อผิดพลาด" ต่อไปนี้เป็นเนื้อหาของAccessDenied.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>

เรายังต้องสร้าง index.jspในโฟลเดอร์ WebContent ไฟล์นี้จะทำหน้าที่เป็น URL การดำเนินการเริ่มต้นที่ผู้ใช้สามารถคลิกเพื่อบอกกรอบงาน Struts 2 เพื่อเรียกไฟล์executeวิธีการของคลาส HelloWorldAction และแสดงผลมุมมอง 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>

เพียงเท่านี้ไฟล์ web.xml ก็ไม่จำเป็นต้องเปลี่ยนแปลงดังนั้นให้เราใช้ web.xml เดียวกันกับที่เราสร้างไว้ Examplesบท. ตอนนี้เราพร้อมที่จะเรียกใช้Hello World แอพพลิเคชั่นโดยใช้ Struts 2 framework

ดำเนินการแอปพลิเคชัน

คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WARไฟล์สำหรับสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเร็กทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. ซึ่งจะแสดงหน้าจอต่อไปนี้ -

ให้เราป้อนคำว่า "SECRET" แล้วคุณจะเห็นหน้าต่อไปนี้ -

ตอนนี้ป้อนคำอื่น ๆ ที่ไม่ใช่ "ความลับ" และคุณจะเห็นหน้าต่อไปนี้ -

สร้างการดำเนินการหลายอย่าง

คุณมักจะกำหนดการดำเนินการมากกว่าหนึ่งรายการเพื่อจัดการคำขอที่แตกต่างกันและเพื่อจัดหา URL ที่แตกต่างกันให้กับผู้ใช้ดังนั้นคุณจะกำหนดคลาสต่างๆตามที่กำหนดไว้ด้านล่าง -

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;
   }
   ...
}

คุณจะกำหนดค่าการกระทำเหล่านี้ในไฟล์ 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.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>

ดังที่คุณเห็นในตัวอย่างสมมุติฐานข้างต้นผลลัพธ์ของการกระทำ SUCCESS และ ERROR’s ซ้ำกัน

เพื่อหลีกเลี่ยงปัญหานี้ขอแนะนำให้คุณสร้างคลาสที่มีผลลัพธ์ของผลลัพธ์