Struts2:如何在Action类提供的列表中添加禁用的选项
我有一个struts2 Select字段,它从Action类中以键值对列表的形式获取选项 e、 g 公共列表getDataSetList { 添加(新的KeyValueElement(“选项1”、“选项1”); 添加(新的KeyValueElement(“选项2”,“选项2”)); 添加(新的KeyValueElement(“选项3”,“选项3”)); 添加(新的KeyValueElement(“选项4”、“选项4”); 返回数据集列表; } 注意:我没有详细介绍KeyValueElement,但它正在处理以下内容: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
<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规范禁用的字段将被提交到服务器。我想可能是这样的。这意味着我可能必须将另一个数组(或列表中的另一个属性)以及禁用哪些选项的信息传递给客户端,并手动禁用客户端上的选项。你有什么好的解决方案吗?!