Struts 2 Ошибка выбора тега

Я новичок в 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;
}   
}

запрос.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 работает правильно. Я не понимаю, почему «1-й» тег выбора struts2 работает нормально, но «2-й» тег выбора 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]

даже если я прокомментирую () тег "2nd" select s, я все еще получаю то же сообщение об ошибке, что и выше, только удалите его.


person sony9154    schedule 14.12.2012    source источник
comment
Получаете ли вы значения для 1-го тега выбора?   -  person Thihara    schedule 14.12.2012
comment
Да, 1-й тег выбора работает без проблем и может получить правильный результат в раскрывающемся списке выбора.   -  person sony9154    schedule 14.12.2012
comment
Что произойдет, если вы поместите второй выбор в блок else?   -  person Thihara    schedule 14.12.2012
comment
Так же, как второй выбор, без ошибок.   -  person sony9154    schedule 14.12.2012
comment
Только кнопка отправки находится в форме.   -  person Dave Newton    schedule 14.12.2012


Ответы (2)


РЕДАКТИРОВАТЬ:

Я воспроизвел весь ваш код, и он отлично работает.

Обратите внимание, что вы не закрываете тег </head>, я тоже это воспроизвел, и он работает так же... Так и должно быть

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

Вы также должны объявить свой ListDepNameService listDepNameService; закрытым (у вас уже есть аксессоры) и проверить, какой тип списка возвращается.

Я тестировал код с

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

в методе execute() это единственная разница.

Пожалуйста, попробуйте это вместо звонка в службу поддержки и дайте мне знать...

person Andrea Ligios    schedule 14.12.2012
comment
Привет Андреа, спасибо за ответ. Первый тег выбора работает нормально, не создавая атрибут в классе действий. И я пытаюсь создать частный int xyz для второго тега выбора в классе действий и создать его геттер и сеттер, но все равно получил тот же результат сообщения об ошибке... - person sony9154; 15.12.2012

У меня была аналогичная ошибка сбора при заполнении раскрывающегося списка тегом <s:select:. после исследования я понял, что «я не инициализировал свой список переменных экземпляра» в вашем случае make private List<String> allDNlist = new ArrayList<String>(); должен решить проблему.

person Prasad Kamani    schedule 24.01.2015
comment
Я не уверен, что понимаю ответ. Попробуйте улучшить свой ответ, пожалуйста. - person gsamaras; 25.01.2015