在jsp页面中,我在左侧和右侧之间有一个<s:optiontransferselect>
的交换值和一个要保存的提交按钮。
<s:optiontransferselect
allowUpDownOnLeft="false"
allowUpDownOnRight="false"
allowSelectAll="false"
allowAddAllToLeft="false"
allowAddAllToRight="false"
addToRightLabel="Go to right"
addToLeftLabel="Go to left"
leftTitle="Left side values"
headerKey="0"
name="option"
list= "optionList"
rightTitle="Right side values"
doubleHeaderKey="0"
doubleList="selectedOptionList"
doubleName="selectOption"
doubleId="selectedValues"
>
</s:optiontransferselect>
<s:submit />
我运行程序,它实际上可以保存右侧的值。但是它没有在那里显示保存的值。
我正在考虑使用javascript并在onchange
中使用<s:optiontransferselect>
事件来实现此目标
<script>
function show(){
var list = document.getElementById("selectedValues");
for (var i = 0; i < list.options.length; i++) {
//seems something not correct in this part but I am not sure how solve in this way
list.options[i].selected = true;
}
return true;
}
</script>
<s:optiontransferselect
allowUpDownOnLeft="false"
allowUpDownOnRight="false"
allowSelectAll="false"
allowAddAllToLeft="false"
allowAddAllToRight="false"
addToRightLabel="Go to right"
addToLeftLabel="Go to left"
leftTitle="Left side values"
headerKey="0"
name="option"
list= "optionList"
rightTitle="Right side values"
doubleHeaderKey="0"
doubleList="selectedOptionList"
doubleName="selectOption"
doubleId="selectedValues"
onchange ="show()"> <!-- onchange seems not work here -->
</s:optiontransferselect>
当我运行程序时,右侧仍然无法显示已保存的值。
有关optiontransferselect的更多信息,以防它有用。
我有一个动作类。
public class OptionTransferSelectAction extends ActionSupport {
private List<String> optionList;
private List<String> selectedOptionList;
//private String option;
private List<String> option;
private List<String> selectOption;
public OptionTransferSelectAction (){
optionList=new ArrayList<String>();
//display on the left side for selection
optionList.add("Section A");
optionList.add("Section B");
optionList.add("Section C");
optionList.add("Section D");
optionList.add("Section E");
optionList.add("Section F");
optionList.add("Section G");
optionList.add("Section H");
selectedOptionList=new ArrayList<String>();
//display on the right side
//pretend it does not have any values in the first time (does not
//trigger the save yet)
}
public List<String> getOptionList() {
return optionList;
}
public void setOptionList(List<String> optionList) {
this.optionList = optionList;
}
public List<String> getSelectedOptionList() {
return selectedOptionList;
}
public void setSelectedOptionList(List<String> selectedOptionList) {
this.selectedOptionList = selectedOptionList;
}
/*
public String getOption() {
return option;
}
public void setOption(String option) {
this.option = option;
}
*/
public List<String> getOption() {
return option;
}
public void setOption(List<String> option) {
this.option = option;
}
public List<String> getSelectOption() {
return selectOption;
}
public void setSelectOption(List<String> selectOption) {
this.selectOption = selectOption;
}
}
更新
我使用正确的getter和setter将选项从String
更改为List<String>
。我运行代码,optiontransferselect
仍然无法显示已保存的值。
我做错了哪一部分?有人会告诉我吗?谢谢。
更新 我创建了一个新的jsp,例如success.jsp。如果我选择了一些值来选择选项并单击提交按钮。 jsp文件可以显示我刚刚提交的值。我可以在数据库中看到保存的值。但是,optiontransferselect仍然无法显示已保存的值。
success.jsp有一个代码可以显示我刚刚提交的值。
Selected Value(s) : <s:property value="selectOption"/>
在数据库中,我可以看到保存的值,所以我想知道如何让optiontransferselect
显示保存的值?
另一次更新
我尝试使用按钮调用javascript函数以在提交之前显示selectedValues
。
<script>
function testshow()
{
var value = document.getElementById("selectedValues");
for(var i=0;i<value.options.length; i++)
{
alert(value.options[i].innerHTML);
}
return true;
}
</script>
//button to call the function
<s:submit onclick="return testshow()"/>
我运行程序,当我按下按钮时,它可以在提交之前显示所选的值,所以我仍然不明白为什么optiontransferselect
无法保存选定的值。
答案 0 :(得分:0)
我认为要解决您的问题,您需要了解两件事:
optiontransferselect
的实际工作原理。我从那个开始,因为这可能已经解决了您的问题。
? 为每个请求创建一个新的 Struts 操作实例。
这意味着当将属性 list
(左侧)和 doubleList
(右侧)连接到派生自 ActionSupport
的类中的字段时 - 如示例中的 {{1} }} 上面 - 你必须确保你用有意义的值初始化它,我的意思是反映你想要向用户显示的当前状态的值。在最坏的情况下,您必须每次请求时从数据库中获取值。
或者,您可以将 bean 注入具有专用生命周期的操作(例如会话范围)。我可能会在单独的帖子中列出。
(顺便说一句,如果其他人可以提供更多信息,如果 Struts 操作的生命周期可以直接更改,我将不胜感激)。
OptionTransferSelectAction
的工作原理此标签包含两个 select
标签(或更具体地说是 updownselect
标签)。我先把它的功能划出来,因为它让我们更好地理解optiontransferselect
。 (旁注:与 JSF 不同,Struts 清楚地区分了 get 和 set 操作的属性。)
要将 optiontransferselect
标签与基础数据连接起来,以下是三个相关属性:
select
- 这是所有可用值的列表(=get)。list
- 这是初始选择的值列表 (=get)。value
- 将在表单提交 (=set) 上提供 所选值 的操作属性(字段)的名称。因此,您的操作将获得的唯一属性是与 name
相关联的属性。 name
标签不会...
select
的值)回发到操作。list
和 list
的值。value
也是如此。这使得语义非常奇怪,因为一些更改(即哪些值显示在左边,哪些显示在右边)永远不会被回发到 Struts 操作中,您只能获取 selected 双方的价值观。
主要区别在于您现在拥有这三个属性两次:
optiontransferselect
代表左边,list
代表右边。doubleList
为左侧,value
为右侧。doubleValue
代表左边,name
代表右边。现在的问题是,您将只获得选定的值是怎么回事?我建议在提交前自动选择它们:
doubleName
其中<s:submit value="Save" onclick="selectAllOptions(document.getElementById('idLeft'));selectAllOptions(document.getElementById('idRight'));"/>
对应optiontransferselect中idLeft
的值,id
对应idRight
的值。通过该更改,您将分别获得 doubleId
和 name
中左右值的完整列表。
代码与使用 doubleName
获得的按钮完全相同,并且 JavaScript 方法 allowSelectAll="true"
由 Struts 通过 selectAllOptions
提供,无论 allowSelectAll 是真还是假.