2012-12-14 72 views
1

我是Struts2的新手。我想比较JSTL的c标签和Struts2的s标签,它是一个易于使用的...我的代码如下Struts 2选择标记错误

ListDepartmentNameAction.java

package actions; 

import java.util.List; 
import org.apache.log4j.Logger; 
import org.hibernate.mapping.Array; 
import com.opensymphony.xwork2.ActionSupport; 
import service.ListDepNameService; 

public class ListDepartmentNameAction extends ActionSupport{ 

private static Logger log = Logger.getLogger(ListDepartmentNameAction.class); 
ListDepNameService listDepNameService; 
private List<String> allDNlist ; 

public String execute() { 

    allDNlist = listDepNameService.ListAllDepName(); 
    for (String ss : allDNlist) { 
     System.out.println(ss); 
    } 
    log.info(allDNlist); 
    return "success"; 

} 

public ListDepNameService getListDepNameService() { 
    return listDepNameService; 
} 

public void setListDepNameService(ListDepNameService listDepNameService) { 
    this.listDepNameService = listDepNameService; 
} 

public List<String> getAllDNlist() { 
    return allDNlist; 
} 

public void setAllDNlist(List<String> allDNlist) { 
    this.allDNlist = allDNlist; 
} 
} 

query.jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8" %> 
<%@ taglib prefix="s" uri="/struts-tags" %> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<html> 
    <head> 
    <s:head /> 
     <h1 align="center" id="h1"></h1> 
<body> 

    <s:form action="listDepName" id="form" method="post">     
     <input name="Button" type="submit" id="listsubmit" value="List all Department Name" 
     onclick="javascirpt:abc(this)"/>      
    </s:form> 

    <select> 
     <c:forEach items="${allDNlist}" var="item"> 
      <option value="abc" >${item}</option> 
     </c:forEach> 
    </select> 

    <s:if test="%{allDNlist==null}">456</s:if> 
    <s:else><s:select name="xxx" list="allDNlist" /></s:else> <!-- 1st --> 

    <s:select name="xyz" list="allDNlist" /> <!-- 2nd --> 

</body> 
</html> 

“allDNlist “可以从操作类获得价值,因此,JSTL c标签可以正常工作。 我不明白,为什么“第一” Struts2的选择标签做工精细,但“第二”选择s标签不工作,并得到了与此类似的消息

HTTP Status 500 - tag 'select', field 'list', name 'xyz': The requested list key 'allDNlist' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location] 

即使我评论()的“第二届”选择s标签,我仍然得到同样的错误信息,只能删除它。

+0

您是否获得了打印的第一个选择标签的值? – Thihara

+0

是的,第一个选择标签没有问题,可以在选择下拉框中得到正确的结果。 – HSY

+0

如果将第二个选择放入else块,会发生什么? – Thihara

回答

0

编辑:

我重现了你的整个代码,它是完美的工作。

请注意,您不关闭</head>标签,我转载,太多和它的作品一样... 应该

<head> 
    <s:head/> 
</head> 

你应该声明你ListDepNameService listDepNameService;为私有太(你已经有了访问器),并检查返回的List类型。

我在execute()方法测试的代码与

allDNlist = new ArrayList<String>(); 
    allDNlist.add("Valore 1 "); 
    allDNlist.add("Valore 2 "); 
    allDNlist.add("Valore 3 "); 

,这是唯一的区别。

请试试这个,而不是服务电话,让我知道...

+0

嗨安德烈,谢谢你的回复。第一个选择标签工作正常,但没有在动作类中创建属性。我尝试为动作类中的第二个选择标签创建“private int xyz”并生成它的getter和setter,但仍得到相同的错误消息结果... – HSY

0

我有相似类型的集合的错误,而与<s:select:标签填充下拉。经过研究,我发现“我没有初始化我的实例变量列表”在你的案例中使得private List<String> allDNlist = new ArrayList<String>();应该解决问题。

+0

我不知道我明白答案。请尝试改进你的答案。 – gsamaras