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 ซ้ำกัน
เพื่อหลีกเลี่ยงปัญหานี้ขอแนะนำให้คุณสร้างคลาสที่มีผลลัพธ์ของผลลัพธ์