2

アクション クラスからキーと値のペアのリストとしてオプションを取得する struts2 Select フィールドがあります。

例えば

public List<KeyValueElement> getDataSetList
{
    dataSetList.add(new KeyValueElement("OPTION1", "Option 1"));
    dataSetList.add(new KeyValueElement("OPTION2", "Option 2"));
    dataSetList.add(new KeyValueElement("OPTION3", "Option 3"));
    dataSetList.add(new KeyValueElement("OPTION4", "Option 4"));
    return dataSetList;
}

注意: KeyValueElement の詳細には触れませんが、以下で動作しています。

    <s:select key="label.dataSet" name="dataSet" 
        list="dataSetList" listKey="key" listValue="value" 
        cssClass="formSelect" onchange="checkDataSet(this)" />

現在、私のクライアントは、条件に応じて、いくつかのオプションを無効にすることを望んでいます。

Struts2 で無効なオプションを追加するにはどうすればよいですか??? もちろん、このような操作は JavaScript などで簡単にできますが、Struts2 でサーバー側でできるかどうか知りたいです。

4

1 に答える 1

2

理解するのに丸一日かかりましたが、最終的にあなたが望むことを正確に行うことができました(私も同じ動作が必要でした)。

そのようなもので選択を定義できるようになりました:

<my:myselect key="label.dataSet" name="dataSet" 
    list="dataSetList" listKey="key" listValue="value" 
    cssClass="formSelect" onchange="checkDataSet(this)"
    listDisabled="disabled" />

「無効」が KeyValueElement オブジェクトの新しいプロパティであると仮定します。このプロパティを null または "" 以外に設定すると、オプションが無効になります。

基本的には、元の Struts の Select のサブクラス/コンポーネントを作成する必要があります。少なくとも次のファイルが必要です

MySelect.java

@StrutsTag(name = "myselect", tldTagClass = "ch.yotus.project.tags.MySelectTag", description = "Create a Select component with the possibility to disable options")
public class MySelect extends Select {

    final public static String TEMPLATE = "myselect";

    protected String listDisabled;

    public MySelect(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
        super(stack, request, response);
    }

    @Override
    protected String getDefaultTemplate() {
        return TEMPLATE;
    }

    @Override
    public void evaluateExtraParams() {
        super.evaluateExtraParams();

        if (listDisabled != null) {
            addParameter("listDisabled", findString(listDisabled));
        }
    }

    @StrutsTagAttribute(description = "Can be used to disable an option")
    public void setListDisabled(String listDisabled) {
        this.listDisabled = listDisabled;
    }
}

MySelectTag.java

public class MySelectTag extends SelectTag {

    private static final long serialVersionUID = 1L;

    protected String listDisabled;

    public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
        return new MySelect(stack, req, res);
    }

    @Override
    protected void populateParams() {
        super.populateParams();

        MySelect select = ((MySelect) component);
        select.setListDisabled(listDisabled);
    }

    public void setListDisabled(String listDisabled) {
        this.listDisabled = listDisabled;
    }
}

MySelectModel

public class MySelectModel extends TagModel {

    public MySelectModel(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
        super(stack, req, res);
    }

    @Override
    protected Component getBean() {
        return new MySelect(stack, req, res);
    }
}

次に、リソース フォルダーの Struts2 コア jar (template/simple/select.ftl) から元の select.ftl ファイルをコピーし、末尾近くに次のコードを追加する必要があります。

myselect.ftl

<@s.iterator value="parameters.list">
[Omitted code for reading purposes]
    <#if parameters.listTitle??>
        <#if stack.findString(parameters.listTitle)??>
          <#assign itemTitle= stack.findString(parameters.listTitle)/>
        <#else>
          <#assign itemTitle = ''/>
        </#if>
    </#if>
    <#if parameters.listDisabled??>
        <#if stack.findString(parameters.listDisabled)??>
          <#assign itemDisabled= stack.findString(parameters.listDisabled)/>
        <#else>
          <#assign itemDisabled = ''/>
        </#if>
    </#if>
<option value="${itemKeyStr?html}"<#rt/>
    <#if tag.contains(parameters.nameValue, itemKey) == true>
      selected="selected"<#rt/>
    </#if>
    <#if itemDisabled?if_exists != "">
      disabled="disabled"<#rt/>
    </#if>
    <#if itemCssClass?if_exists != "">
      class="${itemCssClass?html}"<#rt/>
    </#if>
    <#if itemCssStyle?if_exists != "">
       style="${itemCssStyle?html}"<#rt/>
    </#if>
    <#if itemTitle?if_exists != "">
       title="${itemTitle?html}"<#rt/>
    </#if>
  >${itemValue?html}</option><#lt/>
</@s.iterator>

追加する必要があるのは、「listDisabled」と「itemDisabled」が使用されている行です。十分に明確になることを願っています(既存のものを模倣するだけで、コードで強調表示することはできません)。

次に、project-tags.tld に新しいタグも追加します。

project-tags.tld

[Beginning of the file skipped]
    <tag>
        <name>myselect</name>
        <tag-class>ch.yotus.project.tags.MySelectTag</tag-class>
        <body-content>JSP</body-content>
        <description><![CDATA[Custom select that can disable options]]></description>
        <attribute>
            <name>listDisabled</name>
            <required>false</required>
            <rtexprvalue>false</rtexprvalue>
            <description><![CDATA[Value to output]]></description>
        </attribute>
        <attribute>
            <name>accesskey</name>
            <required>false</required>
            <rtexprvalue>false</rtexprvalue>
            <description><![CDATA[Set the html accesskey attribute on rendered html element]]></description>
        </attribute>
        [Other attributes from original tld skipped]
    </tag>

警告:元の選択タグのすべての属性が必要です(struts-core jar にあります)。これは、それらの特定が必要ない場合を除きます。

プロジェクトの TagLibProvider は、この新しいタグについても認識している必要があります。

ProjectTagLib.java

public class ProjectTagLib implements TagLibraryModelProvider {
    @Override
    public Object getModels(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
        return new ProjectModels(stack, req, res);
    }
}

ProjectModels.java

public class ProjectModels {

    protected ValueStack stack;
    protected HttpServletRequest req;
    protected HttpServletResponse res;

    protected MySelectModel mySelectModel;

    public ProjectModels(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
        this.stack = stack;
        this.req = req;
        this.res = res;
    }

    public MySelectModel getMySelectModel() {
        if (mySelectModel == null) {
            mySelectModel = new MySelectModel(stack, req, res);
        }
        return mySelectModel;
    }
}

最後に struts.xml で

struts.xml

<struts>
    [...]
    <bean type="org.apache.struts2.views.TagLibraryModelProvider" name="my" class="ch.yotus.project.tags.ProjectTagLib" />
    [...]
</struts>

taglib インクルード

<%@ taglib prefix="my" uri="/WEB-INF/base/project-tags/project-tags.tld" %>

これらが動作に必要なすべてのファイルであることを願っています。ただし、基本的な考え方は、「無効」を「」マークアップに追加できる独自の選択タグを作成することです。

于 2015-06-03T14:00:54.863 に答える