مرحبًا بكم في دليل تعليمي لـ Struts للمبتدئين. Struts هو واحد من أقدم الأطر لبناء تطبيقات الويب بلغة Java.
دليل Struts
تم تطوير Struts كتنفيذ أولي لنمط تصميم MVC وتطورت بشكل كبير مع أحدث التحسينات في تقنيات Java و Java EE. يهدف مقال دليل Struts إلى توفير التفاصيل الأساسية لـ Struts 2 وكيفية إنشاء أول تطبيق “Hello World” باستخدام Struts 2.
Struts 2
Apache Struts 2 هو إطار مفتوح المصدر ومعترف به في الصناعة ومرن وقابل للتوسيع لبناء تطبيقات الويب بلغة Java EE. يعتمد Struts 2 على إطار عمل OpenSymphony WebWork. يعتبر Struts 2 مرنًا جدًا من حيث التطوير والتكوينات وسنرى مدى سهولة تطوير تطبيق ويب باستخدام إطار Struts 2.
مخطط هندسة البرمجيات 2 للمسندات
يظهر الرسم البياني أدناه مكونات مختلفة من مسندات 2 في تطبيق ويب.
مسندات 2 التقاط
المسندات Struts مثل مرشحات سيرفليت التي تُنفذ قبل وبعد معالجة الطلب. يتم استخدامها لأداء العمليات الشائعة لإجراءات مختلفة. على سبيل المثال، تسجيل الدخول، التحقق من جلسة، إضافة رؤوس مشتركة إلى الاستجابة الخ.
قيمة مكدس Struts 2 و OGNL
مكدس القيم هو منطقة التخزين حيث يتم تخزين بيانات التطبيق بواسطة Struts 2 لمعالجة طلب العميل. يتم تخزين البيانات في كائنات ActionContext
التي تستخدم ThreadLocal للحصول على قيم محددة للخيط الذي يتعلق بالطلب الخاص. لغة تنقل الكائنات (OGNL) هي لغة تعبير قوية تُستخدم للتلاعب بالبيانات المخزنة على ValueStack. كما يمكن لكل من المعوقات وصفحات النتائج الوصول إلى البيانات المخزنة على ValueStack باستخدام OGNL، كما هو موضح في الرسم البياني للهندسة المعمارية.
Struts 2 Action
تتعامل مكونات Struts 2 Action مع طلبات العملاء. يوفر 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 طريقتين لتكوين تطبيقنا لفئات الإجراء وصفحات النتيجة.
- ملف Struts XML: لدينا ملف struts.xml في دليل WEB-INF/classes حيث يمكننا تكوين فئات الإجراء وصفحات النتيجة لتطبيقنا.
- التعليق: يمكننا استخدام التعليقات الجافا لتوفير معلومات التعريف الوصفية حول ف
بأي طريقة نستخدمها لتكوين تطبيقنا، سيكون النتيجة النهائية دائمًا هي نفسها.
برنامج تعليمي عن Struts – تطبيق Hello World XML
لنرى كيف يمكننا إنشاء تطبيق Hello World الأول الخاص بنا باستخدام Struts 2. أولاً وقبل كل شيء، نحتاج إلى ملفات JAR لـ Struts 2، وأسهل طريقة هي تنزيلها من صفحة التنزيلات الرسمية لـ Struts 2. ولكن عندما تتحقق من المكتبات في الأرشيف المُنزّل، سترى الكثير من ملفات JAR التي لا نحتاجها لتطبيقنا البسيط. لذا سأقوم بإنشاء مشروع Maven وإضافة تبعية struts-core فقط، وسيتم تنزيل جميع المكتبات التبعية الأخرى تلقائيًا وإضافتها إلى التطبيق. ستكون هيكلية مشروعنا النهائية كما هو موضح في الصورة أدناه. أنشئ مشروع ويب ديناميكي Dynamic Web Project بمسمى 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 وسترى العديد من الملفات الـ JAR التي تمت إضافتها لمجلد 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>
لاحظ علامة s:property في Struts التي يمكننا استخدامها للحصول على سمات الطلب، والاسم هو نفسه كما في 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 – فئات العمل
تطبيقنا لديه فقط فئة Action واحدة حيث نقوم بتنفيذ واجهة Struts 2 Action. 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>
للإجراء “الرئيسية” ، لا يوجد فئة Action ونتيجة واحدة فقط ، لذلك سيتم إعادة توجيه الطلب إلى صفحة login.jsp. بالنسبة للإجراء “تسجيل الدخول” ، فإن LoginAction هي فئة الإجراء وإذا كانت طريقة execute() ترجع “SUCCESS” ، فسيتم معالجة الطلب بواسطة welcome.jsp وبالنسبة لـ “ERROR” سيتم إعادة توجيهه إلى صفحة error.jsp. الفضاء الاسمي = “/ User” مهم ومستخدم في عنوان URL للوصول إلى فئات الإجراء ، ويتم توفيره لإنشاء وحدات مختلفة. لذا يمكننا الوصول إلى تطبيقنا بعنوان URL https://localhost:8080/Struts2XMLHelloWorld/User/home.action
. لاحظ أن عنوان URL ينتهي بـ .action وهو اللاحقة الافتراضية لإجراء Struts 2 مثل .do لـ Struts 1.
دليل Struts – Struts 2 اختبار Hello World
عند تشغيل تطبيقنا، نحصل على صفحات الاستجابة التالية.
تنزيل مثال مشروع مرحباً بالعالم لـ Struts2
هذا كل شيء بالنسبة لدروس مبتدئي Struts 2، تحقق من المقال التالي حيث نستخدم التعليقات لإنشاء تطبيق ويب Struts 2 بدون استخدام ملف تكوين struts.xml.
Source:
https://www.digitalocean.com/community/tutorials/struts-tutorial-for-beginners