Struts2:如何在Action类提供的列表中添加禁用的选项

Struts2:如何在Action类提供的列表中添加禁用的选项,struts2,arraylist,option,Struts2,Arraylist,Option,我有一个struts2 Select字段,它从Action类中以键值对列表的形式获取选项 e、 g 公共列表getDataSetList { 添加(新的KeyValueElement(“选项1”、“选项1”); 添加(新的KeyValueElement(“选项2”,“选项2”)); 添加(新的KeyValueElement(“选项3”,“选项3”)); 添加(新的KeyValueElement(“选项4”、“选项4”); 返回数据集列表; } 注意:我没有详细介绍KeyValueElement

我有一个struts2 Select字段,它从Action类中以键值对列表的形式获取选项

e、 g

公共列表getDataSetList { 添加(新的KeyValueElement(“选项1”、“选项1”); 添加(新的KeyValueElement(“选项2”,“选项2”)); 添加(新的KeyValueElement(“选项3”,“选项3”)); 添加(新的KeyValueElement(“选项4”、“选项4”); 返回数据集列表; } 注意:我没有详细介绍KeyValueElement,但它正在处理以下内容:

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

现在,我的客户希望根据条件禁用一些选项


如何在Struts2中添加禁用的选项???当然,我可以用JavaScript或其他技术轻松地完成这类操作,但我想知道我是否可以用Struts2在服务器端完成这类操作。

我花了一整天的时间才弄明白,但我最终还是做到了你想要的(我也需要同样的行为)

现在,我可以用如下内容定义select:

<my:myselect key="label.dataSet" name="dataSet" 
    list="dataSetList" listKey="key" listValue="value" 
    cssClass="formSelect" onchange="checkDataSet(this)"
    listDisabled="disabled" />
myselectag.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;
    }
}
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;
    }
}
public class ProjectTagLib implements TagLibraryModelProvider {
    @Override
    public Object getModels(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
        return new ProjectModels(stack, req, res);
    }
}
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;
    }
}
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);
    }
}
<@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>
<struts>
    [...]
    <bean type="org.apache.struts2.views.TagLibraryModelProvider" name="my" class="ch.yotus.project.tags.ProjectTagLib" />
    [...]
</struts>
然后,您需要从资源文件夹中的Struts2 core jar(template/simple/select.ftl)复制原始select.ftl文件,并在末尾添加以下代码:

myselect.ftl

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);
    }
}
<@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>
<struts>
    [...]
    <bean type="org.apache.struts2.views.TagLibraryModelProvider" name="my" class="ch.yotus.project.tags.ProjectTagLib" />
    [...]
</struts>
ProjectModels.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;
    }
}
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;
    }
}
public class ProjectTagLib implements TagLibraryModelProvider {
    @Override
    public Object getModels(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
        return new ProjectModels(stack, req, res);
    }
}
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

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);
    }
}
<@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>
<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" %>


我希望这些都是它工作所需要的文件。但基本思想是创建您自己的选择标记,该标记将能够将“禁用”添加到“”标记。

您所说的“禁用”选项是什么意思1@Yoichi:不,这不能在服务器端完成,您需要在UI上处理。请注意,根据HTML规范禁用的字段将被提交到服务器。我想可能是这样的。这意味着我可能必须将另一个数组(或列表中的另一个属性)以及禁用哪些选项的信息传递给客户端,并手动禁用客户端上的选项。你有什么好的解决方案吗?!