Skip to content

3. مثال ۰۲ – تزریق پارامتر به اکشن

3.1. پروژه NetBeans

  • در [1,2]، فایل‌های پیکربندی
  • در [3]، اکشن
  • در [4]، نما
  • در [5]، کتابخانه‌های پروژه

3.2. فایل‌های پیکربندی

فایل [web.xml] به شرح زیر است:


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     version="3.0">
 
  <display-name>Struts tuto-001</display-name>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <URL-pattern>/*</URL-pattern>
  </filter-mapping>
  <session-config>
    <session-timeout>
            30
    </session-timeout>
  </session-config>
</web-app>

ما قبلاً این فایل را بررسی کرده‌ایم. دیگر این کار را انجام نخواهیم داد. فقط مهم است به خاطر داشته باشیم که این فایل تضمین می‌کند تمام URL (خط 15) از فیلتر Struts (خط 10) عبور داده شوند.

فایل [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>
 <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Action1</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="success">/vues/Action1.JSP</result>
    </action>
  </package>
</struts>
  • خطوط ۷–۱۵: بسته [default] را تعریف می‌کنند که در صورتی استفاده می‌شود که یک اکشن در بسته‌ای دیگر یافت نشود.
  • خط ۸: یک اکشن پیش‌فرض برای این بسته با نام index تعریف می‌کند.
  • خطوط ۹–۱۴: اقدام نام index را پیکربندی می‌کنند. می‌بینیم که با هیچ کلاسی مرتبط نیست (ویژگی class در خط ۹ وجود ندارد).
  • خط ۱۰: نتیجه برای کلید success است (ویژگی name وجود ندارد). نوع آن redirectAction (ویژگی type) است. این نوع اجازه می‌دهد یک اقدام به اقدامی دیگر هدایت شود. در اینجا، هنگامی که کلاینت اقدام /index را درخواست می‌کند، به اقدام /actions/Action1 هدایت خواهد شد (خطوط ۱۱–۱۲).
  • خطوط ۱۶–۲۰: تعریف بستهٔ اکشن‌ها (name) که با اکشن‌های URL و /actions/Action (class) مرتبط است.
  • خطوط 17–19: پیکربندی اکشن /actions/Action1 (name). هنگامی که این اکشن فراخوانی می‌شود، Struts کلاس actions.Action1 (class) را نمونه سازی می‌کند و سپس متد execute آن کلاس اجرا می‌شود. این متد باید کلید success را بازگرداند، زیرا این تنها کلیدی است که در خط ۱۸ تعریف شده است.
  • خط ۱۸: برای کلید success، نمای نمایش داده شده صفحه JSP [vues/Action1.JSP] خواهد بود.

در نهایت، باید توجه داشت که پروژه Struts فقط می‌تواند اقدام مربوط به URL [actions/Action1] را اجرا کند.

3.3. L'action

اقدام Action1 توسط کلاس زیر نمایش داده می‌شود:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // قالب اقدام
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // گیرنده و تنظیم‌کننده

  public String getParam1() {
    return param1;
  }

  public void setParam1(String param1) {
    this.param1 = param1;
  }

  public String getParam2() {
    return param2;
  }

  public void setParam2(String param2) {
    this.param2 = param2;
  }
  
}
  • خطوط ۸–۹: دو فیلد قابل دسترسی از طریق متدهای get/set (خطوط ۱۸–۳۲)
  • خطوط ۱۲–۱۴: متد execute کلید success را همان‌طور که انتظار می‌رود بازمی‌گرداند. هیچ کار دیگری انجام نمی‌دهد.

3.4. ویوی JSP

ویوی Action1.JSP به شرح زیر است:


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Action1</title>
  </head>
  <body>
    <h1>Action1</h1>
    param1=<s:property value="param1"/><br/>
    param2=<s:property value="param2"/><br/>
  </body>
</html>

این نما پس از اجرای متد [Action1].execute نمایش داده می‌شود. این نما مقادیر فیلدهای param1 (خط ۱۱) و param2 (خط ۱۹) از کلاس [Action1] را نمایش می‌دهد.

3.5. آزمایشی

بیایید پروژه [exemple-02] را اجرا کنیم:

  • در [1]، URL درخواست‌شده. توجه داشته باشید که URL درخواست اولیه بود که هیچ اقدامی انجام نداد. سپس از فایل‌های [web.xml] و [struts.xml] سوءاستفاده شد. مشاهده شد که فایل [web.xml] پردازش تمام درخواست‌ها را به Struts 2 واگذار کرده بود. سپس از فایل [struts.xml] سوءاستفاده شد:

<struts>
 <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Action1</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="success">/vues/Action1.JSP</result>
    </action>
  </package>
</struts>

فایل‌های URL و [/exemple-02] که هیچ اکشنی نداشتند، در خطوط ۲–۱۰ توسط بسته default پردازش شدند. از آنجا که در URL هیچ اقدامی وجود نداشت، اقدام به index تبدیل شد به دلیل خط ۳ (اقدام پیش‌فرض). خطوط ۴–۸ باعث شدند Struts یک هدایت URL را برای [/exemple-02/actions/Action1] به کلاینت بازگرداند، همان‌طور که در [1] نشان داده شده است.

اقدام [Action1] سپس همان‌طور که در خطوط ۱۲–۱۴ پیکربندی شده بود اجرا شد. متد execute آن اجرا شد. دیدیم که کد success را بازگردانده است. خط ۱۳ از [struts.xml] باعث شد صفحه [/vues/Action1.JSP] به مرورگر بازگردانده شود:


...
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Action1</title>
  </head>
  <body>
    <h1>Action1</h1>
    param1=<s:property value="param1"/><br/>
    param2=<s:property value="param2"/><br/>
  </body>
</html>

خطوط ۹ و ۱۰ مقادیر فیلدهای param1 و param2 را از [Action1] نمایش دادند. این در [2] نشان داده شده است.

بیایید یک URL دیگر درخواست کنیم:

در [1]، اکشن [Action1] با پارامترهای param1 و param2 درخواست می‌شود. بیایید به نمودار جریان اجرای یک اکشن Struts بازگردیم:

کنترل‌کننده [FilterDispatcher] متد اکشن execute را فراخوانی می‌کند. جریان اجرای کد از میان interceptors عبور می‌کند. یکی از این‌ها رشتهٔ پارامتر <span id="parametres-get" name="parametres-get" class="odt-bookmark-anchor"></span> param1=qqchose&param2=autrechose را پردازش می‌کند. سپس از متدهای setParam1 و setParam2 اکشن Action1 استفاده می‌کند:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  //مدل اقدام
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // گیرنده‌ها و تنظیم‌کننده‌ها

  public String getParam1() {
    return param1;
  }

  public void setParam1(String param1) {
    this.param1 = param1;
  }

  public String getParam2() {
    return param2;
  }

  public void setParam2(String param2) {
    this.param2 = param2;
  }
  
}

اینترسپتور params متدهای زیر را اجرا می‌کند:

[Action1].setParam1("qqchose") ;
[Action1].setParam2("autrechose") ;

بنابراین باید وجود داشته باشند. توجه به موارد زیر مهم است: برای بازیابی پارامترهای parami از یک درخواست HTTP، اکشن Struts فراخوانی‌شده باید فیلدهایی با همان نام‌های پارامترها و متدهای get/set مربوطه داشته باشد.

هنگامی که متد execute از [Action1] اجرا می‌شود، فیلدهای param1 و param2 توسط interceptor پارامترها مقداردهی اولیه شده‌اند:

param1="qqchose"
param2="autrechose"

متد execute کلید success را برمی‌گرداند، و صفحه [Action1.JSP] استبا مقادیر جدید برای param1، param2 و [2] نمایش داده شده است.