我如何在JSP中构建struts2:select列表

How can I build struts2 s:select list in JSP

本文关键字:struts2 select 列表 构建 JSP      更新时间:2023-09-26

在struts2我有一些s:选择列表字段

<s:select name="oneObj" id="ddlOne" list="oneList" 
<s:select name="twoObj" id="ddlTwo" list="{'0A','0B','1C','1Z'}"
<s:select name="thrObj" id="ddlThr" list=???"

所以对于第一个,actionClass.getOneList()在服务器上被调用来填充列表,对于第二个列表是硬编码的。

我真正想要的是让第三个生成列表这个页面的JSP中。该列表将包含200个字符串,可以使用Java或javascript在循环中轻松构建为数组。我不想在Java中生成列表,并且有一个属性,getter, setter使我的操作类混乱,因为列表不是动态的,并且不是由服务器上的数据定义的(如one),我不想为200项使用{}的静态列表(如two)。

有什么办法可以做到吗?一个javascript变量可以被用作这个列表吗?可以在JSP中使用java代码来创建这个列表吗?

另外,我真正需要的是list的完整描述/语法。官方的struts2文档说

list : `Iterable` source to populate from. If the list is a Map (key, value), the Map key will become the option 'value' parameter and the Map value will become the option body.

没有显示任何list的语法。是否有其他文档描述struts标签/属性并使用", $, #, {来定义此列表?

有很多方法可以做到这一点:

  1. 在Action或BaseAction中使用包含静态类型列表的静态列表,然后将其注入页面(通过getter)。
  2. 使用静态方法
  3. 使用动态方法
  4. 既然你问了,你显然不能在定义Struts标记时使用Javascript,但是你可以在页面加载时启动Javascript,来改变生成的HTML选择对象。但这是昂贵的,不缓存,不同步,如果它打破,你的选择将不会被填充…这绝对是最糟糕的选择。

由于列表是静态的,并且永远不会更改,因此最好的选择是生成它一次,然后以静态方式将其包含在代码中。好吧,迭代数字到200不是什么大事,我们谈论的是纳秒,但如果你有百万用户,它可能更相关。每次这样做都是为了防止Java文件中有一个大的静态声明,这是愚蠢的……将它放在一个独立的文件中,并静态地使用它以避免使操作混乱(顺便说一句,这不是使JSP混乱的好理由)。

注意:你也可以使用带有min-max和s:set的迭代器来生成这个List,但是你会遇到和上面一样的问题,对每个用户来说都是一个无用的(潜在的)昂贵的操作。

编辑:

我猜你的意思是'静态'在Java '静态'变量。是的,我同意不变的列表最好是静态的,但我不希望这个列表在我的服务器代码。在另一个半相关的问题中,我提到(可能是由于结构不好——我继承了这个应用程序)这个列表在一个JSP中使用,但是3个操作类/对象需要它。如果列表在Java中,我需要所有这些类中的变量/setter/getter。这就是为什么我想在JSP中使用javascript或Java来实现它的原因。我也不想为这个定义超类。- user3708842 12 hours ago

什么是"动态"方法?我如何使用javascript来改变列表加载时?会读取struts生成的HTML并修改它吗?我可能不会使用它,但这是怎么做到的呢?最后,"把它放在一个独立的文件中,并静态地使用它来避免混乱的动作"-我怎么能避免属性/setter/getter在动作类?- user3708842 12 hours ago

我想你把整件事弄得太复杂了。只需要使用一个静态列表,故事就结束了。你不需要getter, setter或其他任何东西。你生成它一次,然后永远使用它。cpu开销为0。在类和jsp中。免费:)

你甚至不需要写一次,使用下面的代码来生成它:

StringBuffer sb = new StringBuffer();
sb.append("public final static List<String> myStaticList = java.util.Arrays.asList(");
for (int x=0;x<100;x++){
    sb.append("'""+x+"X'",");
}
for (int x=0;x<100;x++){
    sb.append("'""+x+"Y'"");
    sb.append(x<99 ? "," : ");");
}
System.out.println(sb);

最终将前十个X和Y数字的前导零相加。

复制输出,并把这些静态的东西放在某个地方,在你扩展(或不)的类中,在你实现(或不)的接口中,在枚举或静态嵌套类中,无论在哪里。如。在接口中(不应该这样使用,但谁在乎呢):

package foo.bar.package;    
interface iMyStaticStuff {
    public final static List<String> myStaticList = Arrays.asList("0X","1X","2X","3X","4X","5X","6X","7X","8X","9X","10X","11X","12X","13X","14X","15X","16X","17X","18X","19X","20X","21X","22X","23X","24X","25X","26X","27X","28X","29X","30X","31X","32X","33X","34X","35X","36X","37X","38X","39X","40X","41X","42X","43X","44X","45X","46X","47X","48X","49X","50X","51X","52X","53X","54X","55X","56X","57X","58X","59X","60X","61X","62X","63X","64X","65X","66X","67X","68X","69X","70X","71X","72X","73X","74X","75X","76X","77X","78X","79X","80X","81X","82X","83X","84X","85X","86X","87X","88X","89X","90X","91X","92X","93X","94X","95X","96X","97X","98X","99X","0Y","1Y","2Y","3Y","4Y","5Y","6Y","7Y","8Y","9Y","10Y","11Y","12Y","13Y","14Y","15Y","16Y","17Y","18Y","19Y","20Y","21Y","22Y","23Y","24Y","25Y","26Y","27Y","28Y","29Y","30Y","31Y","32Y","33Y","34Y","35Y","36Y","37Y","38Y","39Y","40Y","41Y","42Y","43Y","44Y","45Y","46Y","47Y","48Y","49Y","50Y","51Y","52Y","53Y","54Y","55Y","56Y","57Y","58Y","59Y","60Y","61Y","62Y","63Y","64Y","65Y","66Y","67Y","68Y","69Y","70Y","71Y","72Y","73Y","74Y","75Y","76Y","77Y","78Y","79Y","80Y","81Y","82Y","83Y","84Y","85Y","86Y","87Y","88Y","89Y","90Y","91Y","92Y","93Y","94Y","95Y","96Y","97Y","98Y","99Y");
    
}

在Java中使用:

public class Foo extends ActionSupport implements iMyStaticStuff{
    public String execute(){
        System.out.println(myStaticList);
        return SUCCESS;
    }       
}

和JSP

<s:select list="%{@foo.bar.package.iMyStaticStuff@myStaticList}" ... />