Struts 2选择标记错误

时间:2012-12-14 03:29:59

标签: java jsp struts2 jstl

我是Struts2的新手。我想比较JSTL的c标记和Struts2 s标记哪个易于使用...我的代码如下

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标记可以正常工作。 我不明白为什么“1st”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]

即使我评论()“第二个”选择标记,我仍然得到与上面相同的错误信息,只删除它。

2 个答案:

答案 0 :(得分:0)

编辑:

我复制了你的整个代码,它完全有效。

请注意,您没有关闭</head>标签,我也复制了它并且它的工作原理相同...... 它应该是

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

您应该将ListDepNameService listDepNameService;声明为私有(您已经拥有访问者),并检查返回的List类型。

我用

测试了代码
    allDNlist = new ArrayList<String>();
    allDNlist.add("Valore 1 ");
    allDNlist.add("Valore 2 ");
    allDNlist.add("Valore 3 ");

在execute()方法中,这是唯一的区别。

请尝试使用此服务电话,并告诉我......

答案 1 :(得分:0)

在使用<s:select:标记填充下拉列表时,我遇到了类似的收集错误。经过研究,我发现&#34;我没有初始化我的实例变量List&#34;在您的情况下,make private List<String> allDNlist = new ArrayList<String>();应该可以解决问题。