مثال Struts 2 Hello World مع التعليقات وبدون ملف struts.xml

هذه هي المقالة الثانية في سلسلة البرامج التعليمية حول Struts 2. إذا كنت قد وصلت هنا مباشرةً، فأنا أوصي بالتحقق من المشاركة السابقة أيضًا. Struts 2 دليل المبتدئين في الدرس السابق، قمنا بالنظر إلى بنية Struts 2، ومكوناته، وبناء تطبيق ويب بسيط باستخدام التكوين المستند إلى XML (struts.xml). في هذا الدرس، سنرى كيف يمكننا تجنب ملف تكوين Struts تمامًا باستخدام التعليمات البرمجية أو التسميات بشكل كامل.

مفهوم تقليد Struts 2

يستخدم Struts 2 منهجيتين للعثور على فئات الإجراءات وفئات النتائج. نحتاج إلى استخدام واجهة برمجة التطبيقات struts2-convention-plugin لاستخدام أي من هاتين الطريقتين. إذا كان لديك تطبيق ويب عادي، يمكنك تنزيل ملف JAR الخاص به ووضعه في دليل مكتبة تطبيق الويب. بالنسبة لمشاريع Maven، يمكنك ببساطة إضافة تبعيته كما يلي.

<dependency>
	<groupId>org.apache.struts</groupId>
	<artifactId>struts2-convention-plugin</artifactId>
	<version>2.3.15.1</version>
</dependency>
  1. المسح الضوئي: في هذا الأسلوب ، نحدد الحزمة التي تحتاج إلى المسح للفصول العمل. يجب أن يتم التكوين في web.xml لفلتر Struts 2 ، كما هو موضح أدناه.

    <filter>
    	<filter-name>struts2</filter-name>
    	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    	<init-param>
    		<param-name>actionPackages</param-name>
    		<param-value>com.journaldev.struts2.actions</param-value>
    	</init-param>
    </filter>
    

    ستجد Struts 2 فصول العمل بواسطة الطرق التالية.

    • أي فئة معلن عنها بواسطة @Action أو @Actions.
    • أي فئة تنفذ واجهة العمل أو تمتد من فئة ActionSupport.
    • أي فئة ينتهي اسمها بـ Action وتحتوي على طريقة execute(). بالنسبة لهذه الفئات ، يتم استخدام تقليد التسمية لتحديد الإجراء والنتائج.
  2. التقليد في التسمية: ستقوم Struts 2 بإنشاء إجراء تلقائيًا للفئات التي تنتهي باسم Action. يتم تحديد اسم الإجراء عن طريق إزالة اللاحقة Action وتحويل الحرف الأول إلى صغير. لذلك ، إذا كان اسم الفئة هو HomeAction ، فسيكون الإجراء “home”. إذا لم يتم تحديد هذه الفئات بـ @Result لتوفير النتيجة ، فإن صفحات النتيجة تُبحث في دليل WEB-INF/content ويجب أن يكون الاسم {action}-{return_string}.jsp. لذا ، إذا كانت فئة الإجراء HomeAction تعيد “success” ، فسيتم توجيه الطلب إلى الصفحة WEB-INF/content/home-success.jsp. يمكن أن يكون استخدام التقليد في التسمية وحده مربكًا للغاية ولا يمكننا استخدام نفس صفحة JSP لفئات الإجراء الأخرى. لذا يجب أن نحاول تجنب هذا واستخدام تكوين قائم على التعليقات.

الآن نحن جاهزون لإنشاء تطبيق Hello World لـ Struts 2 الخاص بنا باستخدام التعليمات ولن يكون لدينا ملف تكوين Struts 2. قم بإنشاء مشروع ويب ديناميكي في Eclipse باسم Struts2AnnotationHelloWorld وتحويله إلى مشروع Maven. يبدو المشروع النهائي كما في الصورة أدناه.

تكوين Maven

لقد أضفنا تبعيات struts2-core و struts2-convention-plugin في ملف pom.xml، وهو الكود النهائي لـ 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>Struts2AnnotationHelloWorld</groupId>
	<artifactId>Struts2AnnotationHelloWorld</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>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-convention-plugin</artifactId>
			<version>2.3.15.1</version>
		</dependency>
	</dependencies>

	<build>
		<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>

تكوين وصف النشر

<?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"
	id="WebApp_ID" version="3.0">
	<display-name>Struts2AnnotationHelloWorld</display-name>

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
		<init-param>
			<param-name>actionPackages</param-name>
			<param-value>com.journaldev.struts2.actions</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

لاحظ عنصر init-param حيث نقوم بتوفير حزمة فئات الإجراء التي ستتم مسحها بواسطة الشرطات 2.

صفحات النتائج

لدينا ثلاث صفحات نتائج في تطبيقنا. 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>

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>

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>

الآن دعونا نقوم بإنشاء فئات الإجراء الخاصة بنا التي سنقوم بتعليقها لتكوين صفحات الإجراء والنتائج.

فئات الإجراء مع التعليقات

package com.journaldev.struts2.actions;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Namespaces;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

/**
 * An empty class for default Action implementation for:
 * 
 *  <action name="home">
 *		<result>/login.jsp</result>
 *	</action>
 * HomeAction class will be automatically mapped for home.action
 * Default page is login.jsp which will be served to client
 * @author pankaj
 *
 */

@Namespaces(value={@Namespace("/User"),@Namespace("/")})
@Result(location="/login.jsp")
@Actions(value={@Action(""),@Action("home")})
public class HomeAction extends ActionSupport {
}

لاحظ أن HomeAction هو فئة فارغة بغرض توجيه الطلب إلى صفحة login.jsp فقط.

package com.journaldev.struts2.actions;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Namespaces;
import org.apache.struts2.convention.annotation.Result;

/**
 * Notice the @Action annotation where action and result pages are declared
 * Also notice that we don't need to implement Action interface or extend ActionSupport
 * class, only we need is an execute() method with same signature
 * @author pankaj
 *
 */
@Action(value = "login", results = {
		@Result(name = "SUCCESS", location = "/welcome.jsp"),
		@Result(name = "ERROR", location = "/error.jsp") })
@Namespaces(value={@Namespace("/User"),@Namespace("/")})
public class LoginAction {

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

تنويه: لاحظ استخدام التعليقات @Action, @Actions, @Result, @Namespace و @Namespaces، الاستخدام يفسر نفسه. الآن عند تشغيل التطبيق، نحصل على صفحات الاستجابة التالية. إذا قرأت المنشور الأخير حيث قمنا بتطوير نفس التطبيق بتكوين struts.xml، ستلاحظ أنه تقريبًا متماثل. الفرق الوحيد هو الطريقة التي نربط بها فئات إجراء التطبيق وصفحات النتائج.

تحميل مشروع مثال Struts2 Annotations

Source:
https://www.digitalocean.com/community/tutorials/struts-2-hello-world-example-with-annotations-and-without-struts-xml-file