(很抱歉这篇文章太长了!!)
编辑:这里的动态是指——>当下拉菜单的选择发生变化时,我希望其他下拉菜单的内容也发生变化。谢谢! !
我试图动态填充下拉菜单在jsp(我想这是一个非常常见的问题)。我使用struts2框架。
我通过谷歌和一些书找到了一些解决方案,但其中大多数需要在jsp页面中编写大量脚本,这是我不想做的,因为我认为这不是一个好的做法。
我希望找到一种方法,我可以从一个onChange事件中调用一个动作,所有的编码部分都可以完成(当然一些脚本将被使用:))。
我找到的一种方法是使用dojo。我实现了它,它的工作很好,除了两个问题:
这个动作在页面本身加载时被调用,即使任何下拉菜单的选择都没有改变。
下面的错误信息显示在有下拉菜单的表单的上方-> " 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标签。