Struts2 <s:select>列表填充了jsp表达式</s:select>

时间:2015-04-21 12:37:31

标签: jsp struts2 ognl

我正在尝试使用地图为表单中的每个对象创建一个表单。 当我迭代思考地图时,它会识别它是否是文本字段或其他内容。我的问题始于<s:select/>

我必须填充地图中的所有数据,但是当我使用jsp表达式<%= %>来放置正确的密钥时,我无法获取列表。

MyAction.java

public class MyAction extends ActionSupport {
    private static final long serialVersionUID = 1219003996856257128L;

    private Map<String, Object> map = new HashMap<String, Object>();

    public Map<String, Object> getMap() {
        return map;
    }

    public String populate() {
        // get all attributes ... 
        // for each put data in map... 
        // in .jsp create txtfields / txtareas / checkboxes, depends on attribute type... 
        // <s:select /> not working
        // example with single attribute

        Attribute<?> attr = Attribute.getTestList();

        //map.put("testList", "prd");

        // 'testList' x 'prd'
        map.put(attr.getName(), attr.getValue());

        // when attribute is list, i will put into map it's List<String> (ArrayList<String>)
        // with all possible values
        // key is same as selected value's key with suffix '_data'
        if(attr.isList()) {

            //List<String> list = new ArrayList<String>();
            //list.add("---");
            //list.add("prd");
            //list.add("kak");
            //map.put("testList_data", list);

            // 'testList_data' x 'List<String> => {"---", "prd", "kak"}'
            map.put(attr.getName() + "_data", ((ListAttribute) attr).getPossibleValuesAsList());

        }
        return "fill";
    }

    public String execute() {
        return "result";
    }
}

page.jsp

<s:form id='form' action='submit' enctype='multipart/form-data' method='POST'>
    <!-- test list attribute, contains name, value and list of possible values -->
    <% 
    Attribute<?> attr = Attribute.getTestList();
    %>
    <!-- store input's name -->
    <s:set var='inputName'>map['<%= attr.getName() %>']</s:set>
    <%
        if(attr.isList()) {
    %>

    <!-- store input's list -->
    <s:set var='listData'>map['<%= attr.getName() + "_data" %>']</s:set>
    <!-- not working -->
    <s:select list='%{listData}' name="%{inputName}" />

    <!-- key filled manually - working, but useless for me -->
    <s:select list="map['testList_data']" name="%{inputName}" />
    <%
        }
     %>
    <sj:submit id='sumbitButton' value='AbrakaDabra' targets="myAjaxTarget"/>
</s:form>
<div id="myAjaxTarget"></div>

问题是当我尝试在<s:select/>标记中设置list属性时。我尝试了类似的方式,如名称(或ids或其他),但它没有用。

有谁知道为什么名称已填写且工作正常但列表不是?

s:select list='%{listData}' name="%{inputName}"

正如您在以下图像中看到的那样,首先选择只有一个(已损坏)选项。在第二张图片中,您可以看到我想要的理想结果,但我需要使用jsp表达式。

整体形式:

enter image description here

理想的结果:

enter image description here

1 个答案:

答案 0 :(得分:0)

避免使用Scriptlet,并尝试使用OGNL。

获得所需结果所需的代码应类似于以下内容:

<s:select list="map['%{#attr.attr.name}_data']" name="%{#attr.attr.name}" />