ברוך הבא למדריך של Struts למתחילים. Struts הוא אחד מהפרמטרים הישנים ביותר לבניית יישומי רשת Java.
מדריך Struts
Struts היה היישום הראשון של תבנית עיצוב MVC והתפתח הרבה יחד עם התקדמויות אחרונות בטכנולוגיות Java, Java EE. מאמר המדריך של Struts מיועד לספק פרטים בסיסיים על Struts 2 וכיצד ניתן ליצור את היישום הראשון שלנו ב- Struts 2 "שלום עולם".
Struts 2
Apache Struts 2 הוא מסגרת פתוחה, בתקנה, גמישה והרחבה לבניית יישומי רשת Java EE. Struts 2 מבוסס על המסגרת OpenSymphony WebWork. Struts 2 גמיש ביותר בקשר לפיתוח והגדרות, ונראה כמה פשוט הוא לפתח יישום רשת באמצעות מסגרת Struts 2.
תרשים ארכיטקטורת Struts 2
התרשים למטה מציג רכיבים שונים של Struts 2 ביישום אינטרנטי.
אינטרספטורים של Struts 2
האינטרספטורים של Struts כמו סינוני Servlet שמבצעים לפני ואחרי שהבקשה מעובדת. הם משמשים לביצוע פעולות נפוצות עבור פעולות שונות. לדוגמה, רישום, אימות סשן, הוספת כותרות נפוצות לתגובה וכו '
ערך ה-ValueStack ו-OGNL של Struts 2
אז יש לך את ValueStack, שטח אחסון בו מאוחסן מידע האפליקציה שלך על ידי Struts 2 לעיבוד בקשת לקוח. המידע מאוחסן באובייקטים ActionContext
המשתמשים ב־ThreadLocal כדי להכיל ערכים הקשורים ללשונית הבקשה המסוימת. שפת הביטויים שמשמשת לניהול נתונים על ValueStack היא Object-Graph Navigation Language (OGNL) – שפה עוזרת ופורצת דרך. כפי שניתן לראות בתרשים הארכיטקטורה, ה־interceptors ועמודי התוצאה יכולים לגשת לנתונים המאוחסנים ב־ValueStack באמצעות OGNL.
Struts 2 Action
רכיבי הפעולה של Struts 2 עוסקים בבקשות הלקוח. Struts 2 מספקת דרכים שונות ליצירת קבוצות פעולה.
- באמצעות המימוש של ממשק
com.opensymphony.xwork2.Action
. - באמצעות הרחבת המחלקה
com.opensymphony.xwork2.ActionSupport
. נהוג ליצירת מחלקות פעולה ריקות להעברת בקשה למשאב אחר. - בהערצת מחלקה עם @Action או @Actions אנוטציה.
- על פי התאמת הכללים לשמות מחלקות, השם צריך להסתיים ב־Action ולכלול את השיטה execute().
תוצאת Struts 2
רכיבי התוצאה הם בדרך כלל דפי JSP או HTML ליצירת תצוגה עבור תגובת הלקוח. Struts 2 מספקת תגים משלהם שאנו יכולים להשתמש בהם בדפי JSP כדי ליצור תגובה. התגי Struts הם דוגמה נהדרת ל-תגי מותאמים אישית של JSP.
ארכיטקטורה דקלרטיבית וחיבור של Struts 2
Struts 2 מספקת שתי דרכים להגדיר את היישום שלנו עבור מחלקות פעולה ודפי תוצאה.
- קובץ XML של Struts: יש לנו קובץ struts.xml בתיקיית WEB-INF/classes שבה אנו יכולים להגדיר את מחלקות הפעולה של היישום שלנו ודפי התוצאה.
- אנוטציה: אנו יכולים להשתמש ב-אנוטציות של Java כדי לספק מידע על מטא-נתונים בנוגע למחלקה. תוסף הקונבנציה של Struts 2 ניתן לשימוש כדי לסמן מחלקות Java עם האנוטציות @Action ו-@Result כדי ליצור הגדרת מחלקות פעולה ודפי תוצאה תואמים.
בכל הדרך שנשתמש בה להגדיר את היישום שלנו, התוצאה הסופית תהיה תמיד אותה.
מדריך Struts – Hello World יישום מבוסס על XML
נראה כיצד ניתן ליצור את היישום הראשון שלנו ב-Struts 2 Hello World. למעשה, כל מה שאנו צריכים הוא קבצי jar של Struts 2, הדרך הקלה ביותר היא להוריד אותם מדף ההורדות הרשמי של Struts 2. אבל כאשר תבדקו את הספריות בארכיון שהורדתם, תראו הרבה קבצי jar שאינם נחוצים ליישום הפשוט שלנו. לכן אני איצור פרויקט maven ואוסיף תלות רק ב-struts-core, כל קבצי התלות האחרים יורדו ויתווספו ליישום באופן אוטומטי. מבנה הפרויקט הסופי שלנו יהיה כמו בתמונה למטה. צור פרויקט רשת דינמי חדש בשם Struts2XMLHelloWorld ב- Eclipse ואז המירו אותו לפרויקט maven כמו בתמונה למטה.
תשימו לב שקובץ pom.xml נוסף בתיקיית השורש של הפרויקט. ההתקנה של הפרויקט ב- Eclipse מוכן, בואו נסתכל על הרכיבים השונים בסדר.
pom.xml
פתחו את קובץ pom.xml והוסיפו תלות ב-struts core, ה-pom.xml הסופי ייראה כמו בתמונה למטה.
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Struts2XMLHelloWorld</groupId>
<artifactId>Struts2XMLHelloWorld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.15.1</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project>
נודע לי שהתעלמתי מהקובץ ה-finalName
כדי למנוע הוספת מספר גרסה בזמן בניית ה-WAR ב-Maven. חלקים אחרים מתווספים באופן אוטומטי על ידי Eclipse עצמה. התלות היחידה שלנו היא ב־struts2-core, שגרסתה הנוכחית היא 2.3.15.1 (עד 10 בספטמבר 2013). רק עשה בניית Maven של היישום ותראה המון JARs שנוספים לתיקיית lib של היישום ומוצגים בחלק Maven Dependencies של הפרויקט, כמו בדימוי שלמטה.
תצורת web.xml של Struts 2
עלינו להוסיף את המסנן org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
ליישום האינטרנט ולספק את דפוס ה-URL שבו נרצה ש-Struts יטפל בבקשת הלקוח. קובץ ה- web.xml שלנו נראה כמו בדוגמה למטה;
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns="https://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Struts2XMLHelloWorld</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>
</web-app>
עבור Struts 2 גרסה נמוכה מ־2.1.3, ה- filter-class הייתה org.apache.struts2.dispatcher.FilterDispatcher
.
מדריך Struts – דפי תוצאה
יש לנו שלוש עמודי JSP שישמשו באפליקציה, אנו משתמשים בתגי Struts 2 כדי ליצור את עמודי ה-JSP שלנו. login.jsp
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<%-- Using Struts2 Tags in JSP --%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Login Page</title>
</head>
<body>
<h3>Welcome User, please login below</h3>
<s:form action="login">
<s:textfield name="name" label="User Name"></s:textfield>
<s:textfield name="pwd" label="Password" type="password"></s:textfield>
<s:submit value="Login"></s:submit>
</s:form>
</body>
</html>
שים לב לשמות שדות הטופס הם name ו- pwd, נראה כיצד הם משמשים בכיתות הפעולה. welcome.jsp
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Welcome Page</title>
</head>
<body>
<h3>Welcome <s:property value="name"></s:property></h3>
</body>
</html>
שים לב לתג ה-Struts s:property שאנו יכולים להשתמש בו כדי לקבל מאפייני בקשה, השם זהה לזה ב-login.jsp. error.jsp
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Error Page</title>
</head>
<body>
<h4>User Name or Password is wrong</h4>
<s:include value="login.jsp"></s:include>
</body>
</html>
זהו עמוד JSP פשוט שבו אנו מוסיפים הודעת שגיאה ומכלילים עמוד התחברות בתגובה.
מדריך Struts – כיתות פעולה
באפליקציה שלנו יש רק מחלקת פעולה אחת שבה אנו מיישמים את ממשק הפעולה של Struts 2. LoginAction.java
package com.journaldev.struts2.action;
import com.opensymphony.xwork2.Action;
public class LoginAction implements Action {
@Override
public String execute() throws Exception {
if("pankaj".equals(getName()) && "admin".equals(getPwd()))
return "SUCCESS";
else return "ERROR";
}
//בין פעולה כדי להחזיק את פרמטרי הטופס
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
שים לב שמחלקת הפעולה היא גם פעולת חוץ בעלת אותם משתנים כמו ב-login.jsp ואת שיטות הגטר והסטר שלהם. Struts יטפל במיפוי הפרמטרים של הבקשה למשתני מחלקת הפעולה.
מדריך Struts – קובץ הגדרות
מכיוון שאנו משתמשים בתצורת XML לקביעת החיבורים של היישום שלנו, עלינו ליצור קובץ תצורת Struts שצריך לקרוא struts.xml ולהיות בתיקייה WEB-INF/classes. struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"https://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="user" namespace="/User" extends="struts-default">
<action name="home">
<result>/login.jsp</result>
</action>
<action name="login" class="com.journaldev.struts2.action.LoginAction">
<result name="SUCCESS">/welcome.jsp</result>
<result name="ERROR">/error.jsp</result>
</action>
</package>
</struts>
עבור הפעולה "home", אין כיתת Action ורק תוצאה אחת, כך שהבקשה תועבר לעמוד login.jsp. עבור הפעולה "login", LoginAction היא כיתת הפעולה ואם השיטה execute() מחזירה "SUCCESS" הבקשה תעובד על ידי welcome.jsp ול"ERROR" תועבר לעמוד error.jsp. namespace=“/User” חשוב ומשמש בכתובות URL כדי לגשת לכיתות הפעולה, מסופק כדי ליצור מודולים שונים. לכן נוכל לגשת ליישום שלנו עם כתובת URL https://localhost:8080/Struts2XMLHelloWorld/User/home.action
. שים לב שה-URL מסתיים ב-.action שהוא הסיומת הברירת המחדלת עבור פעולת Struts 2 כמו .do עבור Struts 1.
מדריך Struts – מבוא לעולם של Struts 2
כאשר אנו מפעילים את היישום שלנו, אנו מקבלים את עמודי התגובה הבאים.
הורד דוגמאת פרויקט הקוד הפתוח של Struts2 Hello World
זהו כל המדריך למתחילים ב-Struts 2, בדוק את המאמר הבא בו אנו משתמשים באנוטציות כדי ליצור יישום אינטרנטי של Struts 2 ללא שימוש בקובץ התצורה struts.xml.
Source:
https://www.digitalocean.com/community/tutorials/struts-tutorial-for-beginners