尝试动态填充jsp中的下拉菜单<select>时出现问题(使用struts 2框架)</select>

时间:2011-08-03 16:05:27

标签: struts2

(对不起帖子的长度!!)

编辑:

动态地我的意思是 - &gt;当选择下拉列表更改时,我希望其他下拉列表的内容也会发生变化。谢谢!

我正在尝试动态填充jsp中的下拉菜单(我想这是一个非常常见的问题)。我正在使用struts 2框架。

我通过谷歌搜索和一些书籍找到了一些解决方案,但大多数都需要在jsp页面中编写很多脚本,我不想这样做,因为我觉得这不是一个好习惯。

我希望找到一种方法,我可以通过onChange事件调用一个动作,其中所有的编码部分都可以完成(当然会使用一些脚本:))。

我找到的一种方法是使用dojo。除了2个问题外,我实现了它并且工作正常:

  1. 即使任何下拉列表的选择没有改变,也会在加载页面本身时调用该操作。

  2. 以下错误消息显示在具有下拉菜单的表单上方 - &gt; “加载'/GetLists.htm'时出错(500内部服务器错误)”。

  3. 我想问的另一个问题是,这是一种实现动态填充下拉的好方法。我的想法是在jsp页面上正确避免脚本。

    以下是编码:

    jsp页面:

    <s:form id="lists" action="viewDayReport">
        <s:url id="scriptURL" action="GetLists"/>
        <sd:div listenTopics="getLists" href="%{scriptURL}" formId="lists" showLoadingText="Working..."/>
        <s:select label="Customer " name="customer" headerKey="0" headerValue="Select" list="customerList" onchange="dojo.event.topic.publish('getLists');return false;"/>
        <s:select label="Contact "  name="contact"  headerKey="0" headerValue="Select" list="contactList"  onchange="dojo.event.topic.publish('getLists');return false;"/>
        <s:select label="Employee " name="employee" headerKey="0" headerValue="Select" list="employeeList" onchange="dojo.event.topic.publish('getLists');return false;"/>
        <s:select label="Stage "    name="stage"    headerKey="0" headerValue="Select" list="stageList"    onchange="dojo.event.topic.publish('getLists');return false;"/>
        <s:select label="Type "     name="type"     headerKey="0" headerValue="Select" list="typeList"     onchange="dojo.event.topic.publish('getLists');return false;"/>
        <sd:datetimepicker label="Date" name="date" displayFormat="dd/MM/yyyy" />
        <s:submit value="View Report(s)"/>
    </s:form>
    

    这是struts配置文件:

    <struts>
    <package name="Deutek.admin" extends="struts-default" >
        <result-types>
            <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
        </result-types>
        //this is the action that is executed when the page first loads. It populates the lists for drop downs
        <action name="dayReportPage" class="admin.dayReportAction">
            <result type="tiles">dayReport</result>
        </action>
        //this is the action that is executed when a drop down selection is changed. currently the action just prints some output.
        <action name="GetLists" class="admin.GetListsAction">
            <result type="tiles">dayReport</result>
        </action>
        </package>
    </struts>
    

2 个答案:

答案 0 :(得分:0)

我建议使用ether 1.从struts动作类中填充它或2.在jsp级别通过静态方法调用。

如果要在struts操作中设置列表,可以通过在操作中实现Preparable来实现:

public MyAction extends ActionSupport implements Preparable{
    private List customerList;

    public void prepare(){
        customerList= CustomersDAO.getCustomerList();
    }
    // Getters and Setters
}

然后你可以从jsp中获取列表:

<s:select label="Customer " name="customer" headerKey="0" headerValue="Select" 
    List="customerList"/>

要设置动态方法调用,您可以直接访问上一个示例中的CustomersDAO对象,如下所示:

<s:select label="Customer " name="customer" headerKey="0" headerValue="Select" 
    List="@com.mypackage.CustomersDAO@getCustomerList()"/>

要启用静态方法访问,请在struts.properties文件中设置struts2常量:

  

struts.ognl.allowStaticMethodAccess = true

答案 1 :(得分:0)