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



(很抱歉这篇文章太长了!!)

编辑:

这里的动态是指——>当下拉菜单的选择发生变化时,我希望其他下拉菜单的内容也发生变化。谢谢! !

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

我通过谷歌和一些书找到了一些解决方案,但其中大多数需要在jsp页面中编写大量脚本,这是我不想做的,因为我认为这不是一个好的做法。

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

我找到的一种方法是使用dojo。我实现了它,它的工作很好,除了两个问题:

  1. 这个动作在页面本身加载时被调用,即使任何下拉菜单的选择都没有改变。

  2. 下面的错误信息显示在有下拉菜单的表单的上方-> " error loading '/GetLists.htm' (500 Internal Server error)"

我想问的另一个问题是,这是否是实现动态填充下拉菜单的好方法。我的概念是避免脚本在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>

我建议是ether 1。从struts动作类中填充它。通过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中设置struts2常数。属性文件:

struts.ognl。allowStaticMethodAccess = true

你所需要的只是一个doubleselect标签。

最新更新