java - 我怎样才能建立struts2 s :select list in JSP

标签 java javascript list jsp struts2

在 struts2 中我有一些 s:select 列表字段

<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() 来填充列表,而对于第二个,列表是硬编码的。

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

有什么办法吗?可以将 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 中使用静态列表,由其他人扩展,其中包含静态类型的列表,然后将其注入(inject)页面(通过 getter)。
  2. 使用静态方法
  3. 使用动态方法
  4. 既然你问了,你显然不能在定义 Struts 标记时使用 Javascript,但你可以在页面加载时启动 javascript,以改变生成的 HTML 选择对象。但这代价高昂,没有缓存,也没有同步,如果它中断,您的选择将不会被填充……这绝对是最糟糕的选择。

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

注意:您可能也可以通过使用带有 min-max 和 s:set 的迭代器来生成此列表,但是您会遇到与上述相同的问题,即对每个用户来说都是无用且(可能)代价高昂的操作。

编辑:

I'm guessing you mean 'static' as in a Java 'static' variable. Yes I agree that an unchanging list is better as static, but I do not want this list in my server code. In another semi-related question I mentioned that (probably due to poor structure - I inherited this application) this list is used in one JSP, but 3 action classes/objects need it. So if the list is in Java, I need variables/setter/getters in all of those classes. This is why I want to do it within the JSP, using javascript or Java somehow. And I'd rather not define a super class for this either. – user3708842 12 hours ago

What are 'dynamic' methods? And how can I use javascript to alter the list when loaded? Would that be reading the struts generated HTML and modifying it? I probably won't use it, but how is that done? Lastly 'put it in a stand alone file, and use it statically to avoid cluttering the action' - how can I avoid the attribute/setter/getter in the action classes? – user3708842 12 hours ago

我猜你把整个事情搞得太复杂了……只使用静态列表,故事结束。您不需要 getter、setter 或其他任何东西。您生成它一次,并永远使用它。 CPU 成本为 0。在类和 JSP 中。免费 :)

你甚至不需要写一次,使用a code like this生成它:

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 数字添加前导零。

复制输出,并将这些静态内容放在某个地方,在您扩展(或不扩展)的类中,在您实现(或不实现)的接口(interface)中,在枚举中或静态嵌套类中,无论在哪里。例如。在界面中(不应该那样使用,但谁在乎):

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}" ... />

关于java - 我怎样才能建立struts2 s :select list in JSP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24557138/

相关文章:

java - 使用 Java 8 的 Monad

javascript - 在数组范围内查找索引

python - 获取一个列表并返回有序对中的随机元素(必须是可变的)

java - 基于谁是被调用者的逻辑

java - JList 不显示为列表,只是一个点...也许是一个图形点?

javascript - jQuery 图像处理

javascript - 在 angularjs 中将对象保存到 JSON 文件?

python - 如何在不删除/更改原始元素及其值的情况下将列表/数组中元素的索引更改为另一个位置/索引

java - 将 Java 类转换为 List<List<String>> 以在表格中显示

java - OpenJPA、 Jersey 、JUnit : Using a different persistence unit for my unit tests?